diff --git a/.github/workflows/pr_test_build_linux.yml b/.github/workflows/pr_test_build_linux.yml index d009e32ed..36fb28a25 100644 --- a/.github/workflows/pr_test_build_linux.yml +++ b/.github/workflows/pr_test_build_linux.yml @@ -113,12 +113,15 @@ jobs: - name: Build monero_c run: | - mkdir -p scripts/monero_c - pushd scripts/monero_c - wget https://github.com/MrCyjaneK/monero_c/releases/download/v0.18.4.0-RC9/release-bundle.zip - unzip release-bundle.zip - rm release-bundle.zip - unxz -fv release/*/*.xz + ./scripts/prepare_moneroc.sh + mkdir -p scripts/monero_c/release + pushd scripts/monero_c/release + mkdir -p $(git describe --tags) + pushd $(git describe --tags) + wget https://github.com/MrCyjaneK/monero_c/releases/download/v0.18.4.6-RC1/release-bundle.zip + unzip release-bundle.zip + rm release-bundle.zip + popd popd - name: Execute Build and Setup Commands @@ -218,7 +221,7 @@ jobs: exec timeout --signal=SIGKILL 900 flutter drive --driver=test_driver/integration_test.dart --target=integration_test/test_suites/restore_wallet_through_seeds_flow_test.dart - name: Test [cw_monero] timeout-minutes: 15 - run: cd cw_monero && flutter test --verbose + run: cd cw_monero && flutter test - name: Stop screen recording, encrypt and upload if: always() run: | diff --git a/android/app/src/main/jniLibs/.gitignore b/android/app/src/main/jniLibs/.gitignore new file mode 100644 index 000000000..af6e91061 --- /dev/null +++ b/android/app/src/main/jniLibs/.gitignore @@ -0,0 +1 @@ +lib*_wallet2_api_c.so diff --git a/android/app/src/main/jniLibs/arm64-v8a/libmonero_libwallet2_api_c.so b/android/app/src/main/jniLibs/arm64-v8a/libmonero_libwallet2_api_c.so deleted file mode 120000 index 6cdcd70a2..000000000 --- a/android/app/src/main/jniLibs/arm64-v8a/libmonero_libwallet2_api_c.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../scripts/monero_c/release/monero/aarch64-linux-android_libwallet2_api_c.so \ No newline at end of file diff --git a/android/app/src/main/jniLibs/arm64-v8a/libwownero_libwallet2_api_c.so b/android/app/src/main/jniLibs/arm64-v8a/libwownero_libwallet2_api_c.so deleted file mode 120000 index 8f6150ee3..000000000 --- a/android/app/src/main/jniLibs/arm64-v8a/libwownero_libwallet2_api_c.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../scripts/monero_c/release/wownero/aarch64-linux-android_libwallet2_api_c.so \ No newline at end of file diff --git a/android/app/src/main/jniLibs/arm64-v8a/libzano_libwallet2_api_c.so b/android/app/src/main/jniLibs/arm64-v8a/libzano_libwallet2_api_c.so deleted file mode 120000 index 49ddd0f47..000000000 --- a/android/app/src/main/jniLibs/arm64-v8a/libzano_libwallet2_api_c.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../scripts/monero_c/release/zano/aarch64-linux-android_libwallet2_api_c.so \ No newline at end of file diff --git a/android/app/src/main/jniLibs/armeabi-v7a/libmonero_libwallet2_api_c.so b/android/app/src/main/jniLibs/armeabi-v7a/libmonero_libwallet2_api_c.so deleted file mode 120000 index c0d56dd3b..000000000 --- a/android/app/src/main/jniLibs/armeabi-v7a/libmonero_libwallet2_api_c.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../scripts/monero_c/release/monero/armv7a-linux-androideabi_libwallet2_api_c.so \ No newline at end of file diff --git a/android/app/src/main/jniLibs/armeabi-v7a/libwownero_libwallet2_api_c.so b/android/app/src/main/jniLibs/armeabi-v7a/libwownero_libwallet2_api_c.so deleted file mode 120000 index 5a71e87b1..000000000 --- a/android/app/src/main/jniLibs/armeabi-v7a/libwownero_libwallet2_api_c.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../scripts/monero_c/release/wownero/armv7a-linux-androideabi_libwallet2_api_c.so \ No newline at end of file diff --git a/android/app/src/main/jniLibs/armeabi-v7a/libzano_libwallet2_api_c.so b/android/app/src/main/jniLibs/armeabi-v7a/libzano_libwallet2_api_c.so deleted file mode 120000 index 43f9b98b2..000000000 --- a/android/app/src/main/jniLibs/armeabi-v7a/libzano_libwallet2_api_c.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../scripts/monero_c/release/zano/armv7a-linux-androideabi_libwallet2_api_c.so \ No newline at end of file diff --git a/android/app/src/main/jniLibs/x86_64/libmonero_libwallet2_api_c.so b/android/app/src/main/jniLibs/x86_64/libmonero_libwallet2_api_c.so deleted file mode 120000 index 654be50b9..000000000 --- a/android/app/src/main/jniLibs/x86_64/libmonero_libwallet2_api_c.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../scripts/monero_c/release/monero/x86_64-linux-android_libwallet2_api_c.so \ No newline at end of file diff --git a/android/app/src/main/jniLibs/x86_64/libwownero_libwallet2_api_c.so b/android/app/src/main/jniLibs/x86_64/libwownero_libwallet2_api_c.so deleted file mode 120000 index bb3da908f..000000000 --- a/android/app/src/main/jniLibs/x86_64/libwownero_libwallet2_api_c.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../scripts/monero_c/release/wownero/x86_64-linux-android_libwallet2_api_c.so \ No newline at end of file diff --git a/android/app/src/main/jniLibs/x86_64/libzano_libwallet2_api_c.so b/android/app/src/main/jniLibs/x86_64/libzano_libwallet2_api_c.so deleted file mode 120000 index 8c37d73c2..000000000 --- a/android/app/src/main/jniLibs/x86_64/libzano_libwallet2_api_c.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../scripts/monero_c/release/zano/x86_64-linux-android_libwallet2_api_c.so \ No newline at end of file diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 246188448..a75de4d4d 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -112,10 +112,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { ); } catch (e) { printV(e); - lightningWallet = null; } - } else { - lightningWallet = null; } payjoinManager = PayjoinManager(PayjoinStorage(payjoinBox), this); @@ -153,6 +150,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { lnurlDomain: "cake.cash", cachedAddress: cachedLightningAddress, ); + walletAddresses.setLightningAddress(walletInfo.name); } } else { lightningWallet = null; @@ -367,6 +365,18 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { await fetchBalances(); } }, + onCreateDepositTransactionEvent: (txs) async { + if (txs.isNotEmpty) { + transactionHistory.addMany(txs); + await transactionHistory.save(); + } + }, + onUpdateDepositTransactionEvent: (txs) async { + if (txs.isNotEmpty) { + txs.forEach((tx) => transactionHistory.transactions.remove(tx.id)); + await transactionHistory.save(); + } + }, onBalanceChangedEvent: fetchBalances, ); } @@ -390,7 +400,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { return super.fetchTransactions(); } - late LightningWallet? lightningWallet; + LightningWallet? lightningWallet; late final PayjoinManager payjoinManager; @@ -479,10 +489,9 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { final isLNCompatible = await lightningWallet?.isCompatible(lnAddr); if ((credentials.coinTypeToSpendFrom == UnspentCoinType.lightning && lightningWallet != null) || isLNCompatible == true) { - BigInt amount; if (credentials.outputs.first.sendAll) { - amount = (await lightningWallet!.getBalance()) - BigInt.from(10); + amount = await lightningWallet!.getBalance(); } else { amount = parseFixed( credentials.outputs.first.cryptoAmount?.isNotEmpty == true @@ -491,8 +500,8 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { 8); } - return lightningWallet!.createTransaction(lnAddr, - amount > BigInt.zero ? amount : null, credentials.priority); + return lightningWallet!.createTransaction(lnAddr, amount > BigInt.zero ? amount : null, + credentials.priority, credentials.outputs.first.sendAll); } final tx = (await super.createTransaction(credentials)) as PendingBitcoinTransaction; diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 15e0e02d7..0c3343856 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; +import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; @@ -807,10 +808,11 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { printV(username); rethrow; } - } catch (e) { - // make sure lightningAddress gets initialized anyway + } on SdkError_NetworkError catch (_) { + } on SdkError_SparkError catch (e) { + if (!e.field0.contains("dns")) rethrow; + } finally { lightningAddress ??= lightningWallet!.cachedAddress; - rethrow; } } } diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index 8f713b21a..12a28776b 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -137,17 +137,24 @@ class LightningWallet { .lightningAddress; } - Future getBolt11Invoice(BigInt? amount, String description) async { - final response = await sdk.receivePayment( - request: ReceivePaymentRequest( - paymentMethod: ReceivePaymentMethod.bolt11Invoice( - description: description, - amountSats: amount, + Future getBolt11Invoice(BigInt? amount, String description) async { + try { + final response = await sdk.receivePayment( + request: ReceivePaymentRequest( + paymentMethod: ReceivePaymentMethod.bolt11Invoice( + description: description, + amountSats: amount, + ), ), - ), - ); + ); - return response.paymentRequest; + return response.paymentRequest; + } on SdkError_NetworkError catch (_) { + return null; + } on SdkError_SparkError catch (e) { + if (!e.field0.contains("dns")) rethrow; + return null; + } } Future isCompatible(String input) async { @@ -162,12 +169,14 @@ class LightningWallet { } Future createTransaction( - String address, BigInt? amountSats, BitcoinTransactionPriority? priority) async { + String address, BigInt? amountSats, BitcoinTransactionPriority? priority, bool feesIncluded) async { final inputType = await sdk.parse(input: address); + final feePolicy = feesIncluded ? FeePolicy.feesIncluded : FeePolicy.feesExcluded; + if (inputType is InputType_Bolt11Invoice) { final request = PrepareSendPaymentRequest( - paymentRequest: inputType.field0.invoice.bolt11, amount: amountSats); + paymentRequest: inputType.field0.invoice.bolt11, amount: amountSats, feePolicy: feePolicy); final prepareResponse = await sdk.prepareSendPayment(request: request); final paymentMethod = prepareResponse.paymentMethod; @@ -177,7 +186,7 @@ class LightningWallet { return PendingLightningTransaction( id: paymentMethod.invoiceDetails.paymentHash, - amount: amountSats?.toInt() ?? + amount: request.amount?.toInt() ?? amountSats?.toInt() ?? ((paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(), fee: lightningFeeSats.toInt() + (sparkTransferFeeSats?.toInt() ?? 0), commitOverride: () async { @@ -203,12 +212,14 @@ class LightningWallet { amountSats: amountSats!, payRequest: inputType.field0.payRequest, validateSuccessActionUrl: optionalValidateSuccessActionUrl, + feePolicy: feePolicy, ); } else { request = PrepareLnurlPayRequest( amountSats: amountSats!, payRequest: (inputType as InputType_LnurlPay).field0, validateSuccessActionUrl: optionalValidateSuccessActionUrl, + feePolicy: feePolicy, ); } @@ -218,7 +229,7 @@ class LightningWallet { return PendingLightningTransaction( id: prepareResponse.invoiceDetails.paymentHash, - amount: ((prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(), + amount: prepareResponse.amountSats.toInt(), fee: feeSats.toInt(), commitOverride: () async { final res = @@ -227,8 +238,11 @@ class LightningWallet { }, ); } else if (inputType is InputType_BitcoinAddress) { - final request = - PrepareSendPaymentRequest(paymentRequest: inputType.field0.address, amount: amountSats); + final request = PrepareSendPaymentRequest( + paymentRequest: inputType.field0.address, + amount: amountSats, + feePolicy: feePolicy, + ); final prepareResponse = await sdk.prepareSendPayment(request: request); final paymentMethod = prepareResponse.paymentMethod; @@ -355,8 +369,12 @@ class LightningWallet { return response.txHex; } - void setEventListener( - {required Function(ElectrumTransactionInfo) onTransactionEvent, required Function onBalanceChangedEvent}) { + void setEventListener({ + required Function(ElectrumTransactionInfo) onTransactionEvent, + required Function onBalanceChangedEvent, + required Function(Map) onCreateDepositTransactionEvent, + required Function(List) onUpdateDepositTransactionEvent, + }) { _eventSubscription = _eventStream?.listen((sdkEvent) { if (sdkEvent is SdkEvent_PaymentSucceeded) { onTransactionEvent(_getElectrumTransactionInfoFromPayment(sdkEvent.payment)); @@ -364,6 +382,16 @@ class LightningWallet { onTransactionEvent(_getElectrumTransactionInfoFromPayment(sdkEvent.payment)); } else if (sdkEvent is SdkEvent_ClaimedDeposits) { onBalanceChangedEvent(); + onUpdateDepositTransactionEvent( + sdkEvent.claimedDeposits.map(_getElectrumTransactionInfoFromDepositInfo).toList()); + } else if (sdkEvent is SdkEvent_UnclaimedDeposits) { + final unclaimedDeposits = {}; + + for (final deposit in sdkEvent.unclaimedDeposits) { + unclaimedDeposits[deposit.txid] = _getElectrumTransactionInfoFromDepositInfo(deposit); + } + + onCreateDepositTransactionEvent(unclaimedDeposits); } }); } @@ -390,4 +418,18 @@ class LightningWallet { additionalInfo: {"isLightning": true}, ); } + + ElectrumTransactionInfo _getElectrumTransactionInfoFromDepositInfo(DepositInfo deposit) { + return ElectrumTransactionInfo( + WalletType.bitcoin, + id: deposit.txid, + amount: deposit.amountSats.toInt(), + direction: TransactionDirection.incoming, + isPending: true, + fee: 0, + date: DateTime.now(), + confirmations: 0, + additionalInfo: {"isLightning": true, "isSparkDeposit": true}, + ); + } } diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 147281a7b..737bd41f4 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -73,7 +73,8 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with return List.from(super.allAddresses)..addAll(mwebAddresses); } - Future ensureMwebAddressUpToIndexExists(int index) async { + Future ensureMwebAddressUpToIndexExists(int _index) async { + final index = _index + 1; if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { return null; } diff --git a/cw_monero/pubspec.lock b/cw_monero/pubspec.lock index 2d4bb12ee..6f6174d08 100644 --- a/cw_monero/pubspec.lock +++ b/cw_monero/pubspec.lock @@ -582,8 +582,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: "411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29" - resolved-ref: "411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29" + ref: bc8d1a0b75b97156d71579581b4cdfe58c777ed2 + resolved-ref: bc8d1a0b75b97156d71579581b4cdfe58c777ed2 url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_monero/pubspec.yaml b/cw_monero/pubspec.yaml index 3877032b8..7f38c0ea0 100644 --- a/cw_monero/pubspec.yaml +++ b/cw_monero/pubspec.yaml @@ -26,7 +26,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: 411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29 + ref: bc8d1a0b75b97156d71579581b4cdfe58c777ed2 path: impls/monero.dart mutex: ^3.1.0 ledger_flutter_plus: ^1.4.1 @@ -54,7 +54,6 @@ flutter: # be modified. They are used by the tooling to maintain consistency when # adding or updating assets for this project. - # To add assets to your plugin package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg diff --git a/cw_monero/test/monero_wallet_service_test.dart b/cw_monero/test/monero_wallet_service_test.dart index 780caea44..87cd0dbf4 100644 --- a/cw_monero/test/monero_wallet_service_test.dart +++ b/cw_monero/test/monero_wallet_service_test.dart @@ -18,7 +18,7 @@ import 'utils/setup_monero_c.dart'; Future main() async { group("MoneroWalletService Tests", () { late MoneroWalletService walletService; - late File moneroCBinary; + File? moneroCBinary; setUpAll(() async { await initDb(pathOverride: './test/data/db'); @@ -34,7 +34,7 @@ Future main() async { tearDownAll(() { Directory('./test/data').deleteSync(recursive: true); - moneroCBinary.deleteSync(); + moneroCBinary!.deleteSync(); }); group("Create wallet", () { diff --git a/cw_monero/test/utils/setup_monero_c.dart b/cw_monero/test/utils/setup_monero_c.dart index 1a0981000..20ae78d72 100644 --- a/cw_monero/test/utils/setup_monero_c.dart +++ b/cw_monero/test/utils/setup_monero_c.dart @@ -1,16 +1,27 @@ import 'dart:io'; +import 'package:path/path.dart' as p; File getMoneroCBinary() { - if (Platform.isWindows) - return File( - '../scripts/monero_c/release/monero/x86_64-w64-mingw32_libwallet2_api_c.dll'); - if (Platform.isMacOS) return File('../macos/monero_libwallet2_api_c.dylib'); - return File('../scripts/monero_c/release/monero/x86_64-linux-gnu_libwallet2_api_c.so'); + final baseDir = Directory('../scripts/monero_c/release'); + + final versionDir = + baseDir.listSync().whereType().map((d) => d.path).firstWhere( + (path) => p.basename(path).startsWith('v'), + ); + + if (Platform.isWindows) { + return File(p.join( + versionDir, 'x86_64-w64-mingw32', 'libmonero_wallet2_api_c.dll')); + } + if (Platform.isMacOS) { + return File(p.join(versionDir, 'macos', 'libmonero_wallet2_api_c.dylib')); + } + return File( + p.join(versionDir, 'x86_64-linux-gnu', 'libmonero_wallet2_api_c.so')); } String get moneroCBinaryName { - if (Platform.isWindows) - return "monero_libwallet2_api_c.dll"; - if (Platform.isMacOS) return "monero_libwallet2_api_c.dylib"; - return "/usr/lib/monero_libwallet2_api_c.so"; + if (Platform.isWindows) return "libmonero_wallet2_api_c.dll"; + if (Platform.isMacOS) return "libmonero_wallet2_api_c.dylib"; + return "/usr/lib/libmonero_wallet2_api_c.so"; } diff --git a/cw_wownero/pubspec.lock b/cw_wownero/pubspec.lock index e95c3b6c6..734af9338 100644 --- a/cw_wownero/pubspec.lock +++ b/cw_wownero/pubspec.lock @@ -502,8 +502,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: "411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29" - resolved-ref: "411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29" + ref: bc8d1a0b75b97156d71579581b4cdfe58c777ed2 + resolved-ref: bc8d1a0b75b97156d71579581b4cdfe58c777ed2 url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_wownero/pubspec.yaml b/cw_wownero/pubspec.yaml index 44657144f..a23fc3955 100644 --- a/cw_wownero/pubspec.yaml +++ b/cw_wownero/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: 411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29 # monero_c hash + ref: bc8d1a0b75b97156d71579581b4cdfe58c777ed2 # monero_c hash path: impls/monero.dart mutex: ^3.1.0 @@ -49,7 +49,6 @@ flutter: # be modified. They are used by the tooling to maintain consistency when # adding or updating assets for this project. - # To add assets to your plugin package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg diff --git a/cw_zano/pubspec.lock b/cw_zano/pubspec.lock index b18f0cfc4..662ccded6 100644 --- a/cw_zano/pubspec.lock +++ b/cw_zano/pubspec.lock @@ -507,8 +507,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: "411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29" - resolved-ref: "411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29" + ref: bc8d1a0b75b97156d71579581b4cdfe58c777ed2 + resolved-ref: bc8d1a0b75b97156d71579581b4cdfe58c777ed2 url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_zano/pubspec.yaml b/cw_zano/pubspec.yaml index 54091a850..8eb5d3e14 100644 --- a/cw_zano/pubspec.yaml +++ b/cw_zano/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: 411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29 # monero_c hash + ref: bc8d1a0b75b97156d71579581b4cdfe58c777ed2 # monero_c hash path: impls/monero.dart dev_dependencies: flutter_test: @@ -38,7 +38,6 @@ dev_dependencies: dependency_overrides: watcher: ^1.1.0 - # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/lib/core/amount_validator.dart b/lib/core/amount_validator.dart index d056ad0c5..dfa999932 100644 --- a/lib/core/amount_validator.dart +++ b/lib/core/amount_validator.dart @@ -65,7 +65,7 @@ class SymbolsAmountValidator extends TextValidator { maxLength: 0, ); - static String _pattern() => '^([0-9]+([.\,][0-9]+)?|[.\,][0-9]+)\$'; + static String _pattern() => r'^(?:\d+(?:[.\,]\d+)?|[.\,]\d+)$'; } class DecimalAmountValidator extends TextValidator { diff --git a/lib/entities/lnurlpay_record.dart b/lib/entities/lnurlpay_record.dart index c6e9788a5..35fec0d51 100644 --- a/lib/entities/lnurlpay_record.dart +++ b/lib/entities/lnurlpay_record.dart @@ -12,7 +12,8 @@ class LNUrlPayRecord { final String name; final String address; - static Future checkWellKnownUsername(String username, CryptoCurrency currency) async { + static Future checkWellKnownUsername(String username, CryptoCurrency currency, + {bool allowRethrow = false}) async { if (![CryptoCurrency.btc, CryptoCurrency.btcln].contains(currency)) return null; // split the string by the @ symbol: @@ -40,6 +41,7 @@ class LNUrlPayRecord { return LNURL.encode(expectedUrl); } } catch (e) { + if (allowRethrow) rethrow; printV("error checking well-known username: $e"); } return null; diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index 5abda9da8..9e30e2eb8 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -136,4 +136,5 @@ class PreferencesKey { static const syncStatusDisplayMode = 'sync_status_display_mode'; static const backgroundImage = 'background_image'; static const mwebAdDismissed = "mweb_ad_dismissed"; + static const balanceHideCounter = "balance_hide_counter"; } diff --git a/lib/new-ui/pages/home_page.dart b/lib/new-ui/pages/home_page.dart index c4fedb630..be30e72bf 100644 --- a/lib/new-ui/pages/home_page.dart +++ b/lib/new-ui/pages/home_page.dart @@ -1,5 +1,6 @@ import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/di.dart'; +import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/new-ui/modal_navigator.dart'; import 'package:cake_wallet/new-ui/pages/account_customizer.dart'; import 'package:cake_wallet/new-ui/pages/card_customizer.dart'; @@ -129,7 +130,29 @@ class _NewHomePageState extends State { lightningMode: _lightningMode, ), ), - UnconfirmedBalanceWidget(dashboardViewModel: widget.dashboardViewModel,), + Observer(builder: (_) { + return AnimatedSize( + duration: Duration(milliseconds: 150), + curve: Curves.easeInOutCubic, + child: (widget.dashboardViewModel.shouldShowBalanceHiddenMessage) + ? Column( + children: [ + SizedBox( + height: 12, + width: double.infinity, + ), + Text( + S.of(context).long_press_show_balance, + style: TextStyle( + color: + Theme.of(context).colorScheme.onSurfaceVariant), + ) + ], + ) + : SizedBox(width: double.infinity), + ); + }), + UnconfirmedBalanceWidget(dashboardViewModel: widget.dashboardViewModel,), ], ), Observer( diff --git a/lib/new-ui/pages/send_page.dart b/lib/new-ui/pages/send_page.dart index 90ec32796..b27bf8293 100644 --- a/lib/new-ui/pages/send_page.dart +++ b/lib/new-ui/pages/send_page.dart @@ -691,12 +691,15 @@ class _NewSendPageState extends State { void _handleSend() async { //TODO refactor this action. code was copied over from old ui. i don't like it. - for(int i=0; i { Widget build(BuildContext context) { return DraggableScrollableSheet( expand: false, - initialChildSize: 0.6, + initialChildSize: 0.9, minChildSize: 0.25, maxChildSize: 0.9, snap: true, - snapSizes: const [0.6, 0.9], + snapSizes: const [0.9], builder: (context, controller) => SafeArea( bottom: false, child: Padding( diff --git a/lib/new-ui/widgets/send_page/send_amount_input.dart b/lib/new-ui/widgets/send_page/send_amount_input.dart index 178b316d6..99b25c39f 100644 --- a/lib/new-ui/widgets/send_page/send_amount_input.dart +++ b/lib/new-ui/widgets/send_page/send_amount_input.dart @@ -3,7 +3,6 @@ import 'package:cake_wallet/src/widgets/cake_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:flutter_svg/flutter_svg.dart'; class NewSendAmountInput extends StatefulWidget { const NewSendAmountInput( @@ -66,7 +65,7 @@ class _NewSendAmountInputState extends State { keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true), inputFormatters: [ - FilteringTextInputFormatter.allow(RegExp(r'^\d*\.?\d*$')) + FilteringTextInputFormatter.allow(RegExp(r'^\d*[.,]?\d*$')) ], onChanged: state.didChange, controller: widget.amountController, diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index ab1dd71d3..fb14beae4 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -143,6 +143,7 @@ abstract class SettingsStoreBase with Store { required this.hasEnabledMwebBefore, required this.mwebNodeUri, required this.mwebAdDismissed, + required this.balanceHideCounter, required bool initialEnableAutomaticNodeSwitching, required String initialBackgroundImage, TransactionPriority? initialBitcoinTransactionPriority, @@ -720,6 +721,11 @@ abstract class SettingsStoreBase with Store { PreferencesKey.decentralizedExchangesPromptDismissed, decentralizedExchangesPromptDismissed)); + reaction( + (_) => balanceHideCounter, + (int balanceHideCounter) => _sharedPreferences.setInt(PreferencesKey.balanceHideCounter, balanceHideCounter) + ); + this.nodes.observe((change) { if (change.newValue != null && change.key != null) { _saveCurrentNode(change.newValue!, change.key!); @@ -773,6 +779,9 @@ abstract class SettingsStoreBase with Store { @observable BalanceDisplayMode balanceDisplayMode; + @observable + int balanceHideCounter; + @observable BitcoinAmountDisplayMode displayAmountsInSatoshi; @@ -1552,6 +1561,8 @@ abstract class SettingsStoreBase with Store { final mwebAdDismissed = await sharedPreferences.getBool(PreferencesKey.mwebAdDismissed) ?? false; + + final balanceHideCounter = await sharedPreferences.getInt(PreferencesKey.balanceHideCounter) ?? 0; return SettingsStore( secureStorage: secureStorage, @@ -1663,6 +1674,7 @@ abstract class SettingsStoreBase with Store { shouldShowRepWarning: shouldShowRepWarning, initialBuiltinTor: builtinTor, mwebAdDismissed: mwebAdDismissed, + balanceHideCounter: balanceHideCounter, ); } diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart index 9711fdf17..9bee1704e 100644 --- a/lib/utils/exception_handler.dart +++ b/lib/utils/exception_handler.dart @@ -301,7 +301,8 @@ class ExceptionHandler { "_QueuedFuture.execute (package:universal_ble/src/queue.dart:65)", "reown_core/relay_client/websocket/websocket_handler.dart", "Image upload failed due to loss of GPU access", - 'transport error', + "transport error", + "SdkError.sparkError(field0: Operator RPC error: Connection error: status: Unavailable, message: \"dns error\", details: []" ]; static Future _addDeviceInfo(File file) async { diff --git a/lib/view_model/dashboard/balance_view_model.dart b/lib/view_model/dashboard/balance_view_model.dart index 8dc57f4fb..b51a0bc15 100644 --- a/lib/view_model/dashboard/balance_view_model.dart +++ b/lib/view_model/dashboard/balance_view_model.dart @@ -445,6 +445,7 @@ abstract class BalanceViewModelBase with Store { void switchBalanceValue() { if (settingsStore.balanceDisplayMode == BalanceDisplayMode.displayableBalance) { settingsStore.balanceDisplayMode = BalanceDisplayMode.hiddenBalance; + settingsStore.balanceHideCounter++; } else { settingsStore.balanceDisplayMode = BalanceDisplayMode.displayableBalance; } diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index acc7b9f90..9a3d1f54a 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -632,6 +632,9 @@ abstract class DashboardViewModelBase with Store { return trade.trade.walletId == wallet.id && isSameChain; }).toList(); + @computed + bool get shouldShowBalanceHiddenMessage => balanceDisplayMode == BalanceDisplayMode.hiddenBalance && appStore.settingsStore.balanceHideCounter < 10; + @computed List get orders => ordersStore.orders.where((item) => item.order.walletId == wallet.id).toList(); diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 2356c844b..7a45c054b 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -113,14 +113,37 @@ else() set(LIB_TRIPLET "x86_64-linux-gnu") endif() -install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/zcash_lib/target/release/libwarp_api_ffi.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "libwarp_api_ffi.so" - COMPONENT Runtime) +execute_process( + COMMAND git describe --tags + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c + OUTPUT_VARIABLE MONERO_C_TAG + OUTPUT_STRIP_TRAILING_WHITESPACE +) -install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/${LIB_TRIPLET}_libwallet2_api_c.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "monero_libwallet2_api_c.so" - COMPONENT Runtime) +set(MONERO_C_RELEASE_DIR + "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/${MONERO_C_TAG}/${LIB_TRIPLET}" +) -install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/wownero/${LIB_TRIPLET}_libwallet2_api_c.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "wownero_libwallet2_api_c.so" - COMPONENT Runtime) +install( + FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/zcash_lib/target/release/libwarp_api_ffi.so" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + RENAME "libwarp_api_ffi.so" + COMPONENT Runtime +) + +install( + FILES "${MONERO_C_RELEASE_DIR}/libmonero_wallet2_api_c.so" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + RENAME "libmonero_wallet2_api_c.so" + COMPONENT Runtime +) + +install( + FILES "${MONERO_C_RELEASE_DIR}/libwownero_wallet2_api_c.so" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + RENAME "libwownero_wallet2_api_c.so" + COMPONENT Runtime +) install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" COMPONENT Runtime) diff --git a/macos/.gitignore b/macos/.gitignore index 746adbb6b..ac653c481 100644 --- a/macos/.gitignore +++ b/macos/.gitignore @@ -5,3 +5,4 @@ # Xcode-related **/dgph **/xcuserdata/ +*.dylib diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 1a9b46f85..ccdbe0c7c 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -167,34 +167,34 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos SPEC CHECKSUMS: - bitbox_flutter: 16088f5c7febacf894f4d07bbdfb441c9f0757fe - breez_sdk_spark_flutter: 2e864a52e699546aedea3d64d0e0cc88bc0ac595 - connectivity_plus: 0a976dfd033b59192912fa3c6c7b54aab5093802 - cw_mweb: 7440b12ead811dda972a9918442ea2a458e8742c - device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f - devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225 + bitbox_flutter: b3c6d3c4970b134a78a17fddef0ef429cfec2593 + breez_sdk_spark_flutter: b7826ff465c65d620a03560c28c384f44c2dc383 + connectivity_plus: 4adf20a405e25b42b9c9f87feff8f4b6fde18a4e + cw_mweb: 4746a3b5cc5bd4afe6fadd2481c4f7b239e391d0 + device_info_plus: b0fafc687fb901e2af612763340f1b0d4352f8e5 + devicelocale: 456a07c045d3113938aa4983065bd8526e2af792 dnssec_proof: d461cac7bd3301eb7447f87936745a0c1ae0a67e - fast_scanner: d31bae07e2653403a69dac99fb710c1722b16a97 - file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d - flutter_inappwebview_macos: bdf207b8f4ebd58e86ae06cd96b147de99a67c9b - flutter_local_authentication: 85674893931e1c9cfa7c9e4f5973cb8c56b018b0 - flutter_local_notifications: 4ccab5b7a22835214a6672e3f9c5e8ae207dab36 - flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea + fast_scanner: a4ead8e56f185cd565e25250fdb97fa669ea1d2e + file_selector_macos: 6280b52b459ae6c590af5d78fc35c7267a3c4b31 + flutter_inappwebview_macos: c2d68649f9f8f1831bfcd98d73fd6256366d9d1d + flutter_local_authentication: 2f9a2682f498abcc12d7e9729b5007a947170fdc + flutter_local_notifications: 4bf37a31afde695b56091b4ae3e4d9c7a7e6cda0 + flutter_secure_storage_macos: 3dacac420d84c4d0dc5e868194ee43c8664ec797 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - in_app_review: 866c9b17c87a7b46a395bda43f5d3ca02deb585a + in_app_review: 66e7680752b632d83f4f0e88b34d52ed303fbff4 OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 - package_info_plus: 12f1c5c2cfe8727ca46cbd0b26677728972d9a5b - path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 - share_plus: 1fa619de8392a4398bfaf176d441853922614e89 - shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 - sp_scanner: 269d96e0ec3173e69156be7239b95182be3b8303 - sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + package_info_plus: f0052d280d17aa382b932f399edf32507174e870 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + share_plus: 510bf0af1a42cd602274b4629920c9649c52f4cc + shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + sp_scanner: d9316427b628dd86d6e9e3c5d42ed6b4b410157c + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b - sqlite3_flutter_libs: 86f82662868ee26ff3451f73cac9c5fc2a1f57fa - torch_dart: 2e94855e15fcc87bd824e179f1f9c3e0f1e1d302 - universal_ble: cf52a7b3fd2e7c14d6d7262e9fdadb72ab6b88a6 - url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 - wakelock_plus: 9d63063ffb7af1c215209769067c57103bde719d + sqlite3_flutter_libs: 83f8e9f5b6554077f1d93119fe20ebaa5f3a9ef1 + torch_dart: 7e4f682c34ee0d967a35977102590094a7510c90 + universal_ble: ff19787898040d721109c6324472e5dd4bc86adc + url_launcher_macos: 0fba8ddabfc33ce0a9afe7c5fef5aab3d8d2d673 + wakelock_plus: 917609be14d812ddd9e9528876538b2263aaa03b PODFILE CHECKSUM: 65ec1541137fb5b35d00490dec1bb48d4d9586bb diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 0b71d21bc..6474af82d 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -28,8 +28,8 @@ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; 83FF6BF911B29965D3589BE7 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD06F8F6E3797AC031038136 /* Pods_Runner.framework */; }; 9F565D5929954F53009A75FB /* secRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F565D5729954F53009A75FB /* secRandom.swift */; }; - CE75FC4A2C147EBA00CCC46E /* wownero_libwallet2_api_c.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE75FC492C147EBA00CCC46E /* wownero_libwallet2_api_c.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - CED5DBE42BE59BBF0065028F /* monero_libwallet2_api_c.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = CED5DBE32BE59BBF0065028F /* monero_libwallet2_api_c.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + CE5899C52F71669A008E754F /* libwownero_wallet2_api_c.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE5899C32F71669A008E754F /* libwownero_wallet2_api_c.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + CE5899C62F71669A008E754F /* libmonero_wallet2_api_c.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE5899C42F71669A008E754F /* libmonero_wallet2_api_c.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -59,8 +59,8 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - CE75FC4A2C147EBA00CCC46E /* wownero_libwallet2_api_c.dylib in CopyFiles */, - CED5DBE42BE59BBF0065028F /* monero_libwallet2_api_c.dylib in CopyFiles */, + CE5899C52F71669A008E754F /* libwownero_wallet2_api_c.dylib in CopyFiles */, + CE5899C62F71669A008E754F /* libmonero_wallet2_api_c.dylib in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -90,8 +90,8 @@ 9F1E7BFB2BF2D27500C28C9A /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 9F565D5729954F53009A75FB /* secRandom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = secRandom.swift; path = CakeWallet/secRandom.swift; sourceTree = ""; }; BD06F8F6E3797AC031038136 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE75FC492C147EBA00CCC46E /* wownero_libwallet2_api_c.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = wownero_libwallet2_api_c.dylib; sourceTree = ""; }; - CED5DBE32BE59BBF0065028F /* monero_libwallet2_api_c.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = monero_libwallet2_api_c.dylib; sourceTree = ""; }; + CE5899C32F71669A008E754F /* libwownero_wallet2_api_c.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libwownero_wallet2_api_c.dylib; sourceTree = ""; }; + CE5899C42F71669A008E754F /* libmonero_wallet2_api_c.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libmonero_wallet2_api_c.dylib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -120,8 +120,8 @@ 33CC10E42044A3C60003C045 = { isa = PBXGroup; children = ( - CE75FC492C147EBA00CCC46E /* wownero_libwallet2_api_c.dylib */, - CED5DBE32BE59BBF0065028F /* monero_libwallet2_api_c.dylib */, + CE5899C42F71669A008E754F /* libmonero_wallet2_api_c.dylib */, + CE5899C32F71669A008E754F /* libwownero_wallet2_api_c.dylib */, 9F565D5729954F53009A75FB /* secRandom.swift */, 33FAB671232836740065AC1E /* Runner */, 33CEB47122A05771004F2AC0 /* Flutter */, diff --git a/macos/monero_libwallet2_api_c.dylib b/macos/monero_libwallet2_api_c.dylib deleted file mode 120000 index b0ccd724f..000000000 --- a/macos/monero_libwallet2_api_c.dylib +++ /dev/null @@ -1 +0,0 @@ -../scripts/monero_c/release/monero/host-apple-darwin_libwallet2_api_c.dylib \ No newline at end of file diff --git a/macos/wownero_libwallet2_api_c.dylib b/macos/wownero_libwallet2_api_c.dylib deleted file mode 120000 index 6b79a4f03..000000000 --- a/macos/wownero_libwallet2_api_c.dylib +++ /dev/null @@ -1 +0,0 @@ -../scripts/monero_c/release/wownero/host-apple-darwin_libwallet2_api_c.dylib \ No newline at end of file diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 6c0cb29f7..7d3f4360c 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -595,6 +595,7 @@ "login": "تسجيل الدخول", "logout": "تسجيل الخروج", "long_press_edit_address": "اضغط مطولًا لتعديل العنوان", + "long_press_show_balance": "اضغط لفترة طويلة على البطاقة لإظهار التوازن", "low_fee": "رسوم منخفضة", "low_fee_alert": "أنت تستخدم حاليًا أولوية منخفضة لرسوم الشبكة. قد يؤدي ذلك إلى فترات انتظار طويلة، أو أسعار مختلفة، أو إلغاء عمليات التداول. نوصي بتعيين رسوم أعلى للحصول على تجربة أفضل.", "made_easy": "بسهولة", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 0b1103e58..acc036a05 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -595,6 +595,7 @@ "login": "Вход", "logout": "Изход", "long_press_edit_address": "Натиснете и задръжте, за да редактирате адреса", + "long_press_show_balance": "Натиснете дълго картата, за да видите баланса", "low_fee": "Ниска такса", "low_fee_alert": "В момента използвате нисък приоритет за мрежовата такса. Това може да доведе до дълго изчакване, различни курсове или отменени сделки. Препоръчваме да зададете по‑висока такса за по‑добро изживяване.", "made_easy": "направено лесно", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 2e93f2d8c..7648ae39a 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -595,6 +595,7 @@ "login": "Přihlásit se", "logout": "Odhlásit se", "long_press_edit_address": "Dlouhým stisknutím upravíte adresu", + "long_press_show_balance": "Dlouhým stisknutím karty zobrazíte zůstatek", "low_fee": "Nízký poplatek", "low_fee_alert": "Momentálně používáte nízkou prioritu síťového poplatku. To může způsobit dlouhé čekání, odlišné kurzy nebo zrušené obchody. Pro lepší zkušenost doporučujeme nastavit vyšší poplatek.", "made_easy": "snadno", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 4737c1d5b..f71fe8a90 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -595,6 +595,7 @@ "login": "Anmelden", "logout": "Abmelden", "long_press_edit_address": "Lange drücken, um die Adresse zu bearbeiten", + "long_press_show_balance": "Drücken Sie lange auf die Karte, um den Kontostand anzuzeigen", "low_fee": "Niedrige Gebühr", "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.", "made_easy": "leicht gemacht", @@ -1270,6 +1271,7 @@ "username": "Benutzername", "username_available": "Benutzername verfügbar", "username_character_error": "Benutzernamen dürfen nur Folgendes enthalten", + "username_check_your_network": "Benutzername konnte nicht geprüft werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.", "username_length_error": "Benutzernamen müssen 6–32 alphanumerische Zeichen enthalten.", "username_length_error_1_64": "Benutzernamen müssen 1–64 alphanumerische Zeichen enthalten.", "username_not_available": "Dieser Benutzername ist nicht verfügbar.", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index f3f732c23..9a118d49e 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -595,6 +595,7 @@ "login": "Login", "logout": "Logout", "long_press_edit_address": "Long press to edit address", + "long_press_show_balance": "Long press card to show balance", "low_fee": "Low fee", "low_fee_alert": "You currently are using a low network fee priority. This could cause long waits, different rates, or canceled trades. We recommend setting a higher fee for a better experience.", "made_easy": "made easy", @@ -1269,6 +1270,7 @@ "username": "Username", "username_available": "Username Available", "username_character_error": "Usernames must only contain", + "username_check_your_network": "Unable to check username. Please check your network connection.", "username_length_error": "Usernames must contain 6-32 alphanumeric characters.", "username_length_error_1_64": "Usernames must contain 1-64 alphanumeric characters.", "username_not_available": "This username is not available.", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 474a55b10..75d7f5210 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -595,6 +595,7 @@ "login": "Iniciar sesión", "logout": "Cerrar sesión", "long_press_edit_address": "Mantén pulsado para editar la dirección", + "long_press_show_balance": "Mantenga presionada la tarjeta para mostrar el saldo", "low_fee": "Comisión baja", "low_fee_alert": "Actualmente está utilizando una prioridad baja de tarifa de red. Esto podría causar largas esperas, tipos de cambio diferentes u operaciones canceladas. Recomendamos establecer una tarifa más alta para una mejor experiencia.", "made_easy": "hecho fácil", diff --git a/res/values/strings_fa.arb b/res/values/strings_fa.arb index 0c405d4ac..2082c4c5f 100644 --- a/res/values/strings_fa.arb +++ b/res/values/strings_fa.arb @@ -593,6 +593,7 @@ "login": "ورود", "logout": "خروج", "long_press_edit_address": "برای ویرایش آدرس، لمس طولانی کنید", + "long_press_show_balance": "برای نشان دادن تعادل، کارت را طولانی فشار دهید", "low_fee": "کارمزد پایین", "low_fee_alert": "در حال حاضر از اولویت پایینِ کارمزد شبکه استفاده می‌کنید.\nاین موضوع می‌تواند باعث انتظار طولانی، نرخ‌های متفاوت یا لغو معاملات شود.\nبرای تجربه بهتر، توصیه می‌کنیم کارمزد بالاتری تنظیم کنید.", "made_easy": "آسان", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index a97b59b1b..025817397 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -595,6 +595,7 @@ "login": "Connexion", "logout": "Déconnexion", "long_press_edit_address": "Appuyez longuement pour modifier l'adresse", + "long_press_show_balance": "Appuyez longuement sur la carte pour afficher le solde", "low_fee": "Frais réduits", "low_fee_alert": "Vous utilisez actuellement une priorité de frais réseau faible. Cela pourrait entraîner de longues attentes, des taux différents ou des échanges annulés. Nous vous recommandons de définir des frais plus élevés pour une meilleure expérience.", "made_easy": "simplifié", diff --git a/res/values/strings_gn.arb b/res/values/strings_gn.arb index c63a8c559..94810335f 100644 --- a/res/values/strings_gn.arb +++ b/res/values/strings_gn.arb @@ -459,6 +459,7 @@ "login": "Eike hag̃ua", "logout": "Emboty hag̃ua", "long_press_edit_address": "Eipoko puku hag̃ua emoambue dirección.", + "long_press_show_balance": "Tarjeta de prensa puku ohechauka haguã equilibrio", "low_fee": "Jehepyme’ẽ michĩva", "low_fee_alert": "Koʼág̃a reiporu hína peteĩ prioridad jehepymeʼẽ ñanduti rehegua imbeguéva. Kóva ikatu omoheñói ñehaʼãro puku, tasa iñambuéva térã ñemurã ñembotove. Roñeʼẽporã emoĩ hag̃ua jehepymeʼẽ yvateve hag̃ua reiko porãve hag̃ua.", "manage_nodes": "Eñangareko nodo-kuérare", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 3253c51d5..ae76aa5b5 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -595,6 +595,7 @@ "login": "Shiga", "logout": "Fita", "long_press_edit_address": "Danna na ɗan lokaci don gyara adireshi", + "long_press_show_balance": "Dogon danna katin don nuna ma'auni", "low_fee": "Ƙananan kuɗi", "low_fee_alert": "A halin yanzu kuna amfani da ƙaramin fifikon kuɗin hanyar sadarwa. Wannan na iya haifar da dogon jira, farashi daban-daban, ko soke mu’amaloli. Muna ba da shawarar saita kuɗi mafi girma don ƙwarewa mafi kyau.", "made_easy": "an sauƙaƙe", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 105aa6c45..c4566efb4 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -595,6 +595,7 @@ "login": "लॉग इन", "logout": "लॉग आउट", "long_press_edit_address": "पता संपादित करने के लिए देर तक दबाएँ", + "long_press_show_balance": "बैलेंस दिखाने के लिए कार्ड को देर तक दबाएं", "low_fee": "कम शुल्क", "low_fee_alert": "आप वर्तमान में कम नेटवर्क शुल्क प्राथमिकता का उपयोग कर रहे हैं। इससे लंबे समय तक प्रतीक्षा, अलग-अलग दरें या ट्रेड रद्द होने जैसी समस्याएँ हो सकती हैं। बेहतर अनुभव के लिए हम अधिक शुल्क सेट करने की सलाह देते हैं।", "made_easy": "आसान बनाया", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index d893c6952..6a532083c 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -595,6 +595,7 @@ "login": "Prijava", "logout": "Odjava", "long_press_edit_address": "Dugo pritisnite za uređivanje adrese", + "long_press_show_balance": "Dugo pritisnite karticu za prikaz stanja", "low_fee": "Niska naknada", "low_fee_alert": "Trenutačno koristite nizak prioritet mrežne naknade. To bi moglo uzrokovati duga čekanja, različite tečajeve ili otkazane zamjene. Preporučujemo postavljanje veće naknade za bolje iskustvo.", "made_easy": "jednostavno", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index 1607a382f..70c56cbc6 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -595,6 +595,7 @@ "login": "Մուտք", "logout": "Դուրս գալ", "long_press_edit_address": "Հասցեն խմբագրելու համար երկար սեղմեք", + "long_press_show_balance": "Երկար սեղմեք քարտը՝ մնացորդը ցույց տալու համար", "low_fee": "Ցածր վճար", "low_fee_alert": "Դուք ներկայումս օգտագործում եք ցանցային միջնորդավճարի ցածր առաջնահերթություն։ Սա կարող է հանգեցնել երկար սպասման, տարբեր փոխարժեքների կամ չեղարկված գործարքների։ Ավելի լավ փորձի համար խորհուրդ ենք տալիս սահմանել ավելի բարձր միջնորդավճար։", "made_easy": "հեշտացված", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 4276081d8..5f9afeab1 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -595,6 +595,7 @@ "login": "Masuk", "logout": "Keluar", "long_press_edit_address": "Tekan lama untuk mengedit alamat", + "long_press_show_balance": "Tekan lama kartu untuk menunjukkan keseimbangan", "low_fee": "Biaya rendah", "low_fee_alert": "Anda saat ini menggunakan prioritas biaya jaringan rendah. Hal ini dapat menyebabkan waktu tunggu yang lama, nilai tukar yang berbeda, atau perdagangan yang dibatalkan. Kami merekomendasikan untuk menetapkan biaya yang lebih tinggi agar pengalaman lebih baik.", "made_easy": "jadi mudah", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index a0675f7ff..0298000d8 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -595,6 +595,7 @@ "login": "Accedi", "logout": "Disconnetti", "long_press_edit_address": "Tieni premuto per modificare l'indirizzo", + "long_press_show_balance": "Premi a lungo la carta per mostrare il saldo", "low_fee": "Commissione bassa", "low_fee_alert": "Attualmente stai utilizzando una priorità bassa per la commissione di rete. Ciò potrebbe causare lunghe attese, tassi diversi o scambi annullati. Ti consigliamo di impostare una commissione più alta per un'esperienza migliore.", "made_easy": "reso facile", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index a6f4fd430..2350050a1 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -596,6 +596,7 @@ "login": "ログイン", "logout": "ログアウト", "long_press_edit_address": "長押ししてアドレスを編集", + "long_press_show_balance": "カードを長押しすると残高が表示されます", "low_fee": "低手数料", "low_fee_alert": "現在、ネットワーク手数料の優先度を低く設定しています。これにより、待ち時間が長くなったり、レートが変動したり、取引がキャンセルされたりする可能性があります。より快適にご利用いただくために、手数料を高めに設定することをおすすめします。", "made_easy": "簡単に", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index e4effa006..741852d50 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -595,6 +595,7 @@ "login": "로그인", "logout": "로그아웃", "long_press_edit_address": "주소를 편집하려면 길게 누르세요", + "long_press_show_balance": "잔액을 표시하려면 카드를 길게 누르세요.", "low_fee": "낮은 수수료", "low_fee_alert": "현재 낮은 네트워크 수수료 우선순위를 사용하고 있습니다. 이로 인해 대기 시간이 길어지거나, 환율이 달라지거나, 거래가 취소될 수 있습니다. 더 나은 사용 경험을 위해 더 높은 수수료로 설정하는 것을 권장합니다.", "made_easy": "쉽게", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 2a9bb18d1..31152c5d4 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -595,6 +595,7 @@ "login": "လော့ဂ်အင်", "logout": "အကောင့်မှ ထွက်ရန်", "long_press_edit_address": "လိပ်စာကို တည်းဖြတ်ရန် အကြာကြီးနှိပ်ပါ", + "long_press_show_balance": "လက်ကျန်ငွေကိုပြသရန် ကတ်ကို အကြာကြီးနှိပ်ပါ။", "low_fee": "အခကြေးငွေနည်း", "low_fee_alert": "သင်သည် လက်ရှိတွင် ကွန်ရက်အခကြေးငွေ ဦးစားပေးကို နိမ့်ထားပြီး အသုံးပြုနေပါသည်။ ၎င်းကြောင့် စောင့်ဆိုင်းချိန်ကြာခြင်း၊ နှုန်းထားများကွာခြားခြင်း သို့မဟုတ် အရောင်းအဝယ်များ ပယ်ဖျက်ခံရခြင်းတို့ ဖြစ်နိုင်ပါသည်။ ပိုမိုကောင်းမွန်သော အတွေ့အကြုံအတွက် အခကြေးငွေကို ပိုမြင့်အောင် သတ်မှတ်ရန် အကြံပြုပါသည်။", "made_easy": "လွယ်ကူစွာ", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index a27007d94..d6fbec4c5 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -592,6 +592,7 @@ "login": "Aanmelden", "logout": "Afmelden", "long_press_edit_address": "Houd ingedrukt om het adres te bewerken", + "long_press_show_balance": "Druk lang op de kaart om het saldo weer te geven", "low_fee": "Lage vergoeding", "low_fee_alert": "Je gebruikt momenteel een lage prioriteit voor netwerkkosten. Dit kan lange wachttijden, andere tarieven of geannuleerde transacties veroorzaken. We raden aan een hogere vergoeding in te stellen voor een betere ervaring.", "made_easy": "gemakkelijk gemaakt", @@ -1180,8 +1181,8 @@ "trade_state_trading": "Handel", "trade_state_underpaid": "Te weinig betaald", "trade_state_unpaid": "Onbetaald", - "transaction": "Transactie", "trades": "Trades", + "transaction": "Transactie", "transaction_commited": "Transactie vastgelegd", "transaction_cost": "Transactiekosten", "transaction_details_amount": "Bedrag", @@ -1318,8 +1319,8 @@ "wallet_restoration_store_incorrect_seed_length": "Onjuiste seedlengte", "wallet_seed": "Wallet seed", "wallet_seed_legacy": "Legacy wallet seed", - "wallet_store_monero_wallet": "Monero wallet", "wallet_settings": "Walletinstellingen", + "wallet_store_monero_wallet": "Monero wallet", "walletConnect": "WalletConnect", "wallets": "Wallets", "warning": "Waarschuwing", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index ba93ddd30..df6b6cafe 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -594,6 +594,7 @@ "login": "Zaloguj się", "logout": "Wyloguj się", "long_press_edit_address": "Naciśnij i przytrzymaj, aby edytować adres", + "long_press_show_balance": "Naciśnij i przytrzymaj kartę, aby wyświetlić saldo", "low_fee": "Niska opłata", "low_fee_alert": "Obecnie używasz niskiego priorytetu opłaty sieciowej. Może to spowodować długi czas oczekiwania, inne kursy lub anulowane transakcje. Zalecamy ustawienie wyższej opłaty, aby zapewnić lepsze wrażenia.", "made_easy": "łatwe", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 981ab9871..f021ee853 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -595,6 +595,7 @@ "login": "Entrar", "logout": "Sair", "long_press_edit_address": "Pressione e segure para editar o endereço", + "long_press_show_balance": "Pressione e segure o cartão para mostrar o saldo", "low_fee": "Taxa baixa", "low_fee_alert": "No momento, você está usando uma prioridade baixa de taxa de rede. Isso pode causar longas esperas, taxas diferentes ou negociações canceladas. Recomendamos definir uma taxa mais alta para uma melhor experiência.", "made_easy": "feito fácil", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 99496d876..c198898d1 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -595,6 +595,7 @@ "login": "Войти", "logout": "Выйти", "long_press_edit_address": "Нажмите и удерживайте, чтобы изменить адрес", + "long_press_show_balance": "Длительное нажатие карты, чтобы показать баланс", "low_fee": "Низкая комиссия", "low_fee_alert": "В настоящее время вы используете низкий приоритет комиссии сети. Это может привести к длительному ожиданию, изменению курсов или отмене сделок. Мы рекомендуем установить более высокую комиссию для лучшего опыта.", "made_easy": "это просто", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 3c62489d1..7ceda17da 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -595,6 +595,7 @@ "login": "เข้าสู่ระบบ", "logout": "ออกจากระบบ", "long_press_edit_address": "กดค้างเพื่อแก้ไขที่อยู่", + "long_press_show_balance": "กดการ์ดค้างไว้เพื่อแสดงยอดเงินคงเหลือ", "low_fee": "ค่าธรรมเนียมต่ำ", "low_fee_alert": "ขณะนี้คุณกำลังใช้ค่าธรรมเนียมเครือข่ายที่มีลำดับความสำคัญต่ำ ซึ่งอาจทำให้ต้องรอนาน อัตราที่แตกต่างกัน หรือการเทรดถูกยกเลิก เราแนะนำให้ตั้งค่าธรรมเนียมให้สูงขึ้นเพื่อประสบการณ์ที่ดียิ่งขึ้น", "made_easy": "ใช้งานง่าย", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 4e8e97993..0cbdd9b03 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -595,6 +595,7 @@ "login": "Mag-login", "logout": "Mag-logout", "long_press_edit_address": "Pindutin nang matagal para i-edit ang address", + "long_press_show_balance": "Pindutin nang matagal ang card para ipakita ang balanse", "low_fee": "Mababang bayarin", "low_fee_alert": "Kasalukuyan kang gumagamit ng mababang priyoridad ng network fee. Maaari itong magdulot ng mahabang paghihintay, iba't ibang rate, o nakanselang mga trade. Inirerekomenda naming magtakda ng mas mataas na fee para sa mas magandang karanasan.", "made_easy": "pinadali", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index a0ef9832e..19cc7f644 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -595,6 +595,7 @@ "login": "Giriş", "logout": "Çıkış yap", "long_press_edit_address": "Adresi düzenlemek için uzun basın", + "long_press_show_balance": "Bakiyeyi göstermek için karta uzun basın", "low_fee": "Düşük ücret", "low_fee_alert": "Şu anda düşük bir ağ ücreti önceliği kullanıyorsunuz. Bu durum uzun beklemelere, farklı oranlara veya iptal edilen takaslara neden olabilir. Daha iyi bir deneyim için daha yüksek bir ücret belirlemenizi öneririz.", "made_easy": "kolaylaştırıldı", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 7b48fc386..179dd8635 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -595,6 +595,7 @@ "login": "Вхід", "logout": "Вийти", "long_press_edit_address": "Натисніть і утримуйте, щоб редагувати адресу", + "long_press_show_balance": "Утримуйте картку, щоб показати баланс", "low_fee": "Низька комісія", "low_fee_alert": "Наразі ви використовуєте низький пріоритет мережевої комісії. Це може призвести до тривалого очікування, іншого курсу або скасування обмінів. Ми рекомендуємо встановити вищу комісію для кращого досвіду.", "made_easy": "зроблено просто", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index e7dec9234..90615ce60 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -595,6 +595,7 @@ "login": "لاگ اِن", "logout": "لاگ آؤٹ", "long_press_edit_address": "ایڈریس میں ترمیم کرنے کے لیے دیر تک دبائیں", + "long_press_show_balance": "بیلنس دکھانے کے لیے کارڈ کو دیر تک دبائیں", "low_fee": "کم فیس", "low_fee_alert": "آپ فی الحال کم نیٹ ورک فیس کی ترجیح استعمال کر رہے ہیں۔ اس کی وجہ سے طویل انتظار، مختلف ریٹس، یا ٹریڈز منسوخ ہو سکتے ہیں۔ بہتر تجربے کے لیے ہم زیادہ فیس سیٹ کرنے کی تجویز دیتے ہیں۔", "made_easy": "آسان بنایا", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index f51cde326..1b02820da 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -594,6 +594,7 @@ "login": "Đăng nhập", "logout": "Đăng xuất", "long_press_edit_address": "Nhấn và giữ để chỉnh sửa địa chỉ", + "long_press_show_balance": "Nhấn và giữ thẻ để hiển thị số dư", "low_fee": "Phí thấp", "low_fee_alert": "Bạn hiện đang sử dụng mức ưu tiên phí mạng thấp. Điều này có thể dẫn đến thời gian chờ lâu, tỷ giá khác nhau hoặc giao dịch bị hủy. Chúng tôi khuyến nghị bạn đặt mức phí cao hơn để có trải nghiệm tốt hơn.", "made_easy": "dễ dàng", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index a544aa8e9..ad8ee7f79 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -596,6 +596,7 @@ "login": "Wọlé", "logout": "Jáde", "long_press_edit_address": "Tẹ mọ́lẹ̀ láti ṣàtúnṣe àdírẹ́sì", + "long_press_show_balance": "Tẹ kaadi gigun lati ṣafihan iwọntunwọnsi", "low_fee": "Owó ìnáwó kékeré", "low_fee_alert": "Lọ́wọ́lọ́wọ́ yìí, ẹ ń lo ìpàtàkì owó ìdúnáwọ́ọ̀kì (network fee) tó kéré. Èyí lè fa ìdúró pípẹ́, oṣùwọ̀n tó yàtọ̀, tàbí kí ìṣòwò kan fagi lé. A dábàá pé k'ẹ́ ṣètò owó ìdúnáwọ́ọ̀kì tó ga díẹ̀ fún ìrírí tó dára jù.", "made_easy": "ṣe é rọrùn", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 6a3a19fdb..6cd8175a4 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -595,6 +595,7 @@ "login": "登录", "logout": "退出登录", "long_press_edit_address": "长按以编辑地址", + "long_press_show_balance": "长按卡显示余额", "low_fee": "低手续费", "low_fee_alert": "您当前使用较低的网络手续费优先级,这可能导致等待时间较长、汇率变化或交易被取消。我们建议设置更高的手续费,以获得更好的体验。", "made_easy": "轻松上手", diff --git a/scripts/android/build_monero_all.sh b/scripts/android/build_monero_all.sh index 1cec707e6..341f14496 100755 --- a/scripts/android/build_monero_all.sh +++ b/scripts/android/build_monero_all.sh @@ -1,7 +1,7 @@ #!/bin/bash source "$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/functions.sh" -# Usage: env USE_DOCKER= ./build_all.sh +# Usage: env USE_DOCKER= ./build_all.sh set -x -e @@ -12,15 +12,33 @@ cd "$(dirname "$0")" for COIN in monero wownero zano; do pushd ../monero_c + monero_c_tag=$(git describe --tags) for target in {x86_64,aarch64}-linux-android armv7a-linux-androideabi do - if [[ -f "release/${COIN}/${target}_libwallet2_api_c.so" ]]; + if [[ -f "release/${monero_c_tag}/${target}/${COIN}_libwallet2_api_c.so" ]]; then echo "file exist, not building monero_c for ${COIN}/$target."; else ./build_single.sh ${COIN} $target -j$MAKE_JOB_COUNT - unxz -f ../monero_c/release/${COIN}/${target}_libwallet2_api_c.so.xz fi + + case $target in + x86_64-linux-android) + mkdir -p ../../android/app/src/main/jniLibs/x86_64 || true + cp ../monero_c/release/${monero_c_tag}/${target}/lib${COIN}_wallet2_api_c.so ../../android/app/src/main/jniLibs/x86_64/ + ;; + armv7a-linux-androideabi) + mkdir -p ../../android/app/src/main/jniLibs/armeabi-v7a || true + cp ../monero_c/release/${monero_c_tag}/${target}/lib${COIN}_wallet2_api_c.so ../../android/app/src/main/jniLibs/armeabi-v7a/ + ;; + aarch64-linux-android) + mkdir -p ../../android/app/src/main/jniLibs/arm64-v8a || true + cp ../monero_c/release/${monero_c_tag}/${target}/lib${COIN}_wallet2_api_c.so ../../android/app/src/main/jniLibs/arm64-v8a/ + ;; + *) + echo "Unsupported target: $target" + exit 1; + esac done popd done diff --git a/scripts/ios/build_monero_all.sh b/scripts/ios/build_monero_all.sh index 69d4f006b..0f82c0444 100755 --- a/scripts/ios/build_monero_all.sh +++ b/scripts/ios/build_monero_all.sh @@ -1,5 +1,5 @@ #!/bin/sh -source "$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/functions.sh" +source "$(cd "$(dirname "$0")/.." && pwd)/functions.sh" . ./config.sh # ./install_missing_headers.sh @@ -19,16 +19,8 @@ for COIN in monero wownero zano; do pushd ../monero_c ./build_single.sh ${COIN} aarch64-apple-ios -j$MAKE_JOB_COUNT - ./build_single.sh ${COIN} aarch64-apple-iossimulator -j$MAKE_JOB_COUNT + ./build_single.sh ${COIN} aarch64-apple-ios-simulator -j$MAKE_JOB_COUNT popd done -unxz -fk ../monero_c/release/monero/aarch64-apple-ios_libwallet2_api_c.dylib.xz -unxz -fk ../monero_c/release/wownero/aarch64-apple-ios_libwallet2_api_c.dylib.xz -unxz -fk ../monero_c/release/zano/aarch64-apple-ios_libwallet2_api_c.dylib.xz - -unxz -fk ../monero_c/release/monero/aarch64-apple-iossimulator_libwallet2_api_c.dylib.xz -unxz -fk ../monero_c/release/wownero/aarch64-apple-iossimulator_libwallet2_api_c.dylib.xz -unxz -fk ../monero_c/release/zano/aarch64-apple-iossimulator_libwallet2_api_c.dylib.xz - -./gen_framework.sh \ No newline at end of file +./gen_framework.sh diff --git a/scripts/ios/gen_framework.sh b/scripts/ios/gen_framework.sh index e1c237f87..fda1e1974 100755 --- a/scripts/ios/gen_framework.sh +++ b/scripts/ios/gen_framework.sh @@ -2,7 +2,8 @@ set -e IOS_DIR="$(pwd)/../../ios" -DYLIB_PATH="$(pwd)/../../scripts/monero_c/release" +monero_c_tag=$(cd $(pwd)/../../scripts/monero_c/; git describe --tags) +DYLIB_PATH="$(pwd)/../../scripts/monero_c/release/${monero_c_tag}/" TMP_DIR="${IOS_DIR}/tmp" rm -rf "${IOS_DIR:?}/MoneroWallet.xcframework" "${IOS_DIR:?}/WowneroWallet.xcframework" "${IOS_DIR:?}/ZanoWallet.xcframework" @@ -16,7 +17,7 @@ write_info_plist() { target="$3" plist_path="${framework_bundle}/Info.plist" - if [[ "x$target" = "xiossimulator" ]]; then + if [[ "x$target" = "xios-simulator" ]]; then platform="iPhoneSimulator" dtplatformname="iphonesimulator" dtsdkname="iphonesimulator17.4" @@ -97,11 +98,11 @@ create_framework() { echo "Creating ${framework_name}.framework for target ${target} in ${out_dir}..." framework_bundle="${out_dir}/${framework_name}.framework" - + rm -rf "$framework_bundle" mkdir -p "$framework_bundle" - input_dylib="${DYLIB_PATH}/${wallet}/aarch64-apple-${target}_libwallet2_api_c.dylib" + input_dylib="${DYLIB_PATH}/aarch64-apple-${target}/lib${wallet}_wallet2_api_c.dylib" if [[ ! -f "$input_dylib" ]]; then echo "Error: Input dylib not found: $input_dylib" exit 1 @@ -144,7 +145,7 @@ for i in "${!wallets[@]}"; do mkdir -p "$device_out" "$simulator_out" create_framework "$wallet" "$framework_name" "ios" "$device_out" - create_framework "$wallet" "$framework_name" "iossimulator" "$simulator_out" + create_framework "$wallet" "$framework_name" "ios-simulator" "$simulator_out" device_framework="${device_out}/${framework_name}.framework" simulator_framework="${simulator_out}/${framework_name}.framework" diff --git a/scripts/linux/build_monero_all.sh b/scripts/linux/build_monero_all.sh index 6c901052f..e17073d31 100755 --- a/scripts/linux/build_monero_all.sh +++ b/scripts/linux/build_monero_all.sh @@ -16,13 +16,7 @@ do else target="x86_64-linux-gnu" fi - - if [[ -f "release/${COIN}/${target}_libwallet2_api_c.so" ]]; - then - echo "file exist, not building monero_c for ${COIN}/$target."; - else - ./build_single.sh ${COIN} $target -j$MAKE_JOB_COUNT - unxz -f ../monero_c/release/${COIN}/${target}_libwallet2_api_c.so.xz - fi + + ./build_single.sh ${COIN} $target -j$MAKE_JOB_COUNT popd -done \ No newline at end of file +done diff --git a/scripts/macos/build_monero_all.sh b/scripts/macos/build_monero_all.sh index f46674242..196def113 100755 --- a/scripts/macos/build_monero_all.sh +++ b/scripts/macos/build_monero_all.sh @@ -2,14 +2,14 @@ set -x -e cd "$(dirname "$0")" +../prepare_moneroc.sh NPROC="-j$(sysctl -n hw.logicalcpu)" MONERO_LIBS="" WOWNERO_LIBS="" -MONEROC_RELEASE_DIR="../monero_c/release/monero" -WOWNEROC_RELEASE_DIR="../monero_c/release/wownero" +monero_c_tag=$(cd ../monero_c/; git describe --tags) +MONEROC_RELEASE_DIR="../monero_c/release/${monero_c_tag}" -../prepare_moneroc.sh # NOTE: -j1 is intentional. Otherwise you will run into weird behaviour on macos if [[ ! "x$USE_DOCKER" == "x" ]]; @@ -22,29 +22,26 @@ then popd done else - ARCHS=(x86_64 arm64) + ARCHS=(x86_64 arm64) for COIN in monero wownero; do MONERO_LIBS="" WOWNERO_LIBS="" - for ARCH in "${ARCHS[@]}"; - do - if [[ "$ARCH" == "arm64" ]]; then - HOST="aarch64-apple-darwin" - else - HOST="x86_64-apple-darwin" - fi - - MONERO_LIBS="$MONERO_LIBS -arch ${ARCH} ${MONEROC_RELEASE_DIR}/${HOST}_libwallet2_api_c.dylib" - WOWNERO_LIBS="$WOWNERO_LIBS -arch ${ARCH} ${WOWNEROC_RELEASE_DIR}/${HOST}_libwallet2_api_c.dylib" - - pushd ../monero_c + for ARCH in "${ARCHS[@]}"; + do + if [[ "$ARCH" == "arm64" ]]; then + HOST="aarch64-apple-darwin" + else + HOST="x86_64-apple-darwin" + fi + MONERO_LIBS="$MONERO_LIBS -arch ${ARCH} ${MONEROC_RELEASE_DIR}/${HOST}/libmonero_wallet2_api_c.dylib" + WOWNERO_LIBS="$WOWNERO_LIBS -arch ${ARCH} ${MONEROC_RELEASE_DIR}/${HOST}/libwownero_wallet2_api_c.dylib" + pushd ../monero_c ./build_single.sh ${COIN} ${HOST} -j$MAKE_JOB_COUNT - unxz -f ./release/${COIN}/${HOST}_libwallet2_api_c.dylib.xz - popd - done + popd + done done fi -lipo -create ${MONERO_LIBS} -output "${MONEROC_RELEASE_DIR}/host-apple-darwin_libwallet2_api_c.dylib" -lipo -create ${WOWNERO_LIBS} -output "${WOWNEROC_RELEASE_DIR}/host-apple-darwin_libwallet2_api_c.dylib" +lipo -create ${MONERO_LIBS} -output "${MONEROC_RELEASE_DIR}/../../../../macos/libmonero_wallet2_api_c.dylib" +lipo -create ${WOWNERO_LIBS} -output "${MONEROC_RELEASE_DIR}/../../../../macos/libwownero_wallet2_api_c.dylib" diff --git a/scripts/prepare_moneroc.sh b/scripts/prepare_moneroc.sh index b5752ad26..2d7b06f0c 100755 --- a/scripts/prepare_moneroc.sh +++ b/scripts/prepare_moneroc.sh @@ -9,18 +9,17 @@ then rm -rf monero_c git clone https://github.com/mrcyjanek/monero_c --branch master monero_c cd monero_c - # NOTE: Make sure to update monero_c prebuilds link in workflow files - # https://github.com/MrCyjaneK/monero_c/releases/download/v0.18.4.0-RC9/release-bundle.zip - git checkout 411e8a1cdb3f4c2812d83f28c335d2a4eb18bd29 - git reset --hard - git submodule update --init --force --recursive - ./apply_patches.sh monero - ./apply_patches.sh wownero - ./apply_patches.sh zano else cd monero_c fi +# NOTE: Make sure to update monero_c prebuilds link in workflow files +# https://github.com/MrCyjaneK/monero_c/releases/download/v0.18.4.6-RC1/release-bundle.zip +git fetch -a +git checkout bc8d1a0b75b97156d71579581b4cdfe58c777ed2 +git reset --hard +git submodule update --init --force --recursive + for coin in monero wownero zano; do if [[ ! -f "$coin/.patch-applied" ]]; diff --git a/tool/download_moneroc_prebuilds.dart b/tool/download_moneroc_prebuilds.dart index fd9cd6dd6..a12777ad5 100644 --- a/tool/download_moneroc_prebuilds.dart +++ b/tool/download_moneroc_prebuilds.dart @@ -20,13 +20,11 @@ final List triplets = [ "x86_64-w64-mingw32", // "x86_64-apple-darwin11", // Intel macbooks (contrib) - not used by cake // "aarch64-apple-darwin11", // apple silicon macbooks (contrib) - not used by cake - // "host-apple-darwin", // not available on CI (yet) // "x86_64-host-apple-darwin", // not available on CI (yet) "aarch64-apple-darwin", // apple silicon macbooks "x86_64-apple-darwin", // intel macbooks - "aarch64-host-apple-darwin", // apple silicon macbooks (local builds) "aarch64-apple-ios", - "aarch64-apple-iossimulator", + "aarch64-apple-ios-simulator", ]; Future main() async {