Generic fixes (#1274)

* Display fees currency as wallet currency not the selected one

* remove unused code
catch balance network issues

* pop send screen when send completes successfully

* revert change [skip ci]

* Enable restoring haven wallets

* verify context is mounted before showing snackbar [skip ci]

* Update privacy [skip ci]

* Add user consent popup to inapp webview permission request
This commit is contained in:
Omar Hatem 2024-01-27 00:51:21 +02:00 committed by GitHub
parent aed60a7282
commit 89fdc0f4d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
36 changed files with 134 additions and 86 deletions

View file

@ -1,6 +1,6 @@
Privacy Policy Privacy Policy
Last modified: August 9, 2023 Last modified: January 24, 2024
Introduction Introduction
============ ============
@ -112,12 +112,12 @@ Data Security
In any situation, Cake Labs takes no responsibility for interception of personal data by any outside individual, group, corporation, or institution. You should understand this and take any and all appropriate actions to secure your own data. In any situation, Cake Labs takes no responsibility for interception of personal data by any outside individual, group, corporation, or institution. You should understand this and take any and all appropriate actions to secure your own data.
Links to Other Websites Other Websites and Third-Party Services
----------------------- ---------------------------------------
The App may contain links to other websites that are not operated by us. If you click on a Third-Party Service link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit. We have no control over and assume no responsibility for the content, privacy policies or practices of any third-party sites or services. The App may contain links to other websites that are not operated by us. If you click on a Third-Party Service link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit. We have no control over and assume no responsibility for the content, privacy policies or practices of any third-party sites or services.
The App includes several optional Third-Party Services, which may not be available to all users. If you use Third-Party Services, you must agree to their respective Privacy Policies. The App includes several optional Third-Party Services, which may not be available to all users. If you use Third-Party Services, you must agree to their respective Privacy Policies. When using certain optional features in the app such as buying and selling, you may be asked to provide information to a Third-Party Service. You will need to read and accept the privacy policy for that third party. This Third-Party Service may ask for your name, your photo ID, your social security number or other similar number, mailing address, cryptocurrency address, or other information. They may ask you to take a selfie image. Information shared with a Third-Party Service is subject to their respective Privacy Policies.
Changes to Our Privacy Policy Changes to Our Privacy Policy
----------------------------- -----------------------------

View file

@ -190,11 +190,15 @@ I/flutter ( 4474): Gas Used: 53000
Future<ERC20Balance> fetchERC20Balances( Future<ERC20Balance> fetchERC20Balances(
EthereumAddress userAddress, String contractAddress) async { EthereumAddress userAddress, String contractAddress) async {
final erc20 = ERC20(address: EthereumAddress.fromHex(contractAddress), client: _client!); final erc20 = ERC20(address: EthereumAddress.fromHex(contractAddress), client: _client!);
final balance = await erc20.balanceOf(userAddress); try {
final balance = await erc20.balanceOf(userAddress);
int exponent = (await erc20.decimals()).toInt(); int exponent = (await erc20.decimals()).toInt();
return ERC20Balance(balance, exponent: exponent); return ERC20Balance(balance, exponent: exponent);
} catch (_) {
return ERC20Balance(BigInt.zero);
}
} }
Future<Erc20Token?> getErc20Token(String contractAddress) async { Future<Erc20Token?> getErc20Token(String contractAddress) async {

View file

@ -612,7 +612,6 @@ Future<void> setup({
_walletInfoSource, _walletInfoSource,
getIt.get<AppStore>(), getIt.get<AppStore>(),
getIt.get<WalletLoadingService>(), getIt.get<WalletLoadingService>(),
getIt.get<AuthService>(),
), ),
); );
} else { } else {
@ -623,7 +622,6 @@ Future<void> setup({
_walletInfoSource, _walletInfoSource,
getIt.get<AppStore>(), getIt.get<AppStore>(),
getIt.get<WalletLoadingService>(), getIt.get<WalletLoadingService>(),
getIt.get<AuthService>(),
), ),
); );
} }
@ -725,7 +723,7 @@ Future<void> setup({
}); });
getIt.registerFactory(() { getIt.registerFactory(() {
return SecuritySettingsViewModel(getIt.get<SettingsStore>(), getIt.get<AuthService>()); return SecuritySettingsViewModel(getIt.get<SettingsStore>());
}); });
getIt.registerFactory(() => WalletSeedViewModel(getIt.get<AppStore>().wallet!)); getIt.registerFactory(() => WalletSeedViewModel(getIt.get<AppStore>().wallet!));

View file

@ -1,4 +1,7 @@
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
@ -14,13 +17,14 @@ class WebViewPage extends BasePage {
@override @override
Widget body(BuildContext context) { Widget body(BuildContext context) {
return WebViewPageBody(_url); return WebViewPageBody(_title, _url);
} }
} }
class WebViewPageBody extends StatefulWidget { class WebViewPageBody extends StatefulWidget {
WebViewPageBody(this.uri); WebViewPageBody(this.title, this.uri);
final String title;
final Uri uri; final Uri uri;
@override @override
@ -40,6 +44,27 @@ class WebViewPageBodyState extends State<WebViewPageBody> {
onPermissionRequest: (controller, request) async { onPermissionRequest: (controller, request) async {
bool permissionGranted = await Permission.camera.status == PermissionStatus.granted; bool permissionGranted = await Permission.camera.status == PermissionStatus.granted;
if (!permissionGranted) { if (!permissionGranted) {
final bool userConsent = await showPopUp<bool>(
context: context,
builder: (BuildContext context) {
return AlertWithTwoActions(
alertTitle: S.of(context).privacy,
alertContent: S.of(context).camera_consent(widget.title),
rightButtonText: S.of(context).agree,
leftButtonText: S.of(context).cancel,
actionRightButton: () => Navigator.of(context).pop(true),
actionLeftButton: () => Navigator.of(context).pop(false));
}) ??
false;
/// if user did NOT give the consent then return permission denied
if (!userConsent) {
return PermissionResponse(
resources: request.resources,
action: PermissionResponseAction.DENY,
);
}
permissionGranted = await Permission.camera.request().isGranted; permissionGranted = await Permission.camera.request().isGranted;
} }

View file

@ -166,12 +166,16 @@ class _DesktopWalletSelectionDropDownState extends State<DesktopWalletSelectionD
} }
try { try {
changeProcessText(S.of(context).wallet_list_loading_wallet(wallet.name)); if (context.mounted) {
changeProcessText(S.of(context).wallet_list_loading_wallet(wallet.name));
}
await widget.walletListViewModel.loadWallet(wallet); await widget.walletListViewModel.loadWallet(wallet);
hideProgressText(); hideProgressText();
setState(() {}); setState(() {});
} catch (e) { } catch (e) {
changeProcessText(S.of(context).wallet_list_failed_to_load(wallet.name, e.toString())); if (context.mounted) {
changeProcessText(S.of(context).wallet_list_failed_to_load(wallet.name, e.toString()));
}
} }
}, },
conditionToDetermineIfToUse2FA: conditionToDetermineIfToUse2FA:

View file

@ -28,15 +28,18 @@ class NewWalletTypePage extends BasePage {
@override @override
Widget body(BuildContext context) => WalletTypeForm( Widget body(BuildContext context) => WalletTypeForm(
onTypeSelected: onTypeSelected, onTypeSelected: onTypeSelected,
walletImage: currentTheme.type == ThemeType.dark ? walletTypeImage : walletTypeLightImage); walletImage: currentTheme.type == ThemeType.dark ? walletTypeImage : walletTypeLightImage,
isCreate: isCreate,
);
} }
class WalletTypeForm extends StatefulWidget { class WalletTypeForm extends StatefulWidget {
WalletTypeForm({required this.onTypeSelected, required this.walletImage}); WalletTypeForm({required this.onTypeSelected, required this.walletImage, required this.isCreate});
final void Function(BuildContext, WalletType) onTypeSelected; final void Function(BuildContext, WalletType) onTypeSelected;
final Image walletImage; final Image walletImage;
final bool isCreate;
@override @override
WalletTypeFormState createState() => WalletTypeFormState(); WalletTypeFormState createState() => WalletTypeFormState();
@ -131,7 +134,7 @@ class WalletTypeFormState extends State<WalletTypeForm> {
throw Exception('Wallet Type is not selected yet.'); throw Exception('Wallet Type is not selected yet.');
} }
if (selected == WalletType.haven) { if (selected == WalletType.haven && widget.isCreate) {
return await showPopUp<void>( return await showPopUp<void>(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {

View file

@ -478,7 +478,7 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
Text( Text(
output.estimatedFee.toString() + output.estimatedFee.toString() +
' ' + ' ' +
sendViewModel.selectedCryptoCurrency.toString(), sendViewModel.currency.toString(),
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,

View file

@ -2,7 +2,6 @@ import 'dart:io';
import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart'; import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart';
import 'package:cake_wallet/buy/buy_provider.dart';
import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart'; import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart';
import 'package:cake_wallet/entities/provider_types.dart'; import 'package:cake_wallet/entities/provider_types.dart';
import 'package:cake_wallet/entities/cake_2fa_preset_options.dart'; import 'package:cake_wallet/entities/cake_2fa_preset_options.dart';
@ -40,6 +39,7 @@ import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/entities/action_list_display_mode.dart'; import 'package:cake_wallet/entities/action_list_display_mode.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cw_core/set_app_secure_native.dart'; import 'package:cw_core/set_app_secure_native.dart';
part 'settings_store.g.dart'; part 'settings_store.g.dart';
class SettingsStore = SettingsStoreBase with _$SettingsStore; class SettingsStore = SettingsStoreBase with _$SettingsStore;
@ -1080,34 +1080,37 @@ abstract class SettingsStoreBase with Store {
priority[WalletType.monero] = monero?.deserializeMoneroTransactionPriority( priority[WalletType.monero] = monero?.deserializeMoneroTransactionPriority(
raw: sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority)!) ?? raw: sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority)!) ??
priority[WalletType.monero]!; priority[WalletType.monero]!;
priority[WalletType.bitcoin] = bitcoin?.deserializeBitcoinTransactionPriority(
sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority)!) ??
priority[WalletType.bitcoin]!;
if (sharedPreferences.getInt(PreferencesKey.havenTransactionPriority) != null) { if (bitcoin != null &&
priority[WalletType.haven] = monero?.deserializeMoneroTransactionPriority( sharedPreferences.getInt(PreferencesKey.bitcoinTransactionPriority) != null) {
raw: sharedPreferences.getInt(PreferencesKey.havenTransactionPriority)!) ?? priority[WalletType.bitcoin] = bitcoin!.deserializeBitcoinTransactionPriority(
priority[WalletType.haven]!; sharedPreferences.getInt(PreferencesKey.bitcoinTransactionPriority)!);
} }
if (sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority) != null) {
priority[WalletType.litecoin] = bitcoin?.deserializeLitecoinTransactionPriority( if (monero != null &&
sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!) ?? sharedPreferences.getInt(PreferencesKey.havenTransactionPriority) != null) {
priority[WalletType.litecoin]!; priority[WalletType.haven] = monero!.deserializeMoneroTransactionPriority(
raw: sharedPreferences.getInt(PreferencesKey.havenTransactionPriority)!);
} }
if (sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority) != null) { if (bitcoin != null &&
priority[WalletType.ethereum] = ethereum?.deserializeEthereumTransactionPriority( sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority) != null) {
sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority)!) ?? priority[WalletType.litecoin] = bitcoin!.deserializeLitecoinTransactionPriority(
priority[WalletType.ethereum]!; sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!);
} }
if (sharedPreferences.getInt(PreferencesKey.polygonTransactionPriority) != null) { if (ethereum != null &&
priority[WalletType.polygon] = polygon?.deserializePolygonTransactionPriority( sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority) != null) {
sharedPreferences.getInt(PreferencesKey.polygonTransactionPriority)!) ?? priority[WalletType.ethereum] = ethereum!.deserializeEthereumTransactionPriority(
priority[WalletType.polygon]!; sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority)!);
} }
if (sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority) != null) { if (polygon != null &&
priority[WalletType.bitcoinCash] = bitcoinCash?.deserializeBitcoinCashTransactionPriority( sharedPreferences.getInt(PreferencesKey.polygonTransactionPriority) != null) {
sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority)!) ?? priority[WalletType.polygon] = polygon!.deserializePolygonTransactionPriority(
priority[WalletType.bitcoinCash]!; sharedPreferences.getInt(PreferencesKey.polygonTransactionPriority)!);
}
if (bitcoinCash != null &&
sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority) != null) {
priority[WalletType.bitcoinCash] = bitcoinCash!.deserializeBitcoinCashTransactionPriority(
sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority)!);
} }
final generateSubaddresses = final generateSubaddresses =
@ -1187,7 +1190,6 @@ abstract class SettingsStoreBase with Store {
final ethereumNodeId = sharedPreferences.getInt(PreferencesKey.currentEthereumNodeIdKey); final ethereumNodeId = sharedPreferences.getInt(PreferencesKey.currentEthereumNodeIdKey);
final polygonNodeId = sharedPreferences.getInt(PreferencesKey.currentPolygonNodeIdKey); final polygonNodeId = sharedPreferences.getInt(PreferencesKey.currentPolygonNodeIdKey);
final nanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey); final nanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey);
final nanoPowNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey);
final moneroNode = nodeSource.get(nodeId); final moneroNode = nodeSource.get(nodeId);
final bitcoinElectrumServer = nodeSource.get(bitcoinElectrumServerId); final bitcoinElectrumServer = nodeSource.get(bitcoinElectrumServerId);
final litecoinElectrumServer = nodeSource.get(litecoinElectrumServerId); final litecoinElectrumServer = nodeSource.get(litecoinElectrumServerId);

View file

@ -1,4 +1,3 @@
import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/entities/biometric_auth.dart'; import 'package:cake_wallet/entities/biometric_auth.dart';
import 'package:cake_wallet/entities/pin_code_required_duration.dart'; import 'package:cake_wallet/entities/pin_code_required_duration.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
@ -9,14 +8,10 @@ part 'security_settings_view_model.g.dart';
class SecuritySettingsViewModel = SecuritySettingsViewModelBase with _$SecuritySettingsViewModel; class SecuritySettingsViewModel = SecuritySettingsViewModelBase with _$SecuritySettingsViewModel;
abstract class SecuritySettingsViewModelBase with Store { abstract class SecuritySettingsViewModelBase with Store {
SecuritySettingsViewModelBase( SecuritySettingsViewModelBase(this._settingsStore) : _biometricAuth = BiometricAuth();
this._settingsStore,
this._authService,
) : _biometricAuth = BiometricAuth();
final BiometricAuth _biometricAuth; final BiometricAuth _biometricAuth;
final SettingsStore _settingsStore; final SettingsStore _settingsStore;
final AuthService _authService;
@computed @computed
bool get allowBiometricalAuthentication => _settingsStore.allowBiometricalAuthentication; bool get allowBiometricalAuthentication => _settingsStore.allowBiometricalAuthentication;
@ -41,8 +36,6 @@ abstract class SecuritySettingsViewModelBase with Store {
_settingsStore.allowBiometricalAuthentication = value; _settingsStore.allowBiometricalAuthentication = value;
@action @action
setPinCodeRequiredDuration(PinCodeRequiredDuration duration) => void setPinCodeRequiredDuration(PinCodeRequiredDuration duration) =>
_settingsStore.pinTimeOutDuration = duration; _settingsStore.pinTimeOutDuration = duration;
Future<bool> checkPinCodeRiquired() => _authService.requireAuth();
} }

View file

@ -1,4 +1,3 @@
import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/core/wallet_loading_service.dart'; import 'package:cake_wallet/core/wallet_loading_service.dart';
import 'package:cake_wallet/entities/wallet_list_order_types.dart'; import 'package:cake_wallet/entities/wallet_list_order_types.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
@ -18,7 +17,6 @@ abstract class WalletListViewModelBase with Store {
this._walletInfoSource, this._walletInfoSource,
this._appStore, this._appStore,
this._walletLoadingService, this._walletLoadingService,
this._authService,
) : wallets = ObservableList<WalletListItem>() { ) : wallets = ObservableList<WalletListItem>() {
setOrderType(_appStore.settingsStore.walletListOrder); setOrderType(_appStore.settingsStore.walletListOrder);
reaction((_) => _appStore.wallet, (_) => updateList()); reaction((_) => _appStore.wallet, (_) => updateList());
@ -39,7 +37,6 @@ abstract class WalletListViewModelBase with Store {
final AppStore _appStore; final AppStore _appStore;
final Box<WalletInfo> _walletInfoSource; final Box<WalletInfo> _walletInfoSource;
final WalletLoadingService _walletLoadingService; final WalletLoadingService _walletLoadingService;
final AuthService _authService;
WalletType get currentWalletType => _appStore.wallet!.type; WalletType get currentWalletType => _appStore.wallet!.type;
@ -160,8 +157,4 @@ abstract class WalletListViewModelBase with Store {
break; break;
} }
} }
Future<bool> checkIfAuthRequired() async {
return _authService.requireAuth();
}
} }

View file

@ -763,5 +763,6 @@
"receivable_balance": "التوازن القادم", "receivable_balance": "التوازن القادم",
"confirmed_tx": "مؤكد", "confirmed_tx": "مؤكد",
"transaction_details_source_address": "عنوان المصدر", "transaction_details_source_address": "عنوان المصدر",
"pause_wallet_creation": ".ﺎﻴًﻟﺎﺣ ﺎﺘًﻗﺆﻣ ﺔﻔﻗﻮﺘﻣ Haven Wallet ءﺎﺸﻧﺇ ﻰﻠﻋ ﺓﺭﺪﻘﻟﺍ" "pause_wallet_creation": ".ﺎﻴًﻟﺎﺣ ﺎﺘًﻗﺆﻣ ﺔﻔﻗﻮﺘﻣ Haven Wallet ءﺎﺸﻧﺇ ﻰﻠﻋ ﺓﺭﺪﻘﻟﺍ",
"camera_consent": ".ﻞﻴﺻﺎﻔﺘﻟﺍ ﻰﻠﻋ ﻝﻮﺼﺤﻠﻟ ﻢﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺔﻴﺻﻮﺼﺨﻟﺍ ﺔﺳﺎﻴﺳ ﻦﻣ ﻖﻘﺤﺘﻟﺍ ﻰﺟﺮﻳ .${provider} ﻝﻮﻠ"
} }

View file

@ -759,5 +759,6 @@
"receivable_balance": "Баланс за вземания", "receivable_balance": "Баланс за вземания",
"confirmed_tx": "Потвърдено", "confirmed_tx": "Потвърдено",
"transaction_details_source_address": "Адрес на източника", "transaction_details_source_address": "Адрес на източника",
"pause_wallet_creation": "Възможността за създаване на Haven Wallet в момента е на пауза." "pause_wallet_creation": "Възможността за създаване на Haven Wallet в момента е на пауза.",
"camera_consent": "Вашият фотоапарат ще бъде използван за заснемане на изображение с цел идентификация от ${provider}. Моля, проверете тяхната политика за поверителност за подробности."
} }

View file

@ -759,5 +759,6 @@
"receivable_balance": "Zůstatek pohledávek", "receivable_balance": "Zůstatek pohledávek",
"confirmed_tx": "Potvrzeno", "confirmed_tx": "Potvrzeno",
"transaction_details_source_address": "Zdrojová adresa", "transaction_details_source_address": "Zdrojová adresa",
"pause_wallet_creation": "Možnost vytvářet Haven Wallet je momentálně pozastavena." "pause_wallet_creation": "Možnost vytvářet Haven Wallet je momentálně pozastavena.",
"camera_consent": "Váš fotoaparát použije k pořízení snímku pro účely identifikace ${provider}. Podrobnosti najdete v jejich Zásadách ochrany osobních údajů."
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "Forderungsbilanz", "receivable_balance": "Forderungsbilanz",
"confirmed_tx": "Bestätigt", "confirmed_tx": "Bestätigt",
"transaction_details_source_address": "Quelladresse", "transaction_details_source_address": "Quelladresse",
"pause_wallet_creation": "Die Möglichkeit, Haven Wallet zu erstellen, ist derzeit pausiert." "pause_wallet_creation": "Die Möglichkeit, Haven Wallet zu erstellen, ist derzeit pausiert.",
"camera_consent": "Mit Ihrer Kamera wird bis zum ${provider} ein Bild zur Identifizierung aufgenommen. Weitere Informationen finden Sie in deren Datenschutzbestimmungen."
} }

View file

@ -768,5 +768,6 @@
"receivable_balance": "Receivable Balance", "receivable_balance": "Receivable Balance",
"confirmed_tx": "Confirmed", "confirmed_tx": "Confirmed",
"transaction_details_source_address": "Source address", "transaction_details_source_address": "Source address",
"pause_wallet_creation": "Ability to create Haven Wallet is currently paused." "pause_wallet_creation": "Ability to create Haven Wallet is currently paused.",
"camera_consent": "Your camera will be used to capture an image for identification purposes by ${provider}. Please check their Privacy Policy for details."
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "Saldo de cuentas por cobrar", "receivable_balance": "Saldo de cuentas por cobrar",
"confirmed_tx": "Confirmado", "confirmed_tx": "Confirmado",
"transaction_details_source_address": "Dirección de la fuente", "transaction_details_source_address": "Dirección de la fuente",
"pause_wallet_creation": "La capacidad para crear Haven Wallet está actualmente pausada." "pause_wallet_creation": "La capacidad para crear Haven Wallet está actualmente pausada.",
"camera_consent": "Su cámara será utilizada para capturar una imagen con fines de identificación por ${provider}. Consulte su Política de privacidad para obtener más detalles."
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "Solde de créances", "receivable_balance": "Solde de créances",
"confirmed_tx": "Confirmé", "confirmed_tx": "Confirmé",
"transaction_details_source_address": "Adresse source", "transaction_details_source_address": "Adresse source",
"pause_wallet_creation": "La possibilité de créer Haven Wallet est actuellement suspendue." "pause_wallet_creation": "La possibilité de créer Haven Wallet est actuellement suspendue.",
"camera_consent": "Votre appareil photo sera utilisé pour capturer une image à des fins d'identification par ${provider}. Veuillez consulter leur politique de confidentialité pour plus de détails."
} }

View file

@ -749,5 +749,6 @@
"receivable_balance": "Daidaituwa da daidaituwa", "receivable_balance": "Daidaituwa da daidaituwa",
"confirmed_tx": "Tabbatar", "confirmed_tx": "Tabbatar",
"transaction_details_source_address": "Adireshin Incord", "transaction_details_source_address": "Adireshin Incord",
"pause_wallet_creation": "A halin yanzu an dakatar da ikon ƙirƙirar Haven Wallet." "pause_wallet_creation": "A halin yanzu an dakatar da ikon ƙirƙirar Haven Wallet.",
"camera_consent": "Za a yi amfani da kyamarar ku don ɗaukar hoto don dalilai na tantancewa ta ${provider}. Da fatan za a duba Manufar Sirri don cikakkun bayanai."
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "प्राप्य शेष", "receivable_balance": "प्राप्य शेष",
"confirmed_tx": "की पुष्टि", "confirmed_tx": "की पुष्टि",
"transaction_details_source_address": "स्रोत पता", "transaction_details_source_address": "स्रोत पता",
"pause_wallet_creation": "हेवन वॉलेट बनाने की क्षमता फिलहाल रुकी हुई है।" "pause_wallet_creation": "हेवन वॉलेट बनाने की क्षमता फिलहाल रुकी हुई है।",
"camera_consent": "आपके कैमरे का उपयोग ${provider} द्वारा पहचान उद्देश्यों के लिए एक छवि कैप्चर करने के लिए किया जाएगा। विवरण के लिए कृपया उनकी गोपनीयता नीति जांचें।"
} }

View file

@ -765,5 +765,6 @@
"receivable_balance": "Stanje potraživanja", "receivable_balance": "Stanje potraživanja",
"confirmed_tx": "Potvrđen", "confirmed_tx": "Potvrđen",
"transaction_details_source_address": "Adresa izvora", "transaction_details_source_address": "Adresa izvora",
"pause_wallet_creation": "Mogućnost stvaranja novčanika Haven trenutno je pauzirana." "pause_wallet_creation": "Mogućnost stvaranja novčanika Haven trenutno je pauzirana.",
"camera_consent": "Vaš će fotoaparat koristiti za snimanje slike u svrhu identifikacije od strane ${provider}. Pojedinosti potražite u njihovoj politici privatnosti."
} }

View file

@ -755,5 +755,6 @@
"receivable_balance": "Saldo piutang", "receivable_balance": "Saldo piutang",
"confirmed_tx": "Dikonfirmasi", "confirmed_tx": "Dikonfirmasi",
"transaction_details_source_address": "Alamat sumber", "transaction_details_source_address": "Alamat sumber",
"pause_wallet_creation": "Kemampuan untuk membuat Haven Wallet saat ini dijeda." "pause_wallet_creation": "Kemampuan untuk membuat Haven Wallet saat ini dijeda.",
"camera_consent": "Kamera Anda akan digunakan untuk mengambil gambar untuk tujuan identifikasi oleh ${provider}. Silakan periksa Kebijakan Privasi mereka untuk detailnya."
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "Bilanciamento creditizio", "receivable_balance": "Bilanciamento creditizio",
"confirmed_tx": "Confermato", "confirmed_tx": "Confermato",
"transaction_details_source_address": "Indirizzo di partenza", "transaction_details_source_address": "Indirizzo di partenza",
"pause_wallet_creation": "La possibilità di creare Haven Wallet è attualmente sospesa." "pause_wallet_creation": "La possibilità di creare Haven Wallet è attualmente sospesa.",
"camera_consent": "La tua fotocamera verrà utilizzata per acquisire un'immagine a scopo identificativo da ${provider}. Si prega di controllare la loro Informativa sulla privacy per i dettagli."
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "売掛金残高", "receivable_balance": "売掛金残高",
"confirmed_tx": "確認済み", "confirmed_tx": "確認済み",
"transaction_details_source_address": "ソースアドレス", "transaction_details_source_address": "ソースアドレス",
"pause_wallet_creation": "Haven Wallet を作成する機能は現在一時停止されています。" "pause_wallet_creation": "Haven Wallet を作成する機能は現在一時停止されています。",
"camera_consent": "あなたのカメラは、${provider}_ までに識別目的で画像を撮影するために使用されます。詳細については、プライバシー ポリシーをご確認ください。"
} }

View file

@ -765,5 +765,6 @@
"receivable_balance": "채권 잔액", "receivable_balance": "채권 잔액",
"confirmed_tx": "확인", "confirmed_tx": "확인",
"transaction_details_source_address": "소스 주소", "transaction_details_source_address": "소스 주소",
"pause_wallet_creation": "Haven Wallet 생성 기능이 현재 일시 중지되었습니다." "pause_wallet_creation": "Haven Wallet 생성 기능이 현재 일시 중지되었습니다.",
"camera_consent": "귀하의 카메라는 ${provider}의 식별 목적으로 이미지를 캡처하는 데 사용됩니다. 자세한 내용은 해당 개인정보 보호정책을 확인하세요."
} }

View file

@ -765,5 +765,6 @@
"receivable_balance": "လက်ကျန်ငွေ", "receivable_balance": "လက်ကျန်ငွေ",
"confirmed_tx": "အတည်ပြုသည်", "confirmed_tx": "အတည်ပြုသည်",
"transaction_details_source_address": "အရင်းအမြစ်လိပ်စာ", "transaction_details_source_address": "အရင်းအမြစ်လိပ်စာ",
"pause_wallet_creation": "Haven Wallet ဖန်တီးနိုင်မှုကို လောလောဆယ် ခေတ္တရပ်ထားသည်။" "pause_wallet_creation": "Haven Wallet ဖန်တီးနိုင်မှုကို လောလောဆယ် ခေတ္တရပ်ထားသည်။",
"camera_consent": "မှတ်ပုံတင်ခြင်းရည်ရွယ်ချက်များအတွက် ${provider} တွင် သင့်ကင်မရာကို အသုံးပြုပါမည်။ အသေးစိတ်အတွက် ၎င်းတို့၏ ကိုယ်ရေးကိုယ်တာမူဝါဒကို စစ်ဆေးပါ။"
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "Het saldo", "receivable_balance": "Het saldo",
"confirmed_tx": "Bevestigd", "confirmed_tx": "Bevestigd",
"transaction_details_source_address": "Bron adres", "transaction_details_source_address": "Bron adres",
"pause_wallet_creation": "De mogelijkheid om Haven Wallet te maken is momenteel onderbroken." "pause_wallet_creation": "De mogelijkheid om Haven Wallet te maken is momenteel onderbroken.",
"camera_consent": "Uw camera wordt gebruikt om vóór ${provider} een beeld vast te leggen voor identificatiedoeleinden. Raadpleeg hun privacybeleid voor meer informatie."
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "Saldo należności", "receivable_balance": "Saldo należności",
"confirmed_tx": "Potwierdzony", "confirmed_tx": "Potwierdzony",
"transaction_details_source_address": "Adres źródłowy", "transaction_details_source_address": "Adres źródłowy",
"pause_wallet_creation": "Możliwość utworzenia Portfela Haven jest obecnie wstrzymana." "pause_wallet_creation": "Możliwość utworzenia Portfela Haven jest obecnie wstrzymana.",
"camera_consent": "Twój aparat zostanie użyty do przechwycenia obrazu w celach identyfikacyjnych przez ${provider}. Aby uzyskać szczegółowe informacje, sprawdź ich Politykę prywatności."
} }

View file

@ -766,5 +766,6 @@
"receivable_balance": "Saldo a receber", "receivable_balance": "Saldo a receber",
"confirmed_tx": "Confirmado", "confirmed_tx": "Confirmado",
"transaction_details_source_address": "Endereço de Origem", "transaction_details_source_address": "Endereço de Origem",
"pause_wallet_creation": "A capacidade de criar a Haven Wallet está atualmente pausada." "pause_wallet_creation": "A capacidade de criar a Haven Wallet está atualmente pausada.",
"camera_consent": "Sua câmera será usada para capturar uma imagem para fins de identificação por ${provider}. Por favor, verifique a Política de Privacidade para obter detalhes."
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "Баланс дебиторской задолженности", "receivable_balance": "Баланс дебиторской задолженности",
"confirmed_tx": "Подтвержденный", "confirmed_tx": "Подтвержденный",
"transaction_details_source_address": "Адрес источника", "transaction_details_source_address": "Адрес источника",
"pause_wallet_creation": "Возможность создания Haven Wallet в настоящее время приостановлена." "pause_wallet_creation": "Возможность создания Haven Wallet в настоящее время приостановлена.",
"camera_consent": "Ваша камера будет использоваться для захвата изображения в целях идентификации ${provider}. Пожалуйста, ознакомьтесь с их Политикой конфиденциальности для получения подробной информации."
} }

View file

@ -765,5 +765,6 @@
"receivable_balance": "ยอดลูกหนี้", "receivable_balance": "ยอดลูกหนี้",
"confirmed_tx": "ซึ่งยืนยันแล้ว", "confirmed_tx": "ซึ่งยืนยันแล้ว",
"transaction_details_source_address": "ที่อยู่แหล่งกำเนิด", "transaction_details_source_address": "ที่อยู่แหล่งกำเนิด",
"pause_wallet_creation": "ขณะนี้ความสามารถในการสร้าง Haven Wallet ถูกหยุดชั่วคราว" "pause_wallet_creation": "ขณะนี้ความสามารถในการสร้าง Haven Wallet ถูกหยุดชั่วคราว",
"camera_consent": "กล้องของคุณจะถูกนำมาใช้เพื่อจับภาพเพื่อวัตถุประสงค์ในการระบุตัวตนภายใน ${provider} โปรดตรวจสอบนโยบายความเป็นส่วนตัวเพื่อดูรายละเอียด"
} }

View file

@ -761,5 +761,6 @@
"receivable_balance": "Natatanggap na balanse", "receivable_balance": "Natatanggap na balanse",
"confirmed_tx": "Nakumpirma", "confirmed_tx": "Nakumpirma",
"transaction_details_source_address": "SOURCE ADDRESS", "transaction_details_source_address": "SOURCE ADDRESS",
"pause_wallet_creation": "Kasalukuyang naka-pause ang kakayahang gumawa ng Haven Wallet." "pause_wallet_creation": "Kasalukuyang naka-pause ang kakayahang gumawa ng Haven Wallet.",
"camera_consent": "Gagamitin ang iyong camera upang kumuha ng larawan para sa mga layunin ng pagkakakilanlan sa pamamagitan ng ${provider}. Pakisuri ang kanilang Patakaran sa Privacy para sa mga detalye."
} }

View file

@ -765,5 +765,6 @@
"receivable_balance": "Alacak bakiyesi", "receivable_balance": "Alacak bakiyesi",
"confirmed_tx": "Onaylanmış", "confirmed_tx": "Onaylanmış",
"transaction_details_source_address": "Kaynak adresi", "transaction_details_source_address": "Kaynak adresi",
"pause_wallet_creation": "Haven Cüzdanı oluşturma yeteneği şu anda duraklatıldı." "pause_wallet_creation": "Haven Cüzdanı oluşturma yeteneği şu anda duraklatıldı.",
"camera_consent": "Kameranız ${provider} tarihine kadar tanımlama amacıyla bir görüntü yakalamak için kullanılacaktır. Ayrıntılar için lütfen Gizlilik Politikalarını kontrol edin."
} }

View file

@ -767,5 +767,6 @@
"receivable_balance": "Баланс дебіторської заборгованості", "receivable_balance": "Баланс дебіторської заборгованості",
"confirmed_tx": "Підтверджений", "confirmed_tx": "Підтверджений",
"transaction_details_source_address": "Адреса джерела", "transaction_details_source_address": "Адреса джерела",
"pause_wallet_creation": "Можливість створення гаманця Haven зараз призупинено." "pause_wallet_creation": "Можливість створення гаманця Haven зараз призупинено.",
"camera_consent": "Ваша камера використовуватиметься для зйомки зображення з метою ідентифікації ${provider}. Будь ласка, ознайомтеся з їхньою політикою конфіденційності, щоб дізнатися більше."
} }

View file

@ -759,5 +759,6 @@
"receivable_balance": "قابل وصول توازن", "receivable_balance": "قابل وصول توازن",
"confirmed_tx": "تصدیق", "confirmed_tx": "تصدیق",
"transaction_details_source_address": "ماخذ ایڈریس", "transaction_details_source_address": "ماخذ ایڈریس",
"pause_wallet_creation": "Haven Wallet ۔ﮯﮨ ﻑﻮﻗﻮﻣ ﻝﺎﺤﻟﺍ ﯽﻓ ﺖﯿﻠﮨﺍ ﯽﮐ ﮯﻧﺎﻨﺑ" "pause_wallet_creation": "Haven Wallet ۔ﮯﮨ ﻑﻮﻗﻮﻣ ﻝﺎﺤﻟﺍ ﯽﻓ ﺖﯿﻠﮨﺍ ﯽﮐ ﮯﻧﺎﻨﺑ",
"camera_consent": "۔ﮟﯿﮭﮑﯾﺩ ﯽﺴﯿﻟﺎﭘ ﯽﺴﯾﻮﯿﺋﺍﺮﭘ ﯽﮐ ﻥﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﺕﻼ${provider}ﯿﺼﻔﺗ ۔ﺎﮔ ﮯﺋﺎﺟ ﺎﯿﮐ ﻝﺎﻤﻌﺘﺳﺍ ﮯﯿﻟ"
} }

View file

@ -761,5 +761,6 @@
"receivable_balance": "Iwontunws.funfun ti o gba", "receivable_balance": "Iwontunws.funfun ti o gba",
"confirmed_tx": "Jẹrisi", "confirmed_tx": "Jẹrisi",
"transaction_details_source_address": "Adirẹsi orisun", "transaction_details_source_address": "Adirẹsi orisun",
"pause_wallet_creation": "Agbara lati ṣẹda Haven Wallet ti wa ni idaduro lọwọlọwọ." "pause_wallet_creation": "Agbara lati ṣẹda Haven Wallet ti wa ni idaduro lọwọlọwọ.",
"camera_consent": "Kamẹra rẹ yoo ṣee lo lati ya aworan kan fun awọn idi idanimọ nipasẹ ${provider}. Jọwọ ṣayẹwo Ilana Aṣiri wọn fun awọn alaye."
} }

View file

@ -766,5 +766,6 @@
"receivable_balance": "应收余额", "receivable_balance": "应收余额",
"confirmed_tx": "确认的", "confirmed_tx": "确认的",
"transaction_details_source_address": "源地址", "transaction_details_source_address": "源地址",
"pause_wallet_creation": "创建 Haven 钱包的功能当前已暂停。" "pause_wallet_creation": "创建 Haven 钱包的功能当前已暂停。",
"camera_consent": "${provider} 将使用您的相机拍摄图像以供识别之用。请查看他们的隐私政策了解详情。"
} }