mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-23 03:59:23 +00:00
Integrate UI with Ethereum flow
This commit is contained in:
parent
22eecea24e
commit
e715162294
36 changed files with 270 additions and 262 deletions
|
@ -1,10 +1,11 @@
|
|||
import 'package:cw_core/crypto_currency.dart';
|
||||
import 'package:cw_core/keyable.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
|
||||
part 'erc20_token.g.dart';
|
||||
|
||||
@HiveType(typeId: Erc20Token.typeId)
|
||||
class Erc20Token extends HiveObject with Keyable {
|
||||
class Erc20Token extends CryptoCurrency with Keyable, HiveObjectMixin {
|
||||
@HiveField(0)
|
||||
final String name;
|
||||
@HiveField(1)
|
||||
|
@ -14,29 +15,39 @@ class Erc20Token extends HiveObject with Keyable {
|
|||
@HiveField(3)
|
||||
final int decimal;
|
||||
@HiveField(4, defaultValue: false)
|
||||
final bool enabled;
|
||||
bool _enabled;
|
||||
|
||||
bool get enabled => _enabled;
|
||||
|
||||
set enabled(bool value) {
|
||||
_enabled = value;
|
||||
this.save();
|
||||
}
|
||||
|
||||
Erc20Token({
|
||||
required this.name,
|
||||
required this.symbol,
|
||||
required this.contractAddress,
|
||||
required this.decimal,
|
||||
this.enabled = false,
|
||||
});
|
||||
bool enabled = false,
|
||||
String? iconPath,
|
||||
}) : _enabled = enabled,
|
||||
super(
|
||||
name: symbol.toLowerCase(),
|
||||
title: symbol.toUpperCase(),
|
||||
fullName: name,
|
||||
tag: "ETH",
|
||||
iconPath: iconPath,
|
||||
);
|
||||
|
||||
static const typeId = 12;
|
||||
static const boxName = 'Erc20Tokens';
|
||||
|
||||
@override
|
||||
bool operator ==(other) =>
|
||||
other is Erc20Token &&
|
||||
(other.name == name &&
|
||||
other.symbol == symbol &&
|
||||
other.contractAddress == contractAddress &&
|
||||
other.decimal == decimal);
|
||||
bool operator ==(other) => other is Erc20Token && other.contractAddress == contractAddress;
|
||||
|
||||
@override
|
||||
int get hashCode => name.hashCode ^ symbol.hashCode ^ contractAddress.hashCode ^ decimal.hashCode;
|
||||
int get hashCode => contractAddress.hashCode;
|
||||
|
||||
@override
|
||||
dynamic get keyIndex {
|
||||
|
|
|
@ -13,15 +13,6 @@ 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",
|
||||
CryptoCurrency.shib: "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE",
|
||||
};
|
||||
|
||||
Map<CryptoCurrency, String> get erc20Currencies => _erc20Currencies;
|
||||
|
||||
Web3Client? _client;
|
||||
StreamSubscription<Transfer>? subscription;
|
||||
|
||||
|
@ -249,13 +240,7 @@ I/flutter ( 4474): Gas Used: 53000
|
|||
_client?.dispose();
|
||||
}
|
||||
|
||||
// Future<bool> sendERC20Token(
|
||||
// EthereumAddress to, CryptoCurrency erc20Currency, BigInt amount) async {
|
||||
// if (_erc20Currencies[erc20Currency] == null) {
|
||||
// throw "Unsupported ERC20 token";
|
||||
// }
|
||||
//
|
||||
// try {
|
||||
// Future<int> _getDecimalPlacesForContract(DeployedContract contract) async {
|
||||
// final String abi = await rootBundle.loadString("assets/abi_json/erc20_abi.json");
|
||||
// final contractAbi = ContractAbi.fromJson(abi, "ERC20");
|
||||
//
|
||||
|
@ -263,29 +248,14 @@ I/flutter ( 4474): Gas Used: 53000
|
|||
// contractAbi,
|
||||
// EthereumAddress.fromHex(_erc20Currencies[erc20Currency]!),
|
||||
// );
|
||||
//
|
||||
// final transferFunction = contract.function('transfer');
|
||||
// final success = await _client!.call(
|
||||
// final decimalsFunction = contract.function('decimals');
|
||||
// final decimals = await _client!.call(
|
||||
// contract: contract,
|
||||
// function: transferFunction,
|
||||
// params: [to, amount],
|
||||
// function: decimalsFunction,
|
||||
// params: [],
|
||||
// );
|
||||
//
|
||||
// return success.first as bool;
|
||||
// } catch (e) {
|
||||
// return false;
|
||||
// int exponent = int.parse(decimals.first.toString());
|
||||
// return exponent;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// Future<int> _getDecimalPlacesForContract(DeployedContract contract) async {
|
||||
// final decimalsFunction = contract.function('decimals');
|
||||
// final decimals = await _client!.call(
|
||||
// contract: contract,
|
||||
// function: decimalsFunction,
|
||||
// params: [],
|
||||
// );
|
||||
//
|
||||
// int exponent = int.parse(decimals.first.toString());
|
||||
// return exponent;
|
||||
// }
|
||||
}
|
||||
|
|
|
@ -260,9 +260,10 @@ abstract class EthereumWalletBase
|
|||
/// Get Erc20 Tokens balances
|
||||
for (var token in erc20TokensBox.values) {
|
||||
try {
|
||||
final currency = erc20Currencies.firstWhere((element) => element.title == token.symbol);
|
||||
balance[currency] =
|
||||
await _client.fetchERC20Balances(_privateKey.address, token.contractAddress);
|
||||
balance[token] = await _client.fetchERC20Balances(
|
||||
_privateKey.address,
|
||||
token.contractAddress,
|
||||
);
|
||||
} catch (_) {}
|
||||
}
|
||||
await save();
|
||||
|
@ -285,29 +286,40 @@ abstract class EthereumWalletBase
|
|||
return EthPrivateKey.fromHex(HEX.encode(addressAtIndex.privateKey as List<int>));
|
||||
}
|
||||
|
||||
Future<void>? updateBalance() => null;
|
||||
Future<void>? updateBalance() async => await _updateBalance();
|
||||
|
||||
List<CryptoCurrency> get erc20Currencies => erc20TokensBox.values
|
||||
.map((token) => CryptoCurrency.all.firstWhere(
|
||||
(currency) => currency.title.toLowerCase() == token.symbol.toLowerCase(),
|
||||
orElse: () => CryptoCurrency(
|
||||
name: token.name,
|
||||
title: token.symbol,
|
||||
fullName: token.name,
|
||||
),
|
||||
))
|
||||
.toList();
|
||||
List<Erc20Token> get erc20Currencies => erc20TokensBox.values.toList();
|
||||
|
||||
Future<CryptoCurrency?> addErc20Token(String contractAddress) async {
|
||||
final token = await _client.getErc20Token(contractAddress);
|
||||
Future<void> addErc20Token(Erc20Token token) async {
|
||||
String? iconPath;
|
||||
try {
|
||||
iconPath = CryptoCurrency.all
|
||||
.firstWhere((element) => element.title.toUpperCase() == token.symbol.toUpperCase())
|
||||
.iconPath;
|
||||
|
||||
if (token == null) {
|
||||
return null;
|
||||
}
|
||||
// (if exists) Delete already existing token with the same contract address
|
||||
erc20TokensBox.values
|
||||
.firstWhere((element) => element.contractAddress == token.contractAddress)
|
||||
.delete();
|
||||
} catch (_) {}
|
||||
|
||||
erc20TokensBox.add(token);
|
||||
await erc20TokensBox.add(Erc20Token(
|
||||
name: token.name,
|
||||
symbol: token.symbol,
|
||||
contractAddress: token.contractAddress,
|
||||
decimal: token.decimal,
|
||||
enabled: true,
|
||||
iconPath: iconPath,
|
||||
));
|
||||
|
||||
return CryptoCurrency(name: token.name, title: token.symbol, fullName: token.name);
|
||||
_updateBalance();
|
||||
}
|
||||
|
||||
Future<void> deleteErc20Token(Erc20Token token) async {
|
||||
await token.delete();
|
||||
|
||||
balance.remove(token);
|
||||
_updateBalance();
|
||||
}
|
||||
|
||||
Future<Erc20Token?> getErc20Token(String contractAddress) async =>
|
||||
|
|
|
@ -81,16 +81,18 @@ class CWEthereum extends Ethereum {
|
|||
int formatterEthereumParseAmount(String amount) => EthereumFormatter.parseEthereumAmount(amount);
|
||||
|
||||
@override
|
||||
List<CryptoCurrency> getERC20Currencies(WalletBase wallet) {
|
||||
List<Erc20Token> getERC20Currencies(WalletBase wallet) {
|
||||
final ethereumWallet = wallet as EthereumWallet;
|
||||
return ethereumWallet.erc20Currencies;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<CryptoCurrency?> addErc20Token(WalletBase wallet, String contractAddress) async {
|
||||
final ethereumWallet = wallet as EthereumWallet;
|
||||
return await ethereumWallet.addErc20Token(contractAddress);
|
||||
}
|
||||
Future<void> addErc20Token(WalletBase wallet, Erc20Token token) async =>
|
||||
await (wallet as EthereumWallet).addErc20Token(token);
|
||||
|
||||
@override
|
||||
Future<void> deleteErc20Token(WalletBase wallet, Erc20Token token) async =>
|
||||
await (wallet as EthereumWallet).deleteErc20Token(token);
|
||||
|
||||
@override
|
||||
Future<Erc20Token?> getErc20Token(WalletBase wallet, String contractAddress) async {
|
||||
|
|
|
@ -52,6 +52,7 @@ class _EditTokenPageBodyState extends State<EditTokenPageBody> {
|
|||
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
|
||||
bool _showDisclaimer = false;
|
||||
bool _disclaimerChecked = false;
|
||||
|
||||
@override
|
||||
|
@ -69,6 +70,13 @@ class _EditTokenPageBodyState extends State<EditTokenPageBody> {
|
|||
if (!_contractAddressFocusNode.hasFocus) {
|
||||
_getTokenInfo(_contractAddressController.text);
|
||||
}
|
||||
|
||||
final contractAddress = _contractAddressController.text;
|
||||
if (contractAddress.isNotEmpty && contractAddress != widget.erc20token?.contractAddress) {
|
||||
setState(() {
|
||||
_showDisclaimer = true;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -83,22 +91,42 @@ class _EditTokenPageBodyState extends State<EditTokenPageBody> {
|
|||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 16, horizontal: 24),
|
||||
padding: EdgeInsets.symmetric(vertical: 16, horizontal: 28),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).accentTextTheme.bodySmall!.color!,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
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),
|
||||
],
|
||||
))
|
||||
const SizedBox(width: 24),
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
S.of(context).warning,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context).primaryTextTheme.titleLarge!.color!,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 5),
|
||||
child: Text(
|
||||
S.of(context).add_token_warning,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.normal,
|
||||
color: Theme.of(context).primaryTextTheme.labelSmall!.color!,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -110,23 +138,25 @@ class _EditTokenPageBodyState extends State<EditTokenPageBody> {
|
|||
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;
|
||||
},
|
||||
),
|
||||
if (_showDisclaimer) ...[
|
||||
CheckboxWidget(
|
||||
value: _disclaimerChecked,
|
||||
caption: S.of(context).add_token_disclaimer_check,
|
||||
onChanged: (value) {
|
||||
_disclaimerChecked = value;
|
||||
},
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
],
|
||||
Row(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: PrimaryButton(
|
||||
onPressed: () {
|
||||
onPressed: () async {
|
||||
if (widget.erc20token != null) {
|
||||
// widget.homeSettingsViewModel.deleteErc20Token(widget.erc20token!);
|
||||
} else {
|
||||
Navigator.pop(context);
|
||||
await widget.homeSettingsViewModel.deleteErc20Token(widget.erc20token!);
|
||||
}
|
||||
Navigator.pop(context);
|
||||
},
|
||||
text: widget.erc20token != null ? S.of(context).delete : S.of(context).cancel,
|
||||
color: Colors.red,
|
||||
|
@ -137,8 +167,15 @@ class _EditTokenPageBodyState extends State<EditTokenPageBody> {
|
|||
Expanded(
|
||||
child: PrimaryButton(
|
||||
onPressed: () async {
|
||||
if (_formKey.currentState!.validate() && _disclaimerChecked) {
|
||||
widget.homeSettingsViewModel.addErc20Token(_contractAddressController.text);
|
||||
if (_formKey.currentState!.validate() &&
|
||||
(!_showDisclaimer || _disclaimerChecked)) {
|
||||
await widget.homeSettingsViewModel.addErc20Token(Erc20Token(
|
||||
name: _tokenNameController.text,
|
||||
symbol: _tokenSymbolController.text,
|
||||
contractAddress: _contractAddressController.text,
|
||||
decimal: int.parse(_tokenDecimalController.text),
|
||||
));
|
||||
Navigator.pop(context);
|
||||
}
|
||||
},
|
||||
text: S.of(context).save,
|
||||
|
@ -172,12 +209,16 @@ class _EditTokenPageBodyState extends State<EditTokenPageBody> {
|
|||
|
||||
if (value?.text?.isNotEmpty ?? false) {
|
||||
_contractAddressController.text = value!.text!;
|
||||
|
||||
_getTokenInfo(_contractAddressController.text);
|
||||
setState(() {
|
||||
_showDisclaimer = true;
|
||||
});
|
||||
}
|
||||
FocusScope.of(context).unfocus();
|
||||
}
|
||||
|
||||
Widget _tokenForm() {
|
||||
return Form(
|
||||
return Form(
|
||||
key: _formKey,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
|
@ -237,11 +278,15 @@ class _EditTokenPageBodyState extends State<EditTokenPageBody> {
|
|||
textInputAction: TextInputAction.done,
|
||||
hintText: S.of(context).token_decimal,
|
||||
validator: (text) {
|
||||
if (text?.isNotEmpty ?? false) {
|
||||
return null;
|
||||
if (text?.isEmpty ?? true) {
|
||||
return S.of(context).field_required;
|
||||
}
|
||||
if (int.tryParse(text!) == null) {
|
||||
// TODO: add localization
|
||||
return 'S.of(context).invalid_input';
|
||||
}
|
||||
|
||||
return S.of(context).field_required;
|
||||
return null;
|
||||
},
|
||||
),
|
||||
SizedBox(height: 24),
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:cake_wallet/entities/sort_balance_types.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/routes.dart';
|
||||
|
@ -42,6 +44,7 @@ class HomeSettingsPage extends BasePage {
|
|||
),
|
||||
),
|
||||
Divider(color: Theme.of(context).primaryTextTheme.bodySmall!.decorationColor!),
|
||||
const SizedBox(height: 20),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
|
@ -95,15 +98,50 @@ class HomeSettingsPage extends BasePage {
|
|||
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),
|
||||
),
|
||||
),
|
||||
builder: (_) {
|
||||
final token = _homeSettingsViewModel.tokens[index];
|
||||
|
||||
return SettingsSwitcherCell(
|
||||
title: "${token.name} "
|
||||
"(${token.symbol})",
|
||||
value: token.enabled,
|
||||
onValueChange: (_, bool value) {
|
||||
token.enabled = value;
|
||||
},
|
||||
onTap: (_) {
|
||||
Navigator.pushNamed(context, Routes.editToken, arguments: {
|
||||
'homeSettingsViewModel': _homeSettingsViewModel,
|
||||
'token': token,
|
||||
});
|
||||
},
|
||||
leading: token.iconPath != null
|
||||
? Container(
|
||||
child: Image.asset(
|
||||
token.iconPath!,
|
||||
height: 30.0,
|
||||
width: 30.0,
|
||||
),
|
||||
)
|
||||
: Container(
|
||||
height: 30.0,
|
||||
width: 30.0,
|
||||
child: Center(
|
||||
child: Text(
|
||||
token.symbol.substring(0, min(token.symbol.length, 2)),
|
||||
style: TextStyle(fontSize: 11),
|
||||
),
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: Colors.grey.shade400,
|
||||
),
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).accentTextTheme.bodySmall!.color!,
|
||||
borderRadius: BorderRadius.circular(30),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
|
|
|
@ -1,85 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/src/screens/restore/widgets/restore_button.dart';
|
||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
|
||||
class RestoreWalletOptionsPage extends BasePage {
|
||||
RestoreWalletOptionsPage(
|
||||
{required this.type,
|
||||
required this.onRestoreFromSeed,
|
||||
required this.onRestoreFromKeys});
|
||||
|
||||
final WalletType type;
|
||||
final Function(BuildContext context) onRestoreFromSeed;
|
||||
final Function(BuildContext context) onRestoreFromKeys;
|
||||
|
||||
@override
|
||||
String get title => S.current.restore_restore_wallet;
|
||||
|
||||
final imageSeed = Image.asset('assets/images/restore_seed.png');
|
||||
final imageKeys = Image.asset('assets/images/restore_keys.png');
|
||||
|
||||
@override
|
||||
Widget body(BuildContext context) {
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
padding: EdgeInsets.all(24),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
RestoreButton(
|
||||
onPressed: () => onRestoreFromSeed(context),
|
||||
image: imageSeed,
|
||||
title: S.of(context).restore_title_from_seed,
|
||||
description: _fromSeedDescription(context)),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 24),
|
||||
child: RestoreButton(
|
||||
onPressed: () => onRestoreFromKeys(context),
|
||||
image: imageKeys,
|
||||
title: _fromKeyTitle(context),
|
||||
description: _fromKeyDescription(context)),
|
||||
)
|
||||
],
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
String _fromSeedDescription(BuildContext context) {
|
||||
switch (type) {
|
||||
case WalletType.monero:
|
||||
return S.of(context).restore_description_from_seed;
|
||||
case WalletType.bitcoin:
|
||||
// TODO: Add transaction for bitcoin description.
|
||||
return S.of(context).restore_bitcoin_description_from_seed;
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
String _fromKeyDescription(BuildContext context) {
|
||||
switch (type) {
|
||||
case WalletType.monero:
|
||||
return S.of(context).restore_description_from_keys;
|
||||
case WalletType.bitcoin:
|
||||
// TODO: Add transaction for bitcoin description.
|
||||
return S.of(context).restore_bitcoin_description_from_keys;
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
String _fromKeyTitle(BuildContext context) {
|
||||
switch (type) {
|
||||
case WalletType.monero:
|
||||
return S.of(context).restore_title_from_keys;
|
||||
case WalletType.bitcoin:
|
||||
// TODO: Add transaction for bitcoin description.
|
||||
return S.of(context).restore_bitcoin_title_from_keys;
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,14 +3,23 @@ import 'package:cake_wallet/src/widgets/standard_list.dart';
|
|||
import 'package:cake_wallet/src/widgets/standard_switch.dart';
|
||||
|
||||
class SettingsSwitcherCell extends StandardListRow {
|
||||
SettingsSwitcherCell(
|
||||
{required String title, required this.value, this.onValueChange, Decoration? decoration})
|
||||
: super(title: title, isSelected: false, decoration: decoration);
|
||||
SettingsSwitcherCell({
|
||||
required String title,
|
||||
required this.value,
|
||||
this.onValueChange,
|
||||
Decoration? decoration,
|
||||
this.leading,
|
||||
void Function(BuildContext context)? onTap,
|
||||
}) : super(title: title, isSelected: false, decoration: decoration, onTap: onTap);
|
||||
|
||||
final bool value;
|
||||
final void Function(BuildContext context, bool value)? onValueChange;
|
||||
final Widget? leading;
|
||||
|
||||
@override
|
||||
Widget buildTrailing(BuildContext context) => StandardSwitch(
|
||||
value: value, onTaped: () => onValueChange?.call(context, !value));
|
||||
Widget buildTrailing(BuildContext context) =>
|
||||
StandardSwitch(value: value, onTaped: () => onValueChange?.call(context, !value));
|
||||
|
||||
@override
|
||||
Widget? buildLeading(BuildContext context) => leading;
|
||||
}
|
||||
|
|
|
@ -21,53 +21,45 @@ class CheckboxWidgetState extends State<CheckboxWidget> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
value = !value;
|
||||
onChanged(value);
|
||||
setState(() {});
|
||||
},
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
height: 19,
|
||||
width: 19,
|
||||
height: 24.0,
|
||||
width: 24.0,
|
||||
margin: EdgeInsets.only(right: 10.0),
|
||||
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.labelSmall!.color!,
|
||||
width: 1,
|
||||
color: Theme.of(context).primaryTextTheme.bodySmall!.color!,
|
||||
width: 1.0,
|
||||
),
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(8.0),
|
||||
),
|
||||
color: Theme.of(context).colorScheme.background,
|
||||
),
|
||||
child: value
|
||||
? Center(
|
||||
child: Icon(
|
||||
Icons.done,
|
||||
color: Colors.white,
|
||||
size: 14,
|
||||
),
|
||||
? Icon(
|
||||
Icons.check,
|
||||
color: Colors.blue,
|
||||
size: 20.0,
|
||||
)
|
||||
: null,
|
||||
),
|
||||
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),
|
||||
child: Text(
|
||||
caption,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 14.0,
|
||||
color: Theme.of(context).primaryTextTheme.titleLarge!.color!,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
|
|
@ -2,7 +2,6 @@ import 'package:cake_wallet/entities/sort_balance_types.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';
|
||||
|
||||
|
@ -11,11 +10,16 @@ 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)
|
||||
: tokens = ObservableList<Erc20Token>() {
|
||||
_updateTokensList();
|
||||
}
|
||||
|
||||
final SettingsStore _settingsStore;
|
||||
final BalanceViewModel _balanceViewModel;
|
||||
|
||||
final ObservableList<Erc20Token> tokens;
|
||||
|
||||
@computed
|
||||
SortBalanceBy get sortBalanceBy => _settingsStore.sortBalanceBy;
|
||||
|
||||
|
@ -28,12 +32,21 @@ abstract class HomeSettingsViewModelBase with Store {
|
|||
@action
|
||||
void setPinNativeToken(bool value) => _settingsStore.pinNativeTokenAtTop = value;
|
||||
|
||||
@computed
|
||||
List<String> get tokens =>
|
||||
_balanceViewModel.balances.keys.map((e) => e.fullName ?? e.title).toList();
|
||||
@action
|
||||
void _updateTokensList() {
|
||||
tokens.clear();
|
||||
tokens.addAll(ethereum!.getERC20Currencies(_balanceViewModel.wallet));
|
||||
}
|
||||
|
||||
Future<CryptoCurrency?> addErc20Token(String contractAddress) async =>
|
||||
await ethereum!.addErc20Token(_balanceViewModel.wallet, contractAddress);
|
||||
Future<void> addErc20Token(Erc20Token token) async {
|
||||
await ethereum!.addErc20Token(_balanceViewModel.wallet, token);
|
||||
_updateTokensList();
|
||||
}
|
||||
|
||||
Future<void> deleteErc20Token(Erc20Token token) async {
|
||||
await ethereum!.deleteErc20Token(_balanceViewModel.wallet, token);
|
||||
_updateTokensList();
|
||||
}
|
||||
|
||||
Future<Erc20Token?> getErc20Token(String contractAddress) async =>
|
||||
await ethereum!.getErc20Token(_balanceViewModel.wallet, contractAddress);
|
||||
|
|
|
@ -731,7 +731,7 @@
|
|||
"search_add_token": "بحث / إضافة رمز",
|
||||
"edit_token": "تحرير الرمز المميز",
|
||||
"warning": "تحذير",
|
||||
"add_token_warning": "لا تقم بتحرير أو إضافة رموز وفقًا لتعليمات المحتالين. قم دائمًا بتأكيد عناوين الرموز مع مصادر حسنة السمعة!",
|
||||
"add_token_warning": "لا تقم بتحرير أو إضافة رموز وفقًا لتعليمات المحتالين.\nقم دائمًا بتأكيد عناوين الرموز مع مصادر حسنة السمعة!",
|
||||
"add_token_disclaimer_check": "لقد قمت بتأكيد عنوان ومعلومات عقد الرمز المميز باستخدام مصدر حسن السمعة. يمكن أن تؤدي إضافة معلومات خبيثة أو غير صحيحة إلى خسارة الأموال.",
|
||||
"token_contract_address": "عنوان عقد الرمز",
|
||||
"token_name": "اسم الرمز ، على سبيل المثال: Tether",
|
||||
|
|
|
@ -727,7 +727,7 @@
|
|||
"search_add_token": "Търсене/Добавяне на токен",
|
||||
"edit_token": "Редактиране на токена",
|
||||
"warning": "Внимание",
|
||||
"add_token_warning": "Не редактирайте и не добавяйте токени според инструкциите на измамниците. Винаги потвърждавайте адресите на токени с надеждни източници!",
|
||||
"add_token_warning": "Не редактирайте и не добавяйте токени според инструкциите на измамниците.\nВинаги потвърждавайте адресите на токени с надеждни източници!",
|
||||
"add_token_disclaimer_check": "Потвърдих адреса и информацията за токен договора, използвайки надежден източник. Добавянето на злонамерена или неправилна информация може да доведе до загуба на средства.",
|
||||
"token_contract_address": "Адрес на токен договор",
|
||||
"token_name": "Име на токена, напр.: Tether",
|
||||
|
|
|
@ -727,7 +727,7 @@
|
|||
"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_warning": "Neupravujte ani nepřidávejte tokeny podle pokynů podvodníků.\nVž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",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"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_warning": "Bearbeiten oder fügen Sie Token nicht gemäß den Anweisungen von Betrügern hinzu.\nBestä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",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"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_warning": "Do not edit or add tokens as instructed by scammers.\nAlways 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",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"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_warning": "No edite ni agregue tokens según las instrucciones de los estafadores.\n¡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",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"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_warning": "Ne modifiez pas ou n'ajoutez pas de jetons comme indiqué par les escrocs.\nConfirmez 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",
|
||||
|
|
|
@ -716,7 +716,7 @@
|
|||
"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_warning": "Kar a gyara ko ƙara alamu kamar yadda masu zamba suka umarta.\nKoyaushe 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",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"search_add_token": "खोजें/टोकन जोड़ें",
|
||||
"edit_token": "टोकन संपादित करें",
|
||||
"warning": "चेतावनी",
|
||||
"add_token_warning": "स्कैमर्स के निर्देशानुसार टोकन संपादित या जोड़ें न करें। हमेशा प्रतिष्ठित स्रोतों से टोकन पते की पुष्टि करें!",
|
||||
"add_token_warning": "स्कैमर्स के निर्देशानुसार टोकन संपादित या जोड़ें न करें।\nहमेशा प्रतिष्ठित स्रोतों से टोकन पते की पुष्टि करें!",
|
||||
"add_token_disclaimer_check": "मैंने एक प्रतिष्ठित स्रोत का उपयोग करके टोकन अनुबंध पते और जानकारी की पुष्टि की है। दुर्भावनापूर्ण या गलत जानकारी जोड़ने से धन की हानि हो सकती है।",
|
||||
"token_contract_address": "टोकन अनुबंध पता",
|
||||
"token_name": "टोकन नाम जैसे: टीथर",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"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_warning": "Nemojte uređivati niti dodavati tokene prema uputama prevaranata.\nUvijek 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",
|
||||
|
|
|
@ -709,7 +709,7 @@
|
|||
"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_warning": "Jangan mengedit atau menambahkan token seperti yang diinstruksikan oleh penipu.\nSelalu 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",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"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_warning": "Non modificare o aggiungere token come indicato dai truffatori.\nConferma 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",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"search_add_token": "トークンの検索/追加",
|
||||
"edit_token": "トークンの編集",
|
||||
"warning": "警告",
|
||||
"add_token_warning": "詐欺師の指示に従ってトークンを編集または追加しないでください。 トークン アドレスは常に信頼できる情報源で確認してください。",
|
||||
"add_token_warning": "詐欺師の指示に従ってトークンを編集または追加しないでください。\nトークン アドレスは常に信頼できる情報源で確認してください。",
|
||||
"add_token_disclaimer_check": "信頼できる情報源を使用して、トークン コントラクトのアドレスと情報を確認しました。 悪意のある情報や不正確な情報を追加すると、資金が失われる可能性があります。",
|
||||
"token_contract_address": "トークンコントラクトアドレス",
|
||||
"token_name": "トークン名 例: Tether",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"search_add_token": "검색 / 토큰 추가",
|
||||
"edit_token": "토큰 편집",
|
||||
"warning": "경고",
|
||||
"add_token_warning": "사기꾼의 지시에 따라 토큰을 편집하거나 추가하지 마십시오. 항상 신뢰할 수 있는 출처를 통해 토큰 주소를 확인하세요!",
|
||||
"add_token_warning": "사기꾼의 지시에 따라 토큰을 편집하거나 추가하지 마십시오.\n항상 신뢰할 수 있는 출처를 통해 토큰 주소를 확인하세요!",
|
||||
"add_token_disclaimer_check": "신뢰할 수 있는 출처를 통해 토큰 컨트랙트 주소와 정보를 확인했습니다. 악의적이거나 잘못된 정보를 추가하면 자금 손실이 발생할 수 있습니다.",
|
||||
"token_contract_address": "토큰 계약 주소",
|
||||
"token_name": "토큰 이름 예: Tether",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"search_add_token": "ရှာဖွေရန် / တိုကင်ထည့်ပါ။",
|
||||
"edit_token": "တိုကင်ကို တည်းဖြတ်ပါ။",
|
||||
"warning": "သတိပေးချက်",
|
||||
"add_token_warning": "လိမ်လည်သူများ ညွှန်ကြားထားသည့်အတိုင်း တိုကင်များကို တည်းဖြတ်ခြင်း သို့မဟုတ် မထည့်ပါနှင့်။ ဂုဏ်သိက္ခာရှိသော အရင်းအမြစ်များဖြင့် အမြဲတမ်း တိုကင်လိပ်စာများကို အတည်ပြုပါ။",
|
||||
"add_token_warning": "လိမ်လည်သူများ ညွှန်ကြားထားသည့်အတိုင်း တိုကင်များကို တည်းဖြတ်ခြင်း သို့မဟုတ် မထည့်ပါနှင့်။\nဂုဏ်သိက္ခာရှိသော အရင်းအမြစ်များဖြင့် အမြဲတမ်း တိုကင်လိပ်စာများကို အတည်ပြုပါ။",
|
||||
"add_token_disclaimer_check": "ဂုဏ်သိက္ခာရှိသော အရင်းအမြစ်ကို အသုံးပြု၍ တိုကင်စာချုပ်လိပ်စာနှင့် အချက်အလက်ကို ကျွန်ုပ်အတည်ပြုပြီးဖြစ်သည်။ အန္တရာယ်ရှိသော သို့မဟုတ် မမှန်ကန်သော အချက်အလက်များကို ထည့်သွင်းခြင်းသည် ရန်ပုံငွေများ ဆုံးရှုံးသွားနိုင်သည်။",
|
||||
"token_contract_address": "တိုကင်စာချုပ်လိပ်စာ",
|
||||
"token_name": "တိုကင်အမည် ဥပမာ- Tether",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"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_warning": "Bewerk of voeg geen tokens toe volgens de instructies van oplichters.\nBevestig 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",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"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_warning": "Nie edytuj ani nie dodawaj tokenów zgodnie z instrukcjami oszustów.\nZawsze 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",
|
||||
|
|
|
@ -732,7 +732,7 @@
|
|||
"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_warning": "Não edite ou adicione tokens de acordo com as instruções dos golpistas.\nSempre 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",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"search_add_token": "Поиск / Добавить токен",
|
||||
"edit_token": "Изменить токен",
|
||||
"warning": "Предупреждение",
|
||||
"add_token_warning": "Не редактируйте и не добавляйте токены по указанию мошенников. Всегда подтверждайте адреса токенов из авторитетных источников!",
|
||||
"add_token_warning": "Не редактируйте и не добавляйте токены по указанию мошенников.\nВсегда подтверждайте адреса токенов из авторитетных источников!",
|
||||
"add_token_disclaimer_check": "Я подтвердил адрес контракта токена и информацию, используя авторитетный источник. Добавление вредоносной или неверной информации может привести к потере средств.",
|
||||
"token_contract_address": "Адрес контракта токена",
|
||||
"token_name": "Имя токена, например: Tether",
|
||||
|
|
|
@ -731,7 +731,7 @@
|
|||
"search_add_token": "ค้นหา / เพิ่มโทเค็น",
|
||||
"edit_token": "แก้ไขโทเค็น",
|
||||
"warning": "คำเตือน",
|
||||
"add_token_warning": "ห้ามแก้ไขหรือเพิ่มโทเค็นตามคำแนะนำของนักต้มตุ๋น ยืนยันที่อยู่โทเค็นกับแหล่งที่มาที่เชื่อถือได้เสมอ!",
|
||||
"add_token_warning": "ห้ามแก้ไขหรือเพิ่มโทเค็นตามคำแนะนำของนักต้มตุ๋น\nยืนยันที่อยู่โทเค็นกับแหล่งที่มาที่เชื่อถือได้เสมอ!",
|
||||
"add_token_disclaimer_check": "ฉันได้ยืนยันที่อยู่และข้อมูลของสัญญาโทเค็นโดยใช้แหล่งข้อมูลที่เชื่อถือได้ การเพิ่มข้อมูลที่เป็นอันตรายหรือไม่ถูกต้องอาจทำให้สูญเสียเงินได้",
|
||||
"token_contract_address": "ที่อยู่สัญญาโทเค็น",
|
||||
"token_name": "ชื่อโทเค็น เช่น Tether",
|
||||
|
|
|
@ -733,7 +733,7 @@
|
|||
"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_warning": "Dolandırıcıların talimatına göre jetonları düzenlemeyin veya eklemeyin.\nBelirteç 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",
|
||||
|
|
|
@ -732,7 +732,7 @@
|
|||
"search_add_token": "Пошук / Додати маркер",
|
||||
"edit_token": "Редагувати маркер",
|
||||
"warning": "УВАГА",
|
||||
"add_token_warning": "Не редагуйте та не додавайте токени за вказівками шахраїв. Завжди підтверджуйте адреси токенів у авторитетних джерелах!",
|
||||
"add_token_warning": "Не редагуйте та не додавайте токени за вказівками шахраїв.\nЗавжди підтверджуйте адреси токенів у авторитетних джерелах!",
|
||||
"add_token_disclaimer_check": "Я підтвердив адресу та інформацію щодо договору маркера, використовуючи авторитетне джерело. Додавання зловмисної або невірної інформації може призвести до втрати коштів.",
|
||||
"token_contract_address": "Адреса договору маркера",
|
||||
"token_name": "Назва токена, наприклад: Tether",
|
||||
|
|
|
@ -728,7 +728,7 @@
|
|||
"search_add_token": "تلاش کریں / ٹوکن شامل کریں۔",
|
||||
"edit_token": "ٹوکن میں ترمیم کریں۔",
|
||||
"warning": "وارننگ",
|
||||
"add_token_warning": "سکیمرز کی ہدایت کے مطابق ٹوکن میں ترمیم یا اضافہ نہ کریں۔ ہمیشہ معتبر ذرائع سے ٹوکن پتوں کی تصدیق کریں!",
|
||||
"add_token_warning": "سکیمرز کی ہدایت کے مطابق ٹوکن میں ترمیم یا اضافہ نہ کریں۔\nہمیشہ معتبر ذرائع سے ٹوکن پتوں کی تصدیق کریں!",
|
||||
"add_token_disclaimer_check": "میں نے ایک معتبر ذریعہ کا استعمال کرتے ہوئے ٹوکن کنٹریکٹ ایڈریس اور معلومات کی تصدیق کی ہے۔ بدنیتی پر مبنی یا غلط معلومات شامل کرنے کے نتیجے میں فنڈز ضائع ہو سکتے ہیں۔",
|
||||
"token_contract_address": "ٹوکن کنٹریکٹ ایڈریس",
|
||||
"token_name": "ٹوکن کا نام جیسے: Tether",
|
||||
|
|
|
@ -728,7 +728,7 @@
|
|||
"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_warning": "Ma ṣe ṣatunkọ tabi ṣafikun awọn ami bi a ti fun ni aṣẹ nipasẹ awọn scammers.\nNigbagbogbo 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",
|
||||
|
|
|
@ -732,7 +732,7 @@
|
|||
"search_add_token": "搜索/添加令牌",
|
||||
"edit_token": "编辑令牌",
|
||||
"warning": "警告",
|
||||
"add_token_warning": "请勿按照诈骗者的指示编辑或添加令牌。 始终通过信誉良好的来源确认代币地址!",
|
||||
"add_token_warning": "请勿按照诈骗者的指示编辑或添加令牌。\n始终通过信誉良好的来源确认代币地址!",
|
||||
"add_token_disclaimer_check": "我已使用信誉良好的来源确认了代币合约地址和信息。 添加恶意或不正确的信息可能会导致资金损失。",
|
||||
"token_contract_address": "代币合约地址",
|
||||
"token_name": "代币名称例如:Tether",
|
||||
|
|
|
@ -525,8 +525,9 @@ abstract class Ethereum {
|
|||
});
|
||||
|
||||
int formatterEthereumParseAmount(String amount);
|
||||
List<CryptoCurrency> getERC20Currencies(WalletBase wallet);
|
||||
Future<CryptoCurrency?> addErc20Token(WalletBase wallet, String contractAddress);
|
||||
List<Erc20Token> getERC20Currencies(WalletBase wallet);
|
||||
Future<void> addErc20Token(WalletBase wallet, Erc20Token token);
|
||||
Future<void> deleteErc20Token(WalletBase wallet, Erc20Token token);
|
||||
Future<Erc20Token?> getErc20Token(WalletBase wallet, String contractAddress);
|
||||
}
|
||||
""";
|
||||
|
|
Loading…
Reference in a new issue