Finalize UI for Tokens

This commit is contained in:
OmarHatem 2023-06-23 00:17:54 +03:00
parent 1c3b433309
commit 22eecea24e
43 changed files with 844 additions and 171 deletions

View file

@ -11,8 +11,18 @@ class Erc20Token extends HiveObject with Keyable {
final String symbol;
@HiveField(2)
final String contractAddress;
@HiveField(3)
final int decimal;
@HiveField(4, defaultValue: false)
final bool enabled;
Erc20Token({required this.name, required this.symbol, required this.contractAddress});
Erc20Token({
required this.name,
required this.symbol,
required this.contractAddress,
required this.decimal,
this.enabled = false,
});
static const typeId = 12;
static const boxName = 'Erc20Tokens';
@ -20,10 +30,13 @@ class Erc20Token extends HiveObject with Keyable {
@override
bool operator ==(other) =>
other is Erc20Token &&
(other.name == name && other.symbol == symbol && other.contractAddress == contractAddress);
(other.name == name &&
other.symbol == symbol &&
other.contractAddress == contractAddress &&
other.decimal == decimal);
@override
int get hashCode => name.hashCode ^ symbol.hashCode ^ contractAddress.hashCode;
int get hashCode => name.hashCode ^ symbol.hashCode ^ contractAddress.hashCode ^ decimal.hashCode;
@override
dynamic get keyIndex {

View file

@ -3,7 +3,7 @@ import 'dart:math';
import 'package:cw_core/crypto_currency.dart';
import 'package:cw_ethereum/ethereum_balance.dart';
import 'package:cw_ethereum/models/erc20_token.dart';
import 'package:cw_core/erc20_token.dart';
import 'package:cw_ethereum/pending_ethereum_transaction.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart';
@ -13,6 +13,7 @@ import 'package:cw_core/node.dart';
import 'package:cw_ethereum/ethereum_transaction_priority.dart';
class EthereumClient {
// TODO: Remove
static const Map<CryptoCurrency, String> _erc20Currencies = {
CryptoCurrency.usdc: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
CryptoCurrency.usdterc20: "0xdac17f958d2ee523a2206206994597c13d831ec7",
@ -225,12 +226,22 @@ I/flutter ( 4474): Gas Used: 53000
return ERC20Balance(balance, exponent: exponent);
}
Future<Erc20Token> addErc20Token(String contractAddress) async {
final erc20 = Erc20(address: EthereumAddress.fromHex(contractAddress), client: _client!);
final name = await erc20.name();
final symbol = await erc20.symbol();
Future<Erc20Token?> getErc20Token(String contractAddress) async {
try {
final erc20 = Erc20(address: EthereumAddress.fromHex(contractAddress), client: _client!);
final name = await erc20.name();
final symbol = await erc20.symbol();
final decimal = await erc20.decimals();
return Erc20Token(name: name, symbol: symbol, contractAddress: contractAddress);
return Erc20Token(
name: name,
symbol: symbol,
contractAddress: contractAddress,
decimal: decimal.toInt(),
);
} catch (e) {
return null;
}
}
void stop() {

View file

@ -19,7 +19,7 @@ import 'package:cw_ethereum/ethereum_transaction_info.dart';
import 'package:cw_ethereum/ethereum_transaction_priority.dart';
import 'package:cw_ethereum/ethereum_wallet_addresses.dart';
import 'package:cw_ethereum/file.dart';
import 'package:cw_ethereum/models/erc20_token.dart';
import 'package:cw_core/erc20_token.dart';
import 'package:hive/hive.dart';
import 'package:hex/hex.dart';
import 'package:mobx/mobx.dart';
@ -298,14 +298,21 @@ abstract class EthereumWalletBase
))
.toList();
Future<CryptoCurrency> addErc20Token(String contractAddress) async {
final token = await _client.addErc20Token(contractAddress);
Future<CryptoCurrency?> addErc20Token(String contractAddress) async {
final token = await _client.getErc20Token(contractAddress);
if (token == null) {
return null;
}
erc20TokensBox.add(token);
return CryptoCurrency(name: token.name, title: token.symbol, fullName: token.name);
}
Future<Erc20Token?> getErc20Token(String contractAddress) async =>
await _client.getErc20Token(contractAddress);
void _onNewTransaction(FilterEvent event) {
_updateBalance();
// TODO: Add in transaction history

View file

@ -224,6 +224,8 @@ class BackupService {
final currentDefaultSettingsMigrationVersion = data[PreferencesKey.currentDefaultSettingsMigrationVersion] as int?;
final moneroTransactionPriority = data[PreferencesKey.moneroTransactionPriority] as int?;
final bitcoinTransactionPriority = data[PreferencesKey.bitcoinTransactionPriority] as int?;
final sortBalanceTokensBy = data[PreferencesKey.sortBalanceBy] as int?;
final pinNativeTokenAtTop = data[PreferencesKey.pinNativeTokenAtTop] as bool?;
await _sharedPreferences.setString(PreferencesKey.currentWalletName,
currentWalletName);
@ -315,6 +317,12 @@ class BackupService {
await _sharedPreferences.setInt(PreferencesKey.bitcoinTransactionPriority,
bitcoinTransactionPriority);
if (sortBalanceTokensBy != null)
await _sharedPreferences.setInt(PreferencesKey.sortBalanceBy, sortBalanceTokensBy);
if (pinNativeTokenAtTop != null)
await _sharedPreferences.setBool(PreferencesKey.pinNativeTokenAtTop, pinNativeTokenAtTop);
await preferencesFile.delete();
}
@ -462,7 +470,11 @@ class BackupService {
PreferencesKey.moneroTransactionPriority:
_sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority),
PreferencesKey.currentFiatApiModeKey:
_sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey),
_sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey),
PreferencesKey.sortBalanceBy:
_sharedPreferences.getInt(PreferencesKey.sortBalanceBy),
PreferencesKey.pinNativeTokenAtTop:
_sharedPreferences.getBool(PreferencesKey.pinNativeTokenAtTop),
};
return json.encode(preferences);

View file

@ -17,6 +17,7 @@ import 'package:cake_wallet/src/screens/buy/webview_page.dart';
import 'package:cake_wallet/src/screens/dashboard/desktop_dashboard_page.dart';
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart';
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart';
import 'package:cake_wallet/src/screens/dashboard/edit_token_page.dart';
import 'package:cake_wallet/src/screens/dashboard/home_settings_page.dart';
import 'package:cake_wallet/src/screens/dashboard/widgets/transactions_page.dart';
import 'package:cake_wallet/src/screens/receive/anonpay_invoice_page.dart';
@ -70,6 +71,7 @@ import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart
import 'package:cake_wallet/view_model/settings/security_settings_view_model.dart';
import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart';
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart';
import 'package:cw_core/erc20_token.dart';
import 'package:cw_core/unspent_coins_info.dart';
import 'package:cake_wallet/core/backup_service.dart';
import 'package:cw_core/wallet_service.dart';
@ -239,9 +241,9 @@ Future setup({
getIt.registerSingletonAsync<SharedPreferences>(() => SharedPreferences.getInstance());
}
final isBitcoinBuyEnabled = (secrets.wyreSecretKey.isNotEmpty ?? false) &&
(secrets.wyreApiKey.isNotEmpty ?? false) &&
(secrets.wyreAccountId.isNotEmpty ?? false);
final isBitcoinBuyEnabled = (secrets.wyreSecretKey.isNotEmpty) &&
(secrets.wyreApiKey.isNotEmpty) &&
(secrets.wyreAccountId.isNotEmpty);
final settingsStore = await SettingsStoreBase.load(
nodeSource: _nodeSource,
@ -1019,5 +1021,12 @@ Future setup({
getIt.registerFactoryParam<HomeSettingsViewModel, BalanceViewModel, void>(
(balanceViewModel, _) => HomeSettingsViewModel(getIt.get<SettingsStore>(), balanceViewModel));
getIt.registerFactoryParam<EditTokenPage, HomeSettingsViewModel, Erc20Token?>(
(homeSettingsViewModel, token) => EditTokenPage(
homeSettingsViewModel: homeSettingsViewModel,
erc20token: token,
),
);
_isSetupFinished = true;
}

View file

@ -41,6 +41,7 @@ class PreferencesKey {
static const lastPopupDate = 'last_popup_date';
static const lastAppReviewDate = 'last_app_review_date';
static const sortBalanceBy = 'sort_balance_by';
static const pinNativeTokenAtTop = 'pin_native_token_at_top';

View file

@ -87,8 +87,14 @@ class CWEthereum extends Ethereum {
}
@override
Future<CryptoCurrency> addErc20Token(WalletBase wallet, String contractAddress) async {
Future<CryptoCurrency?> addErc20Token(WalletBase wallet, String contractAddress) async {
final ethereumWallet = wallet as EthereumWallet;
return await ethereumWallet.addErc20Token(contractAddress);
}
@override
Future<Erc20Token?> getErc20Token(WalletBase wallet, String contractAddress) async {
final ethereumWallet = wallet as EthereumWallet;
return await ethereumWallet.getErc20Token(contractAddress);
}
}

View file

@ -10,6 +10,7 @@ import 'package:cake_wallet/src/screens/backup/edit_backup_password_page.dart';
import 'package:cake_wallet/src/screens/buy/buy_webview_page.dart';
import 'package:cake_wallet/src/screens/buy/webview_page.dart';
import 'package:cake_wallet/src/screens/buy/pre_order_page.dart';
import 'package:cake_wallet/src/screens/dashboard/edit_token_page.dart';
import 'package:cake_wallet/src/screens/dashboard/home_settings_page.dart';
import 'package:cake_wallet/src/screens/restore/sweeping_wallet_page.dart';
import 'package:cake_wallet/src/screens/receive/anonpay_invoice_page.dart';
@ -306,7 +307,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
return CupertinoPageRoute<void>(
fullscreenDialog: true,
builder: (_) => getIt.get<SecurityBackupPage>());
case Routes.privacyPage:
return CupertinoPageRoute<void>(
fullscreenDialog: true,
@ -321,7 +322,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
return CupertinoPageRoute<void>(
fullscreenDialog: true,
builder: (_) => getIt.get<OtherSettingsPage>());
case Routes.newNode:
final args = settings.arguments as Map<String, dynamic>?;
return CupertinoPageRoute<void>(
@ -329,7 +330,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
param1: args?['editingNode'] as Node?,
param2: args?['isSelected'] as bool?));
case Routes.accountCreation:
return CupertinoPageRoute<String>(
@ -459,7 +460,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
fullscreenDialog: true,
builder: (_) => getIt.get<IoniaWelcomePage>(),
);
case Routes.ioniaLoginPage:
return CupertinoPageRoute<void>( builder: (_) => getIt.get<IoniaLoginPage>());
@ -473,7 +474,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.ioniaBuyGiftCardPage:
final args = settings.arguments as List;
return CupertinoPageRoute<void>(builder: (_) => getIt.get<IoniaBuyGiftCardPage>(param1: args));
case Routes.ioniaBuyGiftCardDetailPage:
final args = settings.arguments as List;
return CupertinoPageRoute<void>(builder: (_) => getIt.get<IoniaBuyGiftCardDetailPage>(param1: args));
@ -490,7 +491,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.ioniaAccountPage:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<IoniaAccountPage>());
case Routes.ioniaAccountCardsPage:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<IoniaAccountCardsPage>());
@ -501,11 +502,11 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.ioniaGiftCardDetailPage:
final args = settings.arguments as List;
return CupertinoPageRoute<void>(builder: (_) => getIt.get<IoniaGiftCardDetailPage>(param1: args.first));
case Routes.ioniaCustomRedeemPage:
final args = settings.arguments as List;
return CupertinoPageRoute<void>(builder: (_) => getIt.get<IoniaCustomRedeemPage>(param1: args));
case Routes.ioniaMoreOptionsPage:
final args = settings.arguments as List;
return CupertinoPageRoute<void>(builder: (_) => getIt.get<IoniaMoreOptionsPage>(param1: args));
@ -582,6 +583,17 @@ Route<dynamic> createRoute(RouteSettings settings) {
builder: (_) => getIt.get<HomeSettingsPage>(param1: settings.arguments),
);
case Routes.editToken:
final args = settings.arguments as Map<String, dynamic>;
return CupertinoPageRoute<void>(
settings: RouteSettings(name: Routes.editToken),
builder: (_) => getIt.get<EditTokenPage>(
param1: args['homeSettingsViewModel'],
param2: args['token'],
),
);
default:
return MaterialPageRoute<void>(
builder: (_) => Scaffold(

View file

@ -88,4 +88,5 @@ class Routes {
static const totpAuthCodePage = '/totp_auth_code_page';
static const modify2FAPage = '/modify_2fa_page';
static const homeSettings = '/home_settings';
static const editToken = '/edit_token';
}

View file

@ -0,0 +1,252 @@
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/widgets/address_text_field.dart';
import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/src/widgets/checkbox_widget.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
import 'package:cake_wallet/view_model/dashboard/home_settings_view_model.dart';
import 'package:cw_core/erc20_token.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class EditTokenPage extends BasePage {
EditTokenPage({Key? key, required this.homeSettingsViewModel, this.erc20token});
final HomeSettingsViewModel homeSettingsViewModel;
final Erc20Token? erc20token;
@override
String? get title => S.current.edit_token;
@override
Widget body(BuildContext context) {
return EditTokenPageBody(
homeSettingsViewModel: homeSettingsViewModel,
erc20token: erc20token,
);
}
}
class EditTokenPageBody extends StatefulWidget {
const EditTokenPageBody({Key? key, required this.homeSettingsViewModel, this.erc20token})
: super(key: key);
final HomeSettingsViewModel homeSettingsViewModel;
final Erc20Token? erc20token;
@override
State<EditTokenPageBody> createState() => _EditTokenPageBodyState();
}
class _EditTokenPageBodyState extends State<EditTokenPageBody> {
final TextEditingController _contractAddressController = TextEditingController();
final TextEditingController _tokenNameController = TextEditingController();
final TextEditingController _tokenSymbolController = TextEditingController();
final TextEditingController _tokenDecimalController = TextEditingController();
final FocusNode _contractAddressFocusNode = FocusNode();
final FocusNode _tokenNameFocusNode = FocusNode();
final FocusNode _tokenSymbolFocusNode = FocusNode();
final FocusNode _tokenDecimalFocusNode = FocusNode();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
bool _disclaimerChecked = false;
@override
void initState() {
super.initState();
if (widget.erc20token != null) {
_contractAddressController.text = widget.erc20token!.contractAddress;
_tokenNameController.text = widget.erc20token!.name;
_tokenSymbolController.text = widget.erc20token!.symbol;
_tokenDecimalController.text = widget.erc20token!.decimal.toString();
}
_contractAddressFocusNode.addListener(() {
if (!_contractAddressFocusNode.hasFocus) {
_getTokenInfo(_contractAddressController.text);
}
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: ScrollableWithBottomSection(
contentPadding: EdgeInsets.zero,
content: Padding(
padding: EdgeInsets.symmetric(horizontal: 25),
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(vertical: 16, horizontal: 24),
decoration: BoxDecoration(
color: Theme.of(context).accentTextTheme.bodySmall!.color!,
borderRadius: BorderRadius.circular(12),
),
child: Row(
children: [
Image.asset('assets/images/restore_keys.png'),
const SizedBox(width: 16),
Expanded(child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(S.of(context).warning),
Text(S.of(context).add_token_warning),
],
))
],
),
),
SizedBox(height: 50),
_tokenForm(),
],
),
),
bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
bottomSection: Column(
children: [
CheckboxWidget(
value: _disclaimerChecked,
caption: S.of(context).add_token_disclaimer_check,
onChanged: (value) {
_disclaimerChecked = value;
},
),
Row(
children: <Widget>[
Expanded(
child: PrimaryButton(
onPressed: () {
if (widget.erc20token != null) {
// widget.homeSettingsViewModel.deleteErc20Token(widget.erc20token!);
} else {
Navigator.pop(context);
}
},
text: widget.erc20token != null ? S.of(context).delete : S.of(context).cancel,
color: Colors.red,
textColor: Colors.white,
),
),
SizedBox(width: 20),
Expanded(
child: PrimaryButton(
onPressed: () async {
if (_formKey.currentState!.validate() && _disclaimerChecked) {
widget.homeSettingsViewModel.addErc20Token(_contractAddressController.text);
}
},
text: S.of(context).save,
color: Theme.of(context).accentTextTheme.bodyLarge!.color!,
textColor: Colors.white,
),
),
],
),
],
),
),
);
}
void _getTokenInfo(String? address) async {
if (address?.isNotEmpty ?? false) {
final token = await widget.homeSettingsViewModel.getErc20Token(address!);
if (token != null) {
if (_tokenNameController.text.isEmpty) _tokenNameController.text = token.name;
if (_tokenSymbolController.text.isEmpty) _tokenSymbolController.text = token.symbol;
if (_tokenDecimalController.text.isEmpty)
_tokenDecimalController.text = token.decimal.toString();
}
}
}
Future<void> _pasteText() async {
final value = await Clipboard.getData('text/plain');
if (value?.text?.isNotEmpty ?? false) {
_contractAddressController.text = value!.text!;
}
FocusScope.of(context).unfocus();
}
Widget _tokenForm() {
return Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
AddressTextField(
controller: _contractAddressController,
focusNode: _contractAddressFocusNode,
placeholder: S.of(context).token_contract_address,
options: [AddressTextFieldOption.paste],
buttonColor: Theme.of(context).hintColor,
validator: (text) {
if (text?.isNotEmpty ?? false) {
return null;
}
return 'S.of(context).field_required';
},
onPushPasteButton: (_) {
_pasteText();
},
),
const SizedBox(height: 8),
BaseTextFormField(
controller: _tokenNameController,
focusNode: _tokenNameFocusNode,
onSubmit: (_) => FocusScope.of(context).requestFocus(_tokenSymbolFocusNode),
textInputAction: TextInputAction.next,
hintText: S.of(context).token_name,
validator: (text) {
if (text?.isNotEmpty ?? false) {
return null;
}
return S.of(context).field_required;
},
),
const SizedBox(height: 8),
BaseTextFormField(
controller: _tokenSymbolController,
focusNode: _tokenSymbolFocusNode,
onSubmit: (_) => FocusScope.of(context).requestFocus(_tokenDecimalFocusNode),
textInputAction: TextInputAction.next,
hintText: S.of(context).token_symbol,
validator: (text) {
if (text?.isNotEmpty ?? false) {
return null;
}
return S.of(context).field_required;
},
),
const SizedBox(height: 8),
BaseTextFormField(
controller: _tokenDecimalController,
focusNode: _tokenDecimalFocusNode,
textInputAction: TextInputAction.done,
hintText: S.of(context).token_decimal,
validator: (text) {
if (text?.isNotEmpty ?? false) {
return null;
}
return S.of(context).field_required;
},
),
SizedBox(height: 24),
],
),
);
}
}

View file

@ -1,5 +1,6 @@
import 'package:cake_wallet/entities/sort_balance_types.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
@ -14,9 +15,8 @@ class HomeSettingsPage extends BasePage {
final TextEditingController _searchController = TextEditingController();
// TODO: add localization
@override
String? get title => "S.current.home_screen_settings";
String? get title => S.current.home_screen_settings;
@override
Widget body(BuildContext context) {
@ -25,60 +25,89 @@ class HomeSettingsPage extends BasePage {
children: [
Observer(
builder: (_) => SettingsPickerCell<SortBalanceBy>(
title: "S.current.sort_by",
title: S.current.sort_by,
items: SortBalanceBy.values,
selectedItem: _homeSettingsViewModel.sortBalanceBy,
onItemSelected: _homeSettingsViewModel.setSortBalanceBy,
),
),
Divider(color: Theme.of(context).primaryTextTheme.bodySmall!.decorationColor!),
Observer(
builder: (_) => SettingsSwitcherCell(
title: S.of(context).pin_at_top(_homeSettingsViewModel.nativeToken),
value: _homeSettingsViewModel.pinNativeToken,
onValueChange: (_, bool value) {
_homeSettingsViewModel.setPinNativeToken(value);
},
),
),
Divider(color: Theme.of(context).primaryTextTheme.bodySmall!.decorationColor!),
Row(
children: [
Expanded(
child: TextFormField(
controller: _searchController,
style: TextStyle(color: Theme.of(context).primaryTextTheme.titleLarge!.color!),
decoration: InputDecoration(
hintText: "S.of(context).search_token",
prefixIcon: Image.asset("assets/images/search_icon.png"),
filled: true,
fillColor: Theme.of(context).accentTextTheme.displaySmall!.color!,
alignLabelWithHint: false,
contentPadding: const EdgeInsets.symmetric(vertical: 4, horizontal: 16),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(14),
borderSide: const BorderSide(color: Colors.transparent),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(14),
borderSide: const BorderSide(color: Colors.transparent),
child: Padding(
padding: const EdgeInsetsDirectional.only(start: 16),
child: TextFormField(
controller: _searchController,
style: TextStyle(color: Theme.of(context).primaryTextTheme.titleLarge!.color!),
decoration: InputDecoration(
hintText: S.of(context).search_add_token,
prefixIcon: Image.asset("assets/images/search_icon.png"),
filled: true,
fillColor: Theme.of(context).accentTextTheme.displaySmall!.color!,
alignLabelWithHint: false,
contentPadding: const EdgeInsets.symmetric(vertical: 4, horizontal: 16),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(30),
borderSide: const BorderSide(color: Colors.transparent),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(30),
borderSide: const BorderSide(color: Colors.transparent),
),
),
),
),
),
IconButton(
onPressed: () {},
style: IconButton.styleFrom(
shape: CircleBorder(),
backgroundColor: Theme.of(context).accentTextTheme.bodySmall!.color!,
),
icon: Icon(
RawMaterialButton(
onPressed: () async {
Navigator.pushNamed(context, Routes.editToken,
arguments: {'homeSettingsViewModel': _homeSettingsViewModel});
},
elevation: 0,
fillColor: Theme.of(context).accentTextTheme.bodySmall!.color!,
child: Icon(
Icons.add,
color: Theme.of(context).primaryTextTheme.titleLarge!.color!,
size: 22.0,
),
padding: EdgeInsets.all(12),
shape: CircleBorder(),
splashColor: Theme.of(context).accentTextTheme.bodySmall!.color!,
),
],
),
ListView.builder(
itemCount: _homeSettingsViewModel.tokens.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return SettingsSwitcherCell(
title: _homeSettingsViewModel.tokens[index],
value: false,
onValueChange: (_, bool value) {},
);
},
Observer(
builder: (_) => ListView.builder(
itemCount: _homeSettingsViewModel.tokens.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return Container(
margin: EdgeInsets.only(top: 16, left: 16, right: 16),
child: Observer(
builder: (_) => SettingsSwitcherCell(
title: _homeSettingsViewModel.tokens[index],
value: false,
onValueChange: (_, bool value) {},
decoration: BoxDecoration(
color: Theme.of(context).accentTextTheme.bodySmall!.color!,
borderRadius: BorderRadius.circular(30),
),
),
),
);
},
),
),
],
),

View file

@ -4,8 +4,8 @@ import 'package:cake_wallet/src/widgets/standard_switch.dart';
class SettingsSwitcherCell extends StandardListRow {
SettingsSwitcherCell(
{required String title, required this.value, this.onValueChange})
: super(title: title, isSelected: false);
{required String title, required this.value, this.onValueChange, Decoration? decoration})
: super(title: title, isSelected: false, decoration: decoration);
final bool value;
final void Function(BuildContext context, bool value)? onValueChange;

View file

@ -1,13 +1,8 @@
import 'dart:ui';
import 'package:cake_wallet/palette.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class CheckboxWidget extends StatefulWidget {
CheckboxWidget({
required this.value,
required this.caption,
required this.onChanged});
CheckboxWidget({required this.value, required this.caption, required this.onChanged});
final bool value;
final String caption;
@ -35,46 +30,44 @@ class CheckboxWidgetState extends State<CheckboxWidget> {
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
height: 16,
width: 16,
height: 19,
width: 19,
decoration: BoxDecoration(
color: value
? Palette.blueCraiola
: Theme.of(context).accentTextTheme.displayMedium!.decorationColor!,
borderRadius: BorderRadius.all(Radius.circular(2)),
border: Border.all(
color: value
? Palette.blueCraiola
: Theme.of(context)
.accentTextTheme!
.titleMedium!
.decorationColor!,
borderRadius: BorderRadius.all(Radius.circular(2)),
border: Border.all(
color: value
? Palette.blueCraiola
: Theme.of(context)
.accentTextTheme!
.labelSmall!
.color!,
width: 1)),
: Theme.of(context).accentTextTheme.labelSmall!.color!,
width: 1,
),
),
child: value
? Center(
child: Icon(
Icons.done,
color: Colors.white,
size: 14,
),
)
: Offstage(),
child: Icon(
Icons.done,
color: Colors.white,
size: 14,
),
)
: null,
),
Padding(
padding: EdgeInsets.only(left: 16),
child: Text(
caption,
style: TextStyle(
color: Theme.of(context).primaryTextTheme!.titleLarge!.color!,
fontSize: 18,
fontFamily: 'Lato',
fontWeight: FontWeight.w500,
decoration: TextDecoration.none
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.only(start: 16),
child: Text(
caption,
style: TextStyle(
color: Theme.of(context).primaryTextTheme.titleLarge!.color!,
fontSize: 18,
fontFamily: 'Lato',
fontWeight: FontWeight.w500,
decoration: TextDecoration.none),
),
),
)
@ -82,4 +75,4 @@ class CheckboxWidgetState extends State<CheckboxWidget> {
),
);
}
}
}

View file

@ -5,11 +5,12 @@ import 'package:flutter/material.dart';
class StandardListRow extends StatelessWidget {
StandardListRow(
{required this.title, required this.isSelected, this.onTap});
{required this.title, required this.isSelected, this.onTap, this.decoration});
final String title;
final bool isSelected;
final void Function(BuildContext context)? onTap;
final Decoration? decoration;
@override
Widget build(BuildContext context) {
@ -19,9 +20,11 @@ class StandardListRow extends StatelessWidget {
return InkWell(
onTap: () => onTap?.call(context),
child: Container(
color: _backgroundColor(context),
height: 56,
padding: EdgeInsets.only(left: 24, right: 24),
decoration: decoration ?? BoxDecoration(
color: _backgroundColor(context),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
@ -54,7 +57,7 @@ class StandardListRow extends StatelessWidget {
Color titleColor(BuildContext context) => isSelected
? Palette.blueCraiola
: Theme.of(context).primaryTextTheme!.titleLarge!.color!;
: Theme.of(context).primaryTextTheme.titleLarge!.color!;
Color _backgroundColor(BuildContext context) {
return Theme.of(context).colorScheme.background;
@ -89,7 +92,7 @@ class StandardListSeparator extends StatelessWidget {
child: Container(
height: height,
color: Theme.of(context)
.primaryTextTheme!
.primaryTextTheme
.titleLarge
?.backgroundColor));
}

View file

@ -59,6 +59,7 @@ abstract class SettingsStoreBase with Store {
required this.actionlistDisplayMode,
required this.pinTimeOutDuration,
required this.sortBalanceBy,
required this.pinNativeTokenAtTop,
TransactionPriority? initialBitcoinTransactionPriority,
TransactionPriority? initialMoneroTransactionPriority,
TransactionPriority? initialHavenTransactionPriority,
@ -221,6 +222,11 @@ abstract class SettingsStoreBase with Store {
(SortBalanceBy sortBalanceBy) =>
_sharedPreferences.setInt(PreferencesKey.sortBalanceBy, sortBalanceBy.index));
reaction(
(_) => pinNativeTokenAtTop,
(bool pinNativeTokenAtTop) =>
_sharedPreferences.setBool(PreferencesKey.pinNativeTokenAtTop, pinNativeTokenAtTop));
this.nodes.observe((change) {
if (change.newValue != null && change.key != null) {
_saveCurrentNode(change.newValue!, change.key!);
@ -303,6 +309,9 @@ abstract class SettingsStoreBase with Store {
@observable
SortBalanceBy sortBalanceBy;
@observable
bool pinNativeTokenAtTop;
String appVersion;
String deviceName;
@ -405,6 +414,8 @@ abstract class SettingsStoreBase with Store {
: defaultPinCodeTimeOutDuration;
final sortBalanceBy =
SortBalanceBy.values[sharedPreferences.getInt(PreferencesKey.sortBalanceBy) ?? 0];
final pinNativeTokenAtTop =
sharedPreferences.getBool(PreferencesKey.pinNativeTokenAtTop) ?? false;
// If no value
if (pinLength == null || pinLength == 0) {
@ -476,6 +487,7 @@ abstract class SettingsStoreBase with Store {
pinTimeOutDuration: pinCodeTimeOutDuration,
initialLanguageCode: savedLanguageCode,
sortBalanceBy: sortBalanceBy,
pinNativeTokenAtTop: pinNativeTokenAtTop,
initialMoneroTransactionPriority: moneroTransactionPriority,
initialBitcoinTransactionPriority: bitcoinTransactionPriority,
initialHavenTransactionPriority: havenTransactionPriority,
@ -556,6 +568,7 @@ abstract class SettingsStoreBase with Store {
sharedPreferences.getBool(PreferencesKey.shouldShowYatPopup) ?? shouldShowYatPopup;
sortBalanceBy = SortBalanceBy
.values[sharedPreferences.getInt(PreferencesKey.sortBalanceBy) ?? sortBalanceBy.index];
pinNativeTokenAtTop = sharedPreferences.getBool(PreferencesKey.pinNativeTokenAtTop) ?? false;
final nodeId = sharedPreferences.getInt(PreferencesKey.currentNodeIdKey);
final bitcoinElectrumServerId =

View file

@ -132,9 +132,9 @@ class ExceptionHandler {
static const List<String> _ignoredErrors = const [
"Bad file descriptor",
"No space left on device",
"Write failed (OS Error: Broken pipe)",
"Write failed (OS Error: Broken pipe",
"Can't assign requested address",
"Read failed (OS Error: Socket is not connected)",
"Read failed (OS Error: Socket is not connected",
"Operation timed out",
"No route to host",
"Software caused connection abort",

View file

@ -1,7 +1,9 @@
import 'package:cake_wallet/entities/sort_balance_types.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/ethereum/ethereum.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart';
import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/erc20_token.dart';
import 'package:mobx/mobx.dart';
part 'home_settings_view_model.g.dart';
@ -9,8 +11,7 @@ part 'home_settings_view_model.g.dart';
class HomeSettingsViewModel = HomeSettingsViewModelBase with _$HomeSettingsViewModel;
abstract class HomeSettingsViewModelBase with Store {
HomeSettingsViewModelBase(this._settingsStore, this._balanceViewModel) {
}
HomeSettingsViewModelBase(this._settingsStore, this._balanceViewModel);
final SettingsStore _settingsStore;
final BalanceViewModel _balanceViewModel;
@ -21,9 +22,21 @@ abstract class HomeSettingsViewModelBase with Store {
@action
void setSortBalanceBy(SortBalanceBy value) => _settingsStore.sortBalanceBy = value;
@observable
bool pinNativeToken = false;
@computed
bool get pinNativeToken => _settingsStore.pinNativeTokenAtTop;
@action
void setPinNativeToken(bool value) => _settingsStore.pinNativeTokenAtTop = value;
@computed
List<String> get tokens =>
_balanceViewModel.balances.keys.map((e) => e.fullName ?? e.title).toList();
Future<CryptoCurrency?> addErc20Token(String contractAddress) async =>
await ethereum!.addErc20Token(_balanceViewModel.wallet, contractAddress);
Future<Erc20Token?> getErc20Token(String contractAddress) async =>
await ethereum!.getErc20Token(_balanceViewModel.wallet, contractAddress);
String get nativeToken => _balanceViewModel.wallet.currency.title;
}

View file

@ -725,5 +725,18 @@
"setup_2fa_text": "كعكة 2FA ليست آمنة مثل التخزين البارد. تحمي 2FA من الأنواع الأساسية للهجمات ، مثل قيام صديقك بتقديم بصمة إصبعك أثناء نومك. لا تحمي Cake 2FA من جهاز مخترق من قِبل مهاجم متطور. إذا فقدت الوصول إلى رموز 2FA الخاصة بك ، ستفقد إمكانية الوصول إلى هذه المحفظة. سوف تحتاج إلى استعادة محفظتك من بذرة ذاكري. يجب عليك بالتالي الاحتفاظ بنسخة احتياطية من بذور الذاكرة الخاصة بك! علاوة على ذلك ، سيتمكن أي شخص لديه حق الوصول إلى بذرة (بذور) ذاكري من سرقة أموالك ، متجاوزًا Cake 2FA. لن يتمكن فريق دعم الكيك من مساعدتك إذا فقدت الوصول إلى بذرتك ، نظرًا لأن Cake هي المحفظة غير الحافظة.",
"setup_totp_recommended": "إعداد TOTP (موصى به)",
"disable_buy": "تعطيل إجراء الشراء",
"disable_sell": "قم بتعطيل إجراء البيع"
"disable_sell": "قم بتعطيل إجراء البيع",
"home_screen_settings": "إعدادات الشاشة الرئيسية",
"sort_by": "ترتيب حسب",
"search_add_token": "بحث / إضافة رمز",
"edit_token": "تحرير الرمز المميز",
"warning": "تحذير",
"add_token_warning": "لا تقم بتحرير أو إضافة رموز وفقًا لتعليمات المحتالين. قم دائمًا بتأكيد عناوين الرموز مع مصادر حسنة السمعة!",
"add_token_disclaimer_check": "لقد قمت بتأكيد عنوان ومعلومات عقد الرمز المميز باستخدام مصدر حسن السمعة. يمكن أن تؤدي إضافة معلومات خبيثة أو غير صحيحة إلى خسارة الأموال.",
"token_contract_address": "عنوان عقد الرمز",
"token_name": "اسم الرمز ، على سبيل المثال: Tether",
"token_symbol": "رمز العملة ، على سبيل المثال: USDT",
"token_decimal": "رمز عشري",
"field_required": "هذه الخانة مطلوبه",
"pin_at_top": "تثبيت ${token} في الأعلى"
}

View file

@ -721,5 +721,18 @@
"setup_2fa_text": "Тортата 2FA НЕ е толкова сигурна, колкото хладилното съхранение. 2FA защитава срещу основни видове атаки, като например вашият приятел да предостави вашия пръстов отпечатък, докато спите.\n\n Cake 2FA НЕ защитава срещу компрометирано устройство от сложен хакер.\n\n Ако загубите достъп до своите 2FA кодове , ЩЕ ЗАГУБИТЕ ДОСТЪП ДО ТОЗИ ПОРТФЕЙЛ. Ще трябва да възстановите портфейла си от мнемонично семе. ЗАТОВА ТРЯБВА ДА НАПРАВИТЕ РЕЗЕРВНО КОПИЕ НА ВАШИТЕ МНЕМОНИЧНИ СЕМЕНА! Освен това, някой с достъп до вашите мнемонични начални точки ще може да открадне вашите средства, заобикаляйки Cake 2FA.\n\n Персоналът по поддръжката на Cake няма да може да ви помогне, ако загубите достъп до вашите мнемонични начални стойности, тъй като Cake е портфейл без попечителство.",
"setup_totp_recommended": "Настройка на TOTP (препоръчително)",
"disable_buy": "Деактивирайте действието за покупка",
"disable_sell": "Деактивирайте действието за продажба"
"disable_sell": "Деактивирайте действието за продажба",
"home_screen_settings": "Настройки на началния екран",
"sort_by": "Сортирай по",
"search_add_token": "Търсене/Добавяне на токен",
"edit_token": "Редактиране на токена",
"warning": "Внимание",
"add_token_warning": "Не редактирайте и не добавяйте токени според инструкциите на измамниците. Винаги потвърждавайте адресите на токени с надеждни източници!",
"add_token_disclaimer_check": "Потвърдих адреса и информацията за токен договора, използвайки надежден източник. Добавянето на злонамерена или неправилна информация може да доведе до загуба на средства.",
"token_contract_address": "Адрес на токен договор",
"token_name": "Име на токена, напр.: Tether",
"token_symbol": "Символ на токена, напр.: USDT",
"token_decimal": "Токен десетичен",
"field_required": "Това поле е задължително",
"pin_at_top": "закачете ${token} отгоре"
}

View file

@ -721,5 +721,18 @@
"setup_2fa_text": "Cake 2FA NENÍ tak bezpečný jako skladování v chladu. 2FA chrání před základními typy útoků, jako je váš přítel, který vám poskytne otisk prstu, když spíte.\n\n Cake 2FA nechrání před napadením zařízení sofistikovaným útočníkem.\n\n Pokud ztratíte přístup ke svým kódům 2FA , ZTRÁTÍTE PŘÍSTUP K TÉTO PENĚŽENCE. Budete muset obnovit svou peněženku z mnemotechnického semínka. MUSÍTE TEDY ZÁLOHOVAT SVÉ MNEMONICKÉ SEMÉNKY! Kromě toho někdo s přístupem k vašemu mnemotechnickému semenu bude moci ukrást vaše finanční prostředky a obejít Cake 2FA.\n\n Pracovníci podpory Cake vám nebudou schopni pomoci, pokud ztratíte přístup k vašemu mnemotechnickému semenu, protože Cake je nevazební peněženka.",
"setup_totp_recommended": "Nastavit TOTP (doporučeno)",
"disable_buy": "Zakázat akci nákupu",
"disable_sell": "Zakázat akci prodeje"
"disable_sell": "Zakázat akci prodeje",
"home_screen_settings": "Nastavení domovské obrazovky",
"sort_by": "Seřazeno podle",
"search_add_token": "Hledat / Přidat token",
"edit_token": "Upravit token",
"warning": "Varování",
"add_token_warning": "Neupravujte ani nepřidávejte tokeny podle pokynů podvodníků. Vždy potvrďte adresy tokenů s renomovanými zdroji!",
"add_token_disclaimer_check": "Potvrdil jsem adresu a informace smlouvy o tokenu pomocí důvěryhodného zdroje. Přidání škodlivých nebo nesprávných informací může vést ke ztrátě finančních prostředků.",
"token_contract_address": "Adresa tokenové smlouvy",
"token_name": "Název tokenu např.: Tether",
"token_symbol": "Symbol tokenu, např.: USDT",
"token_decimal": "Token v desítkové soustavě",
"field_required": "Toto pole je povinné",
"pin_at_top": "špendlík ${token} nahoře"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA ist NICHT so sicher wie eine Kühllagerung. 2FA schützt vor grundlegenden Arten von Angriffen, z. B. wenn Ihr Freund Ihren Fingerabdruck bereitstellt, während Sie schlafen.\n\n Cake 2FA schützt NICHT vor einem kompromittierten Gerät durch einen raffinierten Angreifer.\n\n Wenn Sie den Zugriff auf Ihre 2FA-Codes verlieren , VERLIEREN SIE DEN ZUGANG ZU DIESEM WALLET. Sie müssen Ihre Brieftasche aus mnemonic Seed wiederherstellen. SIE MÜSSEN DESHALB IHRE MNEMONISCHEN SEEDS SICHERN! Außerdem kann jemand mit Zugriff auf Ihre mnemonischen Seed(s) Ihr Geld stehlen und Cake 2FA umgehen.\n\n Cake-Supportmitarbeiter können Ihnen nicht helfen, wenn Sie den Zugriff auf Ihre mnemonischen Seed(s) verlieren, da Cake ein Brieftasche ohne Verwahrung.",
"setup_totp_recommended": "TOTP einrichten (empfohlen)",
"disable_buy": "Kaufaktion deaktivieren",
"disable_sell": "Verkaufsaktion deaktivieren"
"disable_sell": "Verkaufsaktion deaktivieren",
"home_screen_settings": "Einstellungen für den Startbildschirm",
"sort_by": "Sortiere nach",
"search_add_token": "Token suchen / hinzufügen",
"edit_token": "Token bearbeiten",
"warning": "Warnung",
"add_token_warning": "Bearbeiten oder fügen Sie Token nicht gemäß den Anweisungen von Betrügern hinzu. Bestätigen Sie Token-Adressen immer mit seriösen Quellen!",
"add_token_disclaimer_check": "Ich habe die Adresse und Informationen zum Token-Vertrag anhand einer seriösen Quelle bestätigt. Das Hinzufügen böswilliger oder falscher Informationen kann zu einem Verlust von Geldern führen.",
"token_contract_address": "Token-Vertragsadresse",
"token_name": "Token-Name, z. B.: Tether",
"token_symbol": "Token-Symbol, z. B.: USDT",
"token_decimal": "Token-Dezimalzahl",
"field_required": "Dieses Feld ist erforderlich",
"pin_at_top": "Stecken Sie ${token} oben fest"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA is NOT as secure as cold storage. 2FA protects against basic types of attacks, such as your friend providing your fingerprint while you are sleeping.\n\n Cake 2FA does NOT protect against a compromised device by a sophisticated attacker.\n\n If you lose access to your 2FA codes, YOU WILL LOSE ACCESS TO THIS WALLET. You will need to restore your wallet from mnemonic seed. YOU MUST THEREFORE BACK UP YOUR MNEMONIC SEEDS! Further, someone with access to your mnemonic seed(s) will be able to steal your funds, bypassing Cake 2FA.\n\n Cake support staff will be unable to assist you if you lose access to your mnemonic seed, since Cake is a noncustodial wallet.",
"setup_totp_recommended": "Set up TOTP (Recommended)",
"disable_buy": "Disable buy action",
"disable_sell": "Disable sell action"
"disable_sell": "Disable sell action",
"home_screen_settings": "Home screen settings",
"sort_by": "Sort by",
"search_add_token": "Search / Add token",
"edit_token": "Edit token",
"warning": "Warning",
"add_token_warning": "Do not edit or add tokens as instructed by scammers. Always confirm token addresses with reputable sources!",
"add_token_disclaimer_check": "I have confirmed the token contract address and information using a reputable source. Adding malicious or incorrect information can result in a loss of funds.",
"token_contract_address": "Token contract address",
"token_name": "Token name eg: Tether",
"token_symbol": "Token symbol eg: USDT",
"token_decimal": "Token decimal",
"field_required": "This field is required",
"pin_at_top": "Pin ${token} at top"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA NO es tan seguro como el almacenamiento en frío. 2FA protege contra tipos básicos de ataques, como cuando un amigo proporciona su huella digital mientras usted duerme.\n\n Cake 2FA NO protege contra un dispositivo comprometido por un atacante sofisticado.\n\n Si pierde el acceso a sus códigos 2FA , PERDERÁS EL ACCESO A ESTA BILLETERA. Deberá restaurar su billetera desde la semilla mnemotécnica. ¡POR LO TANTO, DEBE HACER UNA COPIA DE SEGURIDAD DE SUS SEMILLAS MNEMÓNICAS! Además, alguien con acceso a sus semillas mnemotécnicas podrá robar sus fondos, sin pasar por Cake 2FA.\n\n El personal de soporte de Cake no podrá ayudarlo si pierde el acceso a su semilla mnemotécnica, ya que Cake es un billetera sin custodia.",
"setup_totp_recommended": "Configurar TOTP (Recomendado)",
"disable_buy": "Desactivar acción de compra",
"disable_sell": "Desactivar acción de venta"
"disable_sell": "Desactivar acción de venta",
"home_screen_settings": "Configuración de la pantalla de inicio",
"sort_by": "Ordenar por",
"search_add_token": "Buscar/Agregar token",
"edit_token": "Editar token",
"warning": "Advertencia",
"add_token_warning": "No edite ni agregue tokens según las instrucciones de los estafadores. ¡Confirme siempre las direcciones de los tokens con fuentes acreditadas!",
"add_token_disclaimer_check": "He confirmado la dirección del contrato del token y la información utilizando una fuente confiable. Agregar información maliciosa o incorrecta puede resultar en una pérdida de fondos.",
"token_contract_address": "Dirección de contrato de token",
"token_name": "Nombre del token, por ejemplo: Tether",
"token_symbol": "Símbolo de token, por ejemplo: USDT",
"token_decimal": "Token decimal",
"field_required": "Este campo es obligatorio",
"pin_at_top": "pin ${token} en la parte superior"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA (Authentification à 2 Facteurs) n'est PAS aussi sûr que le stockage à froid. Cake 2FA protège contre les attaques basiques, comme un ami fournissant votre empreinte digitale pendant que vous dormez.\n\n Cake 2FA ne protège PAS contre un appareil compromis par un attaquant sophistiqué.\n\n Si vous perdez l'accès à vos codes 2FA , VOUS PERDREZ L'ACCÈS À CE PORTEFEUILLE (WALLET). Vous devrez restaurer votre portefeuille à partir de sa phrase secrète (seed). VOUS DEVEZ DONC SAUVEGARDER VOTRE PHRASE SECRÈTE ! De plus, quelqu'un ayant accès à votre phrase secrète pourra voler vos fonds, en contournant Cake 2FA.\n\n Le personnel d'assistance de Cake ne pourra pas vous aider si vous perdez l'accès à votre phrase secrète, puisque Cake est un portefeuille non dépositaire (non custodial).",
"setup_totp_recommended": "Configurer TOTP (recommandé)",
"disable_buy": "Désactiver l'action d'achat",
"disable_sell": "Désactiver l'action de vente"
"disable_sell": "Désactiver l'action de vente",
"home_screen_settings": "Paramètres de l'écran d'accueil",
"sort_by": "Trier par",
"search_add_token": "Rechercher / Ajouter un jeton",
"edit_token": "Modifier le jeton",
"warning": "Avertissement",
"add_token_warning": "Ne modifiez pas ou n'ajoutez pas de jetons comme indiqué par les escrocs. Confirmez toujours les adresses de jeton auprès de sources fiables !",
"add_token_disclaimer_check": "J'ai confirmé l'adresse et les informations du contrat de jeton en utilisant une source fiable. L'ajout d'informations malveillantes ou incorrectes peut entraîner une perte de fonds.",
"token_contract_address": "Adresse du contrat de jeton",
"token_name": "Nom du jeton, par exemple : Tether",
"token_symbol": "Symbole de jeton, par exemple : USDT",
"token_decimal": "Décimal de jeton",
"field_required": "Ce champ est obligatoire",
"pin_at_top": "épingler ${token} en haut"
}

View file

@ -710,5 +710,18 @@
"show_market_place" :"Nuna dan kasuwa",
"prevent_screenshots": "Fada lambobi da jarrabobi na kayan lambobi",
"disable_buy": "Kashe alama",
"disable_sell": "Kashe karbuwa"
}
"disable_sell": "Kashe karbuwa",
"home_screen_settings": "Saitunan allo na gida",
"sort_by": "Kasa",
"search_add_token": "Bincika / Ƙara alama",
"edit_token": "Gyara alamar",
"warning": "Gargadi",
"add_token_warning": "Kar a gyara ko ƙara alamu kamar yadda masu zamba suka umarta. Koyaushe tabbatar da adiresoshin alamar tare da sanannun tushe!",
"add_token_disclaimer_check": "Na tabbatar da adireshin kwangilar alamar da bayanin ta amfani da ingantaccen tushe. Ƙara bayanan ƙeta ko kuskure na iya haifar da asarar kuɗi.",
"token_contract_address": "Adireshin kwangilar Token",
"token_name": "Alamar sunan misali: Tether",
"token_symbol": "Alamar alama misali: USDT",
"token_decimal": "Alamar ƙima",
"field_required": "wannan fillin ana bukatansa",
"pin_at_top": "pin ${token} a sama"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "केक 2FA कोल्ड स्टोरेज जितना सुरक्षित नहीं है। 2FA बुनियादी प्रकार के हमलों से बचाता है, जैसे कि आपका मित्र सोते समय आपको अपना फ़िंगरप्रिंट प्रदान करता है।\n\n Cake 2FA परिष्कृत हमलावर द्वारा किसी डिवाइस से छेड़छाड़ से रक्षा नहीं करता है।\n\n यदि आप अपने 2FA कोड तक पहुंच खो देते हैं , आप इस वॉलेट तक पहुंच खो देंगे। आपको अपने बटुए को स्मरणीय बीज से पुनर्स्थापित करने की आवश्यकता होगी। इसलिए आपको अपने स्मरणीय बीजों का बैकअप लेना चाहिए! इसके अलावा, आपके स्मरक बीज (बीजों) तक पहुंच रखने वाला कोई व्यक्ति केक 2FA को दरकिनार कर आपके धन की चोरी करने में सक्षम होगा। अप्रबंधित बटुआ।",
"setup_totp_recommended": "टीओटीपी सेट अप करें (अनुशंसित)",
"disable_buy": "खरीद कार्रवाई अक्षम करें",
"disable_sell": "बेचने की कार्रवाई अक्षम करें"
"disable_sell": "बेचने की कार्रवाई अक्षम करें",
"home_screen_settings": "होम स्क्रीन सेटिंग्स",
"sort_by": "इसके अनुसार क्रमबद्ध करें",
"search_add_token": "खोजें/टोकन जोड़ें",
"edit_token": "टोकन संपादित करें",
"warning": "चेतावनी",
"add_token_warning": "स्कैमर्स के निर्देशानुसार टोकन संपादित या जोड़ें न करें। हमेशा प्रतिष्ठित स्रोतों से टोकन पते की पुष्टि करें!",
"add_token_disclaimer_check": "मैंने एक प्रतिष्ठित स्रोत का उपयोग करके टोकन अनुबंध पते और जानकारी की पुष्टि की है। दुर्भावनापूर्ण या गलत जानकारी जोड़ने से धन की हानि हो सकती है।",
"token_contract_address": "टोकन अनुबंध पता",
"token_name": "टोकन नाम जैसे: टीथर",
"token_symbol": "टोकन प्रतीक जैसे: यूएसडीटी",
"token_decimal": "सांकेतिक दशमलव",
"field_required": "यह फ़ील्ड आवश्यक है",
"pin_at_top": "शीर्ष पर ${token} पिन करें"
}

View file

@ -727,10 +727,18 @@
"setup_2fa_text": "Torta 2FA NIJE sigurna kao hladno skladište. 2FA štiti od osnovnih vrsta napada, kao što je vaš prijatelj koji vam daje otisak prsta dok spavate.\n\n Cake 2FA NE štiti od kompromitiranog uređaja od strane sofisticiranog napadača.\n\n Ako izgubite pristup svojim 2FA kodovima , IZGUBIT ĆETE PRISTUP OVOM NOVČANIKU. Morat ćete obnoviti svoj novčanik iz mnemoničkog sjemena. STOGA MORATE NAPRAVITI SIGURNOSNE KOPIJE SVOJIH MNEMONIČKIH SJEMENA! Nadalje, netko tko ima pristup vašem mnemoničkom seedu(ima) moći će ukrasti vaša sredstva, zaobilazeći Cake 2FA.\n\n Cake osoblje za podršku neće vam moći pomoći ako izgubite pristup svom mnemoničkom seedu, budući da je Cake neskrbnički novčanik.",
"setup_totp_recommended": "Postavite TOTP (preporučeno)",
"disable_buy": "Onemogući kupnju",
"disable_sell": "Onemogući akciju prodaje"
"disable_sell": "Onemogući akciju prodaje",
"home_screen_settings": "Postavke početnog zaslona",
"sort_by": "Poredaj po",
"search_add_token": "Traži / Dodaj token",
"edit_token": "Uredi token",
"warning": "Upozorenje",
"add_token_warning": "Nemojte uređivati niti dodavati tokene prema uputama prevaranata. Uvijek potvrdite adrese tokena s uglednim izvorima!",
"add_token_disclaimer_check": "Potvrdio sam adresu i informacije o ugovoru o tokenu koristeći ugledni izvor. Dodavanje zlonamjernih ili netočnih informacija može dovesti do gubitka sredstava.",
"token_contract_address": "Adresa ugovora tokena",
"token_name": "Naziv tokena npr.: Tether",
"token_symbol": "Simbol tokena npr.: USDT",
"token_decimal": "Token decimalni",
"field_required": "ovo polje je obavezno",
"pin_at_top": "prikvači ${token} na vrh"
}

View file

@ -703,16 +703,18 @@
"setup_2fa_text": "Cake 2FA TIDAK seaman cold storage. 2FA melindungi dari jenis serangan dasar, seperti teman Anda memberikan sidik jari saat Anda sedang tidur.\n\n Cake 2FA TIDAK melindungi dari perangkat yang disusupi oleh penyerang canggih.\n\n Jika Anda kehilangan akses ke kode 2FA , ANDA AKAN KEHILANGAN AKSES KE DOMPET INI. Anda perlu memulihkan dompet Anda dari benih mnemonik. OLEH KARENA ITU, ANDA HARUS MENYIMPAN BIJI MNEMONIK ANDA! Selanjutnya, seseorang yang memiliki akses ke benih mnemonik Anda akan dapat mencuri dana Anda, melewati Cake 2FA.\n\n Staf pendukung Cake tidak akan dapat membantu Anda jika Anda kehilangan akses ke benih mnemonik Anda, karena Cake adalah dompet tanpa hak asuh.",
"setup_totp_recommended": "Siapkan TOTP (Disarankan)",
"disable_buy": "Nonaktifkan tindakan beli",
"disable_sell": "Nonaktifkan aksi jual"
"disable_sell": "Nonaktifkan aksi jual",
"home_screen_settings": "Pengaturan layar awal",
"sort_by": "Sortir dengan",
"search_add_token": "Cari / Tambahkan token",
"edit_token": "Mengedit token",
"warning": "Peringatan",
"add_token_warning": "Jangan mengedit atau menambahkan token seperti yang diinstruksikan oleh penipu. Selalu konfirmasikan alamat token dengan sumber tepercaya!",
"add_token_disclaimer_check": "Saya telah mengonfirmasi alamat dan informasi kontrak token menggunakan sumber yang memiliki reputasi baik. Menambahkan informasi jahat atau salah dapat mengakibatkan hilangnya dana.",
"token_contract_address": "Alamat kontrak token",
"token_name": "Nama token misalnya: Tether",
"token_symbol": "Simbol token misalnya: USDT",
"token_decimal": "Desimal token",
"field_required": "Bagian ini diperlukan",
"pin_at_top": "sematkan ${token} di atas"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA NON è sicuro come la cella frigorifera. 2FA protegge da tipi di attacchi di base, come il tuo amico che fornisce la tua impronta digitale mentre dormi.\n\n Cake 2FA NON protegge da un dispositivo compromesso da un aggressore sofisticato.\n\n Se perdi l'accesso ai tuoi codici 2FA , PERDERAI L'ACCESSO A QUESTO PORTAFOGLIO. Dovrai ripristinare il tuo portafoglio dal seme mnemonico. DOVETE QUINDI SOSTITUIRE I VOSTRI SEMI MNEMONICI! Inoltre, qualcuno con accesso ai tuoi seed mnemonici sarà in grado di rubare i tuoi fondi, aggirando Cake 2FA.\n\n Il personale di supporto di Cake non sarà in grado di aiutarti se perdi l'accesso al tuo seed mnemonico, poiché Cake è un portafoglio non detentivo.",
"setup_totp_recommended": "Imposta TOTP (consigliato)",
"disable_buy": "Disabilita l'azione di acquisto",
"disable_sell": "Disabilita l'azione di vendita"
"disable_sell": "Disabilita l'azione di vendita",
"home_screen_settings": "Impostazioni della schermata iniziale",
"sort_by": "Ordina per",
"search_add_token": "Cerca / Aggiungi token",
"edit_token": "Modifica token",
"warning": "Avvertimento",
"add_token_warning": "Non modificare o aggiungere token come indicato dai truffatori. Conferma sempre gli indirizzi dei token con fonti attendibili!",
"add_token_disclaimer_check": "Ho confermato l'indirizzo e le informazioni del contratto token utilizzando una fonte attendibile. L'aggiunta di informazioni dannose o errate può comportare una perdita di fondi.",
"token_contract_address": "Indirizzo del contratto token",
"token_name": "Nome del token, ad esempio: Tether",
"token_symbol": "Simbolo del token, ad esempio: USDT",
"token_decimal": "Decimale del token",
"field_required": "Questo campo è obbligatorio",
"pin_at_top": "fissa ${token} in alto"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA は、コールド ストレージほど安全ではありません。 2FA は、あなたが寝ているときに友人が指紋を提供するなどの基本的なタイプの攻撃から保護します。\n\n Cake 2FA は、巧妙な攻撃者による侵害されたデバイスから保護しません。\n\n 2FA コードにアクセスできなくなった場合、このウォレットにアクセスできなくなります。ニーモニック シードからウォレットを復元する必要があります。したがって、ニーモニック シードをバックアップする必要があります。さらに、あなたのニーモニック シードにアクセスできる誰かが、Cake 2FA をバイパスして、あなたの資金を盗むことができます。\n\n Cake は無印の財布。",
"setup_totp_recommended": "TOTP を設定する (推奨)",
"disable_buy": "購入アクションを無効にする",
"disable_sell": "販売アクションを無効にする"
}
"disable_sell": "販売アクションを無効にする",
"home_screen_settings": "ホーム画面の設定",
"sort_by": "並び替え",
"search_add_token": "トークンの検索/追加",
"edit_token": "トークンの編集",
"warning": "警告",
"add_token_warning": "詐欺師の指示に従ってトークンを編集または追加しないでください。 トークン アドレスは常に信頼できる情報源で確認してください。",
"add_token_disclaimer_check": "信頼できる情報源を使用して、トークン コントラクトのアドレスと情報を確認しました。 悪意のある情報や不正確な情報を追加すると、資金が失われる可能性があります。",
"token_contract_address": "トークンコントラクトアドレス",
"token_name": "トークン名 例: Tether",
"token_symbol": "トークンシンボル 例: USDT",
"token_decimal": "トークン10進数",
"field_required": "この項目は必須です",
"pin_at_top": "${token} を上部に固定します"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "케이크 2FA는 냉장 보관만큼 안전하지 않습니다. 2FA는 당신이 잠자는 동안 친구가 지문을 제공하는 것과 같은 기본적인 유형의 공격으로부터 보호합니다.\n\n Cake 2FA는 정교한 공격자에 의해 손상된 장치로부터 보호하지 않습니다.\n\n 2FA 코드에 대한 액세스 권한을 잃으면 , 이 지갑에 대한 액세스 권한을 잃게 됩니다. 니모닉 시드에서 지갑을 복원해야 합니다. 따라서 니모닉 시드를 백업해야 합니다! 또한 니모닉 시드에 액세스할 수 있는 사람이 Cake 2FA를 우회하여 자금을 훔칠 수 있습니다.\n\n 니모닉 시드에 대한 액세스 권한을 잃으면 Cake 지원 직원이 도와줄 수 없습니다. 비수탁 지갑.",
"setup_totp_recommended": "TOTP 설정(권장)",
"disable_buy": "구매 행동 비활성화",
"disable_sell": "판매 조치 비활성화"
"disable_sell": "판매 조치 비활성화",
"home_screen_settings": "홈 화면 설정",
"sort_by": "정렬 기준",
"search_add_token": "검색 / 토큰 추가",
"edit_token": "토큰 편집",
"warning": "경고",
"add_token_warning": "사기꾼의 지시에 따라 토큰을 편집하거나 추가하지 마십시오. 항상 신뢰할 수 있는 출처를 통해 토큰 주소를 확인하세요!",
"add_token_disclaimer_check": "신뢰할 수 있는 출처를 통해 토큰 컨트랙트 주소와 정보를 확인했습니다. 악의적이거나 잘못된 정보를 추가하면 자금 손실이 발생할 수 있습니다.",
"token_contract_address": "토큰 계약 주소",
"token_name": "토큰 이름 예: Tether",
"token_symbol": "토큰 기호 예: USDT",
"token_decimal": "토큰 십진수",
"field_required": "이 필드는 필수입니다",
"pin_at_top": "상단에 ${token} 고정"
}

View file

@ -727,17 +727,18 @@
"setup_2fa_text": "ကိတ်မုန့် 2FA သည် အအေးခန်းကဲ့သို့ မလုံခြုံပါ။ 2FA သည် သင်အိပ်နေစဉ်တွင် သင့်သူငယ်ချင်းသည် သင့်လက်ဗွေရာကို ပေးဆောင်ခြင်းကဲ့သို့သော အခြေခံတိုက်ခိုက်မှုအမျိုးအစားများကို ကာကွယ်ပေးပါသည်။\n\n Cake 2FA သည် ခေတ်မီဆန်းပြားသော တိုက်ခိုက်သူ၏ အန္တရာယ်ပြုသည့်စက်ပစ္စည်းကို မကာကွယ်ပါ။\n\n သင်၏ 2FA ကုဒ်များကို အသုံးပြုခွင့်ဆုံးရှုံးသွားပါက၊ ဤပိုက်ဆံအိတ်ကို သင်ဝင်ရောက်ခွင့်ဆုံးရှုံးလိမ့်မည်။ သင့်ပိုက်ဆံအိတ်ကို mnemonic မျိုးစေ့မှ ပြန်လည်ရယူရန် လိုအပ်မည်ဖြစ်သည်။ ထို့ကြောင့် သင်၏ MNEMONIC မျိုးစေ့များကို အရန်သိမ်းထားရပါမည်။ ထို့အပြင်၊ သင်၏ mnemonic မျိုးစေ့(များ) ကို အသုံးပြုခွင့်ရှိသူတစ်ဦးက Cake 2FA ကိုကျော်ဖြတ်ကာ သင့်ရန်ပုံငွေများကို ခိုးယူနိုင်ပါမည်။\n\n ကိတ်မုန့်သည် သင့် mnemonic မျိုးစေ့သို့ ဝင်ရောက်ခွင့်ဆုံးရှုံးသွားပါက သင့်အား ကူညီပေးနိုင်မည်မဟုတ်ပါ၊ အထိန်းအချုပ်မရှိသော ပိုက်ဆံအိတ်။",
"setup_totp_recommended": "TOTP ကို ​​စနစ်ထည့်သွင်းပါ (အကြံပြုထားသည်)",
"disable_buy": "ဝယ်ယူမှု လုပ်ဆောင်ချက်ကို ပိတ်ပါ။",
"disable_sell": "ရောင်းချခြင်းလုပ်ဆောင်ချက်ကို ပိတ်ပါ။"
"disable_sell": "ရောင်းချခြင်းလုပ်ဆောင်ချက်ကို ပိတ်ပါ။",
"home_screen_settings": "ပင်မစခရင် ဆက်တင်များ",
"sort_by": "အလိုက်စဥ်သည်",
"search_add_token": "ရှာဖွေရန် / တိုကင်ထည့်ပါ။",
"edit_token": "တိုကင်ကို တည်းဖြတ်ပါ။",
"warning": "သတိပေးချက်",
"add_token_warning": "လိမ်လည်သူများ ညွှန်ကြားထားသည့်အတိုင်း တိုကင်များကို တည်းဖြတ်ခြင်း သို့မဟုတ် မထည့်ပါနှင့်။ ဂုဏ်သိက္ခာရှိသော အရင်းအမြစ်များဖြင့် အမြဲတမ်း တိုကင်လိပ်စာများကို အတည်ပြုပါ။",
"add_token_disclaimer_check": "ဂုဏ်သိက္ခာရှိသော အရင်းအမြစ်ကို အသုံးပြု၍ တိုကင်စာချုပ်လိပ်စာနှင့် အချက်အလက်ကို ကျွန်ုပ်အတည်ပြုပြီးဖြစ်သည်။ အန္တရာယ်ရှိသော သို့မဟုတ် မမှန်ကန်သော အချက်အလက်များကို ထည့်သွင်းခြင်းသည် ရန်ပုံငွေများ ဆုံးရှုံးသွားနိုင်သည်။",
"token_contract_address": "တိုကင်စာချုပ်လိပ်စာ",
"token_name": "တိုကင်အမည် ဥပမာ- Tether",
"token_symbol": "တိုကင်သင်္ကေတ ဥပမာ- USDT",
"token_decimal": "တိုကင်ဒဿမ",
"field_required": "ဤစာကွက်လပ်မှာဖြည့်ရန်လိုအပ်ပါသည်",
"pin_at_top": "အပေါ်တွင် ${token} ပင်ထိုးပါ။"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA is NIET zo veilig als koude opslag. 2FA beschermt tegen basistypen aanvallen, zoals uw vriend die uw vingerafdruk geeft terwijl u slaapt.\n\n Cake 2FA biedt GEEN bescherming tegen een gecompromitteerd apparaat door een geavanceerde aanvaller.\n\n Als u de toegang tot uw 2FA-codes kwijtraakt , VERLIEST U DE TOEGANG TOT DEZE PORTEFEUILLE. U moet uw portemonnee herstellen van mnemonic seed. JE MOET DAAROM EEN BACK-UP MAKEN VAN JE MNEMONISCHE ZADEN! Verder kan iemand met toegang tot je geheugensteuntje(s) je geld stelen, waarbij Cake 2FA wordt omzeild.\n\n Het ondersteunend personeel van Cake kan je niet helpen als je de toegang tot je geheugensteuntje kwijtraakt, aangezien Cake een niet-bewaarbare portemonnee.",
"setup_totp_recommended": "TOTP instellen (aanbevolen)",
"disable_buy": "Koopactie uitschakelen",
"disable_sell": "Verkoopactie uitschakelen"
"disable_sell": "Verkoopactie uitschakelen",
"home_screen_settings": "Instellingen voor het startscherm",
"sort_by": "Sorteer op",
"search_add_token": "Token zoeken / toevoegen",
"edit_token": "Token bewerken",
"warning": "Waarschuwing",
"add_token_warning": "Bewerk of voeg geen tokens toe volgens de instructies van oplichters. Bevestig tokenadressen altijd met betrouwbare bronnen!",
"add_token_disclaimer_check": "Ik heb het adres en de informatie van het tokencontract bevestigd met behulp van een betrouwbare bron. Het toevoegen van kwaadaardige of onjuiste informatie kan leiden tot verlies van geld.",
"token_contract_address": "Token contractadres",
"token_name": "Tokennaam bijv.: Tether",
"token_symbol": "Tokensymbool bijv.: USDT",
"token_decimal": "Token decimaal",
"field_required": "dit veld is verplicht",
"pin_at_top": "speld ${token} bovenaan"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA NIE jest tak bezpieczny jak przechowywanie w chłodni. 2FA chroni przed podstawowymi typami ataków, takimi jak udostępnienie odcisku palca przez znajomego podczas snu.\n\n Cake 2FA NIE chroni przed zhakowanym urządzeniem przez wyrafinowanego atakującego.\n\n Jeśli utracisz dostęp do swoich kodów 2FA , UTRACISZ DOSTĘP DO TEGO PORTFELA. Będziesz musiał przywrócić swój portfel z mnemonicznego materiału siewnego. DLATEGO MUSISZ ZROBIĆ KOPIĘ SWOICH NASION MNEMONICZNYCH! Co więcej, ktoś z dostępem do twoich mnemonicznych nasion będzie mógł ukraść twoje fundusze, omijając Cake 2FA.\n\n Personel pomocniczy Cake nie będzie mógł ci pomóc, jeśli stracisz dostęp do swojego mnemonicznego seeda, ponieważ Cake jest portfel niezabezpieczony.",
"setup_totp_recommended": "Skonfiguruj TOTP (zalecane)",
"disable_buy": "Wyłącz akcję kupna",
"disable_sell": "Wyłącz akcję sprzedaży"
"disable_sell": "Wyłącz akcję sprzedaży",
"home_screen_settings": "Ustawienia ekranu głównego",
"sort_by": "Sortuj według",
"search_add_token": "Wyszukaj / Dodaj token",
"edit_token": "Edytuj token",
"warning": "Ostrzeżenie",
"add_token_warning": "Nie edytuj ani nie dodawaj tokenów zgodnie z instrukcjami oszustów. Zawsze potwierdzaj adresy tokenów z renomowanymi źródłami!",
"add_token_disclaimer_check": "Potwierdziłem adres kontraktu tokena i informacje, korzystając z renomowanego źródła. Dodanie złośliwych lub niepoprawnych informacji może spowodować utratę środków.",
"token_contract_address": "Adres kontraktu tokena",
"token_name": "Nazwa tokena, np.: Tether",
"token_symbol": "Symbol tokena np.: USDT",
"token_decimal": "Token dziesiętny",
"field_required": "To pole jest wymagane",
"pin_at_top": "przypnij ${token} na górze"
}

View file

@ -726,5 +726,18 @@
"setup_2fa_text": "O Cake 2FA NÃO é tão seguro quanto o armazenamento a frio. O 2FA protege contra tipos básicos de ataques, como seu amigo fornecer sua impressão digital enquanto você está dormindo.\n\n O Cake 2FA NÃO protege contra um dispositivo comprometido por um invasor sofisticado.\n\n Se você perder o acesso aos seus códigos 2FA , VOCÊ PERDERÁ O ACESSO A ESTA CARTEIRA. Você precisará restaurar sua carteira da semente mnemônica. VOCÊ DEVE, PORTANTO, FAZER BACKUP DE SUAS SEMENTES MNEMÔNICAS! Além disso, alguém com acesso às suas sementes mnemônicas poderá roubar seus fundos, ignorando o Cake 2FA.\n\n A equipe de suporte do Cake não poderá ajudá-lo se você perder o acesso à sua semente mnemônica, pois o Cake é um carteira não custodial.",
"setup_totp_recommended": "Configurar TOTP (recomendado)",
"disable_buy": "Desativar ação de compra",
"disable_sell": "Desativar ação de venda"
"disable_sell": "Desativar ação de venda",
"home_screen_settings": "Configurações da tela inicial",
"sort_by": "Ordenar por",
"search_add_token": "Pesquisar / Adicionar token",
"edit_token": "Editar símbolo",
"warning": "Aviso",
"add_token_warning": "Não edite ou adicione tokens de acordo com as instruções dos golpistas. Sempre confirme os endereços de token com fontes confiáveis!",
"add_token_disclaimer_check": "Confirmei o endereço e as informações do contrato de token usando uma fonte confiável. Adicionar informações maliciosas ou incorretas pode resultar em perda de fundos.",
"token_contract_address": "Endereço do contrato de token",
"token_name": "Nome do token, por exemplo: Tether",
"token_symbol": "Símbolo de token, por exemplo: USDT",
"token_decimal": "Token decimal",
"field_required": "Este campo é obrigatório",
"pin_at_top": "fixe ${token} no topo"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA НЕ так безопасен, как холодное хранилище. Двухфакторная аутентификация защищает от основных типов атак, таких как отпечаток вашего друга, когда вы спите.\n\n Двухфакторная аутентификация Cake НЕ защищает от взлома устройства опытным злоумышленником.\n\n Если вы потеряете доступ к своим кодам двухфакторной аутентификации. , ВЫ ПОТЕРЯЕТЕ ДОСТУП К ЭТОМУ КОШЕЛЬКУ. Вам нужно будет восстановить свой кошелек из мнемонической семени. ПОЭТОМУ ВЫ ДОЛЖНЫ СОЗДАТЬ РЕЗЕРВНУЮ ВЕРСИЮ СВОИХ МНЕМОНИКОВ! Кроме того, кто-то, имеющий доступ к вашему мнемоническому семени, сможет украсть ваши средства, минуя Cake 2FA.\n\n Персонал службы поддержки Cake не сможет помочь вам, если вы потеряете доступ к своему мнемоническому семени, поскольку Cake — это некастодиальный кошелек.",
"setup_totp_recommended": "Настроить TOTP (рекомендуется)",
"disable_buy": "Отключить действие покупки",
"disable_sell": "Отключить действие продажи"
"disable_sell": "Отключить действие продажи",
"home_screen_settings": "Настройки главного экрана",
"sort_by": "Сортировать по",
"search_add_token": "Поиск / Добавить токен",
"edit_token": "Изменить токен",
"warning": "Предупреждение",
"add_token_warning": "Не редактируйте и не добавляйте токены по указанию мошенников. Всегда подтверждайте адреса токенов из авторитетных источников!",
"add_token_disclaimer_check": "Я подтвердил адрес контракта токена и информацию, используя авторитетный источник. Добавление вредоносной или неверной информации может привести к потере средств.",
"token_contract_address": "Адрес контракта токена",
"token_name": "Имя токена, например: Tether",
"token_symbol": "Символ токена, например: USDT",
"token_decimal": "Десятичный токен",
"field_required": "Это поле обязательно к заполнению",
"pin_at_top": "закрепить ${token} вверху"
}

View file

@ -725,5 +725,18 @@
"setup_2fa_text": "Cake 2FA ไม่ปลอดภัยเท่าห้องเย็น 2FA ป้องกันการโจมตีประเภทพื้นฐาน เช่น เพื่อนของคุณให้ลายนิ้วมือขณะที่คุณนอนหลับ\n\n Cake 2FA ไม่ป้องกันอุปกรณ์ที่ถูกบุกรุกโดยผู้โจมตีที่เชี่ยวชาญ\n\n หากคุณสูญเสียการเข้าถึงรหัส 2FA ของคุณ คุณจะสูญเสียการเข้าถึงกระเป๋าเงินนี้ คุณจะต้องกู้คืนกระเป๋าเงินของคุณจากเมล็ดช่วยจำ คุณต้องสำรองเมล็ดความจำของคุณ! นอกจากนี้ ผู้ที่สามารถเข้าถึงเมล็ดช่วยจำของคุณจะสามารถขโมยเงินของคุณ โดยผ่าน Cake 2FA\n\n เจ้าหน้าที่ช่วยเหลือของ Cake จะไม่สามารถช่วยเหลือคุณได้ หากคุณสูญเสียการเข้าถึงเมล็ดช่วยจำ เนื่องจาก Cake เป็น กระเป๋าสตางค์ที่ไม่เป็นผู้ดูแล",
"setup_totp_recommended": "ตั้งค่า TOTP (แนะนำ)",
"disable_buy": "ปิดการใช้งานการซื้อ",
"disable_sell": "ปิดการใช้งานการขาย"
"disable_sell": "ปิดการใช้งานการขาย",
"home_screen_settings": "การตั้งค่าหน้าจอหลัก",
"sort_by": "เรียงตาม",
"search_add_token": "ค้นหา / เพิ่มโทเค็น",
"edit_token": "แก้ไขโทเค็น",
"warning": "คำเตือน",
"add_token_warning": "ห้ามแก้ไขหรือเพิ่มโทเค็นตามคำแนะนำของนักต้มตุ๋น ยืนยันที่อยู่โทเค็นกับแหล่งที่มาที่เชื่อถือได้เสมอ!",
"add_token_disclaimer_check": "ฉันได้ยืนยันที่อยู่และข้อมูลของสัญญาโทเค็นโดยใช้แหล่งข้อมูลที่เชื่อถือได้ การเพิ่มข้อมูลที่เป็นอันตรายหรือไม่ถูกต้องอาจทำให้สูญเสียเงินได้",
"token_contract_address": "ที่อยู่สัญญาโทเค็น",
"token_name": "ชื่อโทเค็น เช่น Tether",
"token_symbol": "สัญลักษณ์โทเค็น เช่น USDT",
"token_decimal": "โทเค็นทศนิยม",
"field_required": "ช่องนี้จำเป็น",
"pin_at_top": "ปักหมุด ${token} ที่ด้านบน"
}

View file

@ -727,5 +727,18 @@
"setup_2fa_text": "Cake 2FA, soğuk hava deposu kadar güvenli DEĞİLDİR. 2FA, siz uyurken arkadaşınızın parmak izinizi sağlaması gibi temel saldırı türlerine karşı koruma sağlar.\n\n Cake 2FA, gelişmiş bir saldırgan tarafından güvenliği ihlal edilmiş bir cihaza karşı koruma SAĞLAMAZ.\n\n 2FA kodlarınıza erişimi kaybederseniz , BU CÜZDANA ERİŞİMİNİZİ KAYBEDECEKSİNİZ. Mnemonic seed'den cüzdanınızı geri yüklemeniz gerekecek. BU NEDENLE HATIRLAYICI TOHUMLARINIZI YEDEKLEMELİSİNİZ! Ayrıca anımsatıcı tohumlarınıza erişimi olan biri, Cake 2FA'yı atlayarak paranızı çalabilir.\n\n Cake, anımsatıcı tohumlarınıza erişimi kaybederseniz size yardımcı olamaz, çünkü Cake bir saklama dışı cüzdan.",
"setup_totp_recommended": "TOTP'yi kurun (Önerilir)",
"disable_buy": "Satın alma işlemini devre dışı bırak",
"disable_sell": "Satış işlemini devre dışı bırak"
"disable_sell": "Satış işlemini devre dışı bırak",
"home_screen_settings": "Ana ekran ayarları",
"sort_by": "Göre sırala",
"search_add_token": "Belirteç Ara / Ekle",
"edit_token": "Belirteci düzenle",
"warning": "Uyarı",
"add_token_warning": "Dolandırıcıların talimatına göre jetonları düzenlemeyin veya eklemeyin. Belirteç adreslerini her zaman saygın kaynaklarla onaylayın!",
"add_token_disclaimer_check": "Belirteç sözleşmesi adresini ve bilgilerini saygın bir kaynak kullanarak onayladım. Kötü amaçlı veya yanlış bilgilerin eklenmesi para kaybına neden olabilir.",
"token_contract_address": "Token sözleşme adresi",
"token_name": "Belirteç adı, örneğin: Tether",
"token_symbol": "Jeton sembolü, örneğin: USDT",
"token_decimal": "Belirteç ondalık",
"field_required": "Bu alan gereklidir",
"pin_at_top": "${token} üstte sabitle"
}

View file

@ -726,5 +726,18 @@
"setup_2fa_text": "Торт 2FA НЕ такий безпечний, як холодне зберігання. 2FA захищає від основних типів атак, наприклад ваш друг надає ваш відбиток пальця, поки ви спите.\n\n Cake 2FA НЕ захищає від скомпрометованого пристрою досвідченим зловмисником.\n\n Якщо ви втратите доступ до своїх кодів 2FA , ВИ ВТРАТИТЕ ДОСТУП ДО ЦЬОГО ГАМАНЦЯ. Вам потрібно буде відновити свій гаманець з мнемонічного коду. ТОМУ ВИ ПОВИННІ СТВОРИТИ РЕЗЕРВНУ КОПІЮ СВОЇХ МНЕМОНІЧНИХ НАСІН! Крім того, хтось із доступом до ваших мнемонічних початкових значень зможе викрасти ваші кошти, оминаючи Cake 2FA.\n\n Співробітники служби підтримки Cake не зможуть вам допомогти, якщо ви втратите доступ до своїх мнемонічних вихідних даних, оскільки Cake є гаманець без опіки.",
"setup_totp_recommended": "Налаштувати TOTP (рекомендовано)",
"disable_buy": "Вимкнути дію покупки",
"disable_sell": "Вимкнути дію продажу"
"disable_sell": "Вимкнути дію продажу",
"home_screen_settings": "Налаштування головного екрана",
"sort_by": "Сортувати за",
"search_add_token": "Пошук / Додати маркер",
"edit_token": "Редагувати маркер",
"warning": "УВАГА",
"add_token_warning": "Не редагуйте та не додавайте токени за вказівками шахраїв. Завжди підтверджуйте адреси токенів у авторитетних джерелах!",
"add_token_disclaimer_check": "Я підтвердив адресу та інформацію щодо договору маркера, використовуючи авторитетне джерело. Додавання зловмисної або невірної інформації може призвести до втрати коштів.",
"token_contract_address": "Адреса договору маркера",
"token_name": "Назва токена, наприклад: Tether",
"token_symbol": "Символ маркера, наприклад: USDT",
"token_decimal": "Токен десятковий",
"field_required": "Це поле є обов'язковим",
"pin_at_top": "закріпити ${token} зверху"
}

View file

@ -722,5 +722,18 @@
"setup_2fa_text": "کیک 2FA کولڈ اسٹوریج کی طرح محفوظ نہیں ہے۔ 2FA بنیادی قسم کے حملوں سے حفاظت کرتا ہے، جیسے کہ آپ کا دوست آپ کے سوتے وقت آپ کے فنگر پرنٹ فراہم کرتا ہے۔\n\n کیک 2FA کسی جدید حملہ آور کے ذریعے سمجھوتہ کرنے والے آلہ سے حفاظت نہیں کرتا ہے۔\n\n اگر آپ اپنے 2FA کوڈز تک رسائی کھو دیتے ہیں ، آپ اس بٹوے تک رسائی سے محروم ہو جائیں گے۔ آپ کو یادداشت کے بیج سے اپنے بٹوے کو بحال کرنے کی ضرورت ہوگی۔ اس لیے آپ کو اپنے یادداشت کے بیجوں کا بیک اپ لینا چاہیے! اس کے علاوہ، آپ کے یادداشت کے بیج تک رسائی رکھنے والا کوئی شخص کیک 2FA کو نظرانداز کرتے ہوئے آپ کے فنڈز چرا سکے گا۔\n\n اگر آپ اپنے یادداشت کے بیج تک رسائی کھو دیتے ہیں تو کیک کا معاون عملہ آپ کی مدد نہیں کر سکے گا، کیونکہ کیک ایک ہے غیر نگہداشت پرس.",
"setup_totp_recommended": "TOTP ترتیب دیں (تجویز کردہ)",
"disable_buy": "خرید ایکشن کو غیر فعال کریں۔",
"disable_sell": "فروخت کی کارروائی کو غیر فعال کریں۔"
"disable_sell": "فروخت کی کارروائی کو غیر فعال کریں۔",
"home_screen_settings": "ہوم اسکرین کی ترتیبات",
"sort_by": "ترتیب دیں",
"search_add_token": "تلاش کریں / ٹوکن شامل کریں۔",
"edit_token": "ٹوکن میں ترمیم کریں۔",
"warning": "وارننگ",
"add_token_warning": "سکیمرز کی ہدایت کے مطابق ٹوکن میں ترمیم یا اضافہ نہ کریں۔ ہمیشہ معتبر ذرائع سے ٹوکن پتوں کی تصدیق کریں!",
"add_token_disclaimer_check": "میں نے ایک معتبر ذریعہ کا استعمال کرتے ہوئے ٹوکن کنٹریکٹ ایڈریس اور معلومات کی تصدیق کی ہے۔ بدنیتی پر مبنی یا غلط معلومات شامل کرنے کے نتیجے میں فنڈز ضائع ہو سکتے ہیں۔",
"token_contract_address": "ٹوکن کنٹریکٹ ایڈریس",
"token_name": "ٹوکن کا نام جیسے: Tether",
"token_symbol": "ٹوکن کی علامت جیسے: USDT",
"token_decimal": "ٹوکن اعشاریہ",
"field_required": "اس کو پر کرنا ضروری ہے",
"pin_at_top": "اوپر ${token} کو پن کریں۔"
}

View file

@ -681,7 +681,6 @@
"arrive_in_this_address" : "${currency} ${tag} máa dé sí àdírẹ́sì yìí",
"do_not_send": "Ẹ kò ránṣ",
"error_dialog_content": "Àṣìṣe ti dé.\n\nẸ jọ̀wọ́, fi àkọsílẹ̀ àṣìṣe ránṣẹ́ sí ẹgbẹ́ ìranlọ́wọ́ wa kí áàpù wa bá túbọ̀ dára.",
"scan_qr_code": "Yan QR koodu",
"cold_or_recover_wallet": "Fi owo aisan tabi yiyewo owo iwe iwe",
"please_wait": "Jọwọ saa",
"sweeping_wallet": "Fi owo iwe iwe wofo",
@ -723,5 +722,18 @@
"setup_2fa_text": "Cake 2FA kii ṣe nipasẹ aisan tabi ni akoso aisan. 2FA ti ṣe pada ninu awọn iṣẹ pataki, bi atilẹyin ti o fun iṣẹ rẹ ti o ti jẹ saanu.\n\n Cake 2FA kii ṣe pada ninu atilẹyin ti o ti ba alabara kan ti o sise gidi gan.\n\n Ti o ba pọ akosile rẹ 2FA, O YOO RI ATOJU SI IWE IWE NA. O yoo nilo lati yan pẹlu iwe iwe ni o ba ṣe iṣẹ rẹ. O ni aṣẹ iru ki o gba asise akojọ iwe iwe rẹ! Nitori a ko ni aṣẹ pẹlu ohun ti o ba ṣe iṣẹ rẹ lati yan pẹlu akojọ iwe iwe rẹ, nitori Cake ni iwe iwe ti ko se iṣẹ itumọ.",
"setup_totp_recommended": "Sọ TOTP (Kẹṣọdọ)",
"disable_buy": "Ko iṣọrọ ọja",
"disable_sell": "Ko iṣọrọ iṣọrọ"
"disable_sell": "Ko iṣọrọ iṣọrọ",
"home_screen_settings": "Awọn eto iboju ile",
"sort_by": "Sa pelu",
"search_add_token": "Wa / Fi àmi kun",
"edit_token": "Ṣatunkọ àmi",
"warning": "Ikilo",
"add_token_warning": "Ma ṣe ṣatunkọ tabi ṣafikun awọn ami bi a ti fun ni aṣẹ nipasẹ awọn scammers. Nigbagbogbo jẹrisi awọn adirẹsi ami pẹlu awọn orisun olokiki!",
"add_token_disclaimer_check": "Mo ti jẹrisi adirẹsi adehun ami ati alaye nipa lilo orisun olokiki kan. Fifi irira tabi alaye ti ko tọ le ja si isonu ti owo.",
"token_contract_address": "Àmi guide adirẹsi",
"token_name": "Orukọ àmi fun apẹẹrẹ: Tether",
"token_symbol": "Aami aami fun apẹẹrẹ: USDT",
"token_decimal": "Àmi eleemewa",
"field_required": "E ni lati se nkan si aye yi",
"pin_at_top": "pin ${tokini} ni oke"
}

View file

@ -726,5 +726,18 @@
"setup_2fa_text": "Cake 2FA 不如冷藏安全。 2FA 可防止基本类型的攻击,例如您的朋友在您睡觉时提供您的指纹。\n\n Cake 2FA 无法防止老练的攻击者破坏设备。\n\n 如果您无法访问您的 2FA 代码, 您将无法访问此钱包。您将需要从助记词种子恢复您的钱包。因此,您必须备份您的助记词种子!此外,有权访问您的助记种子的人将能够绕过 Cake 2FA 窃取您的资金。\n\n 如果您无法访问您的助记种子Cake 支持人员将无法帮助您,因为 Cake 是一个非托管钱包。",
"setup_totp_recommended": "设置 TOTP推荐",
"disable_buy": "禁用购买操作",
"disable_sell": "禁用卖出操作"
"disable_sell": "禁用卖出操作",
"home_screen_settings": "主屏幕设置",
"sort_by": "排序方式",
"search_add_token": "搜索/添加令牌",
"edit_token": "编辑令牌",
"warning": "警告",
"add_token_warning": "请勿按照诈骗者的指示编辑或添加令牌。 始终通过信誉良好的来源确认代币地址!",
"add_token_disclaimer_check": "我已使用信誉良好的来源确认了代币合约地址和信息。 添加恶意或不正确的信息可能会导致资金损失。",
"token_contract_address": "代币合约地址",
"token_name": "代币名称例如Tether",
"token_symbol": "代币符号例如USDT",
"token_decimal": "令牌十进制",
"field_required": "此字段是必需的",
"pin_at_top": "将 ${token} 固定在顶部"
}

View file

@ -481,6 +481,7 @@ Future<void> generateEthereum(bool hasImplementation) async {
const ethereumCWHeaders = """
import 'package:cake_wallet/view_model/send/output.dart';
import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/erc20_token.dart';
import 'package:cw_core/output_info.dart';
import 'package:cw_core/transaction_priority.dart';
import 'package:cw_core/wallet_base.dart';
@ -525,7 +526,8 @@ abstract class Ethereum {
int formatterEthereumParseAmount(String amount);
List<CryptoCurrency> getERC20Currencies(WalletBase wallet);
Future<CryptoCurrency> addErc20Token(WalletBase wallet, String contractAddress);
Future<CryptoCurrency?> addErc20Token(WalletBase wallet, String contractAddress);
Future<Erc20Token?> getErc20Token(WalletBase wallet, String contractAddress);
}
""";