mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-11-01 09:57:46 +00:00
3ce4000dcf
* Add initial flow for ethereum * Add initial create Eth wallet flow * Complete Ethereum wallet creation flow * Fix web3dart versioning issue * Add primary receive address extracted from private key * Implement open wallet functionality * Implement restore wallet from seed functionality * Fixate web3dart version as higher versions cause some issues * Add Initial Transaction priorities for eth Add estimated gas price * Rename priority value to tip * Re-order wallet types * Change ethereum node Fix connection issues * Fix estimating gas for priority * Add case for ethereum to fetch it's seeds * Add case for ethereum to request node * Fix Exchange screen initial pairs * Add initial send transaction flow * Add missing configure for ethereum class * Add Eth address initial setup * Fix Private key for Ethereum wallets * Change sign/send transaction flow * - Fix Conflicts with main - Remove unused function from Haven configure.dart * Add build command for ethereum package * Add missing Node list file to pubspec * - Fix balance display - Fix parsing of Ethereum amount - Add more Ethereum Nodes * - Fix extracting Ethereum Private key from seeds - Integrate signing/sending transaction with the send view model * - Update and Fix Conflicts with main * Add Balances for ERC20 tokens * Fix conflicts with main * Add erc20 abi json * Add send erc20 tokens initial function * add missing getHeightByDate in Haven * Allow contacts and wallets from the same tag * Add Shiba Inu icon * Add send ERC-20 tokens initial flow * Add missing import in generated file * Add initial approach for transaction sending for ERC-20 tokens * Refactor signing/sending transactions * Add initial flow for transactions subscription * Refactor signing/sending transactions * Add home settings icon * Fix conflicts with main * Initial flow for home settings * Add logic flow for adding erc20 tokens * Fix initial UI * Finalize UI for Tokens * Integrate UI with Ethereum flow * Add "Enable/Disable" feature for ERC20 tokens * Add initial Erc20 tokens * Add Sorting and Pin Native Token features * Fix price sorting * Sort tokens list as well when Sort criteria changes * - Improve sorting balances flow - Add initial add token from search bar flow * Fix Accounts Popup UI * Fix Pin native token * Fix Enabling/Disabling tokens Fix sorting by fiat once app is opened Improve token availability mechanism * Fix deleting token Fix renaming tokens * Fix issue with search * Add more tokens * - Fix scroll issue - Add ERC20 tokens placeholder image in picker * - Separate and organize default erc20 tokens - Fix scrolling - Add token placeholder images in picker - Sort disabled tokens alphabetically * Change BNB token initial availability * Fix Conflicts with main * Fix Conflicts with main * Add Verse ERC20 token to the initial tokens list * Add rename wallet to Ethereum * Integrate EtherScan API for fetching address transactions Generate Ethereum specific secrets in Ethereum package * Adjust transactions fiat price for ERC20 tokens * Free Up GitHub Actions Ubuntu Runner Disk Space * Free Up GitHub Actions Ubuntu Runner Disk space (trial 2) * Fix Transaction Fee display * Save transaction history * Enhance loading time for erc20 tokens transactions * Minor Fixes and Enhancements * Fix sending erc20 fix block explorer issue * Fix int overflow * Fix transaction amount conversions * Minor: `slow` -> `Slow` * Update build guide * Fix fetching fiat rate taking a lot of time by only fetching enabled tokens only and making the API calls in parallel not sequential * Update transactions on a periodic basis * For fee, use ETH spot price, not ERC-20 spot price * Add Etherscan History privacy option to enable/disable Etherscan API * Show estimated fee amounts in the send screen * fix send fiat fields parsing issue * Fix transactions estimated fee less than actual fee * handle balance sorting when balance is disabled Handle empty transactions list * Fix Delete Ethereum wallet Fix balance < 0.01 * Fix Decimal place for Ethereum amount Fix sending amount issue * Change words count * Remove balance hint and Full balance row from Ethereum wallets * support changing the asset type in send templates * Fix Templates for ERC tokens issues * Fix conflicts in send templates * Disable batch sending in Ethereum * Fix Fee calculation with different priorities * Fix Conflicts with main * Add offline error to ignored exceptions --------- Co-authored-by: Justin Ehrenhofer <justin.ehrenhofer@gmail.com>
264 lines
7.1 KiB
Dart
264 lines
7.1 KiB
Dart
import 'package:cake_wallet/di.dart';
|
|
import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart';
|
|
import 'package:cake_wallet/entities/parse_address_from_domain.dart';
|
|
import 'package:cake_wallet/entities/parsed_address.dart';
|
|
import 'package:cake_wallet/ethereum/ethereum.dart';
|
|
import 'package:cake_wallet/haven/haven.dart';
|
|
import 'package:cake_wallet/src/screens/send/widgets/extract_address_from_parsed.dart';
|
|
import 'package:cw_core/crypto_currency.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:mobx/mobx.dart';
|
|
import 'package:cw_core/wallet_base.dart';
|
|
import 'package:cake_wallet/monero/monero.dart';
|
|
import 'package:cake_wallet/entities/calculate_fiat_amount.dart';
|
|
import 'package:cw_core/wallet_type.dart';
|
|
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
|
|
import 'package:cake_wallet/store/settings_store.dart';
|
|
import 'package:cake_wallet/generated/i18n.dart';
|
|
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
|
|
|
import 'package:cake_wallet/entities/contact_base.dart';
|
|
|
|
part 'output.g.dart';
|
|
|
|
const String cryptoNumberPattern = '0.0';
|
|
|
|
class Output = OutputBase with _$Output;
|
|
|
|
abstract class OutputBase with Store {
|
|
OutputBase(this._wallet, this._settingsStore, this._fiatConversationStore, this.cryptoCurrencyHandler)
|
|
: _cryptoNumberFormat = NumberFormat(cryptoNumberPattern),
|
|
key = UniqueKey(),
|
|
sendAll = false,
|
|
cryptoAmount = '',
|
|
fiatAmount = '',
|
|
address = '',
|
|
note = '',
|
|
extractedAddress = '',
|
|
parsedAddress = ParsedAddress(addresses: []) {
|
|
_setCryptoNumMaximumFractionDigits();
|
|
}
|
|
|
|
Key key;
|
|
|
|
@observable
|
|
String fiatAmount;
|
|
|
|
@observable
|
|
String cryptoAmount;
|
|
|
|
@observable
|
|
String address;
|
|
|
|
@observable
|
|
String note;
|
|
|
|
@observable
|
|
bool sendAll;
|
|
|
|
@observable
|
|
ParsedAddress parsedAddress;
|
|
|
|
@observable
|
|
String extractedAddress;
|
|
|
|
@computed
|
|
bool get isParsedAddress =>
|
|
parsedAddress.parseFrom != ParseFrom.notParsed &&
|
|
parsedAddress.name.isNotEmpty;
|
|
|
|
@computed
|
|
int get formattedCryptoAmount {
|
|
int amount = 0;
|
|
|
|
try {
|
|
if (cryptoAmount.isNotEmpty) {
|
|
final _cryptoAmount = cryptoAmount.replaceAll(',', '.');
|
|
int _amount = 0;
|
|
switch (walletType) {
|
|
case WalletType.monero:
|
|
_amount = monero!.formatterMoneroParseAmount(amount: _cryptoAmount);
|
|
break;
|
|
case WalletType.bitcoin:
|
|
_amount =
|
|
bitcoin!.formatterStringDoubleToBitcoinAmount(_cryptoAmount);
|
|
break;
|
|
case WalletType.litecoin:
|
|
_amount =
|
|
bitcoin!.formatterStringDoubleToBitcoinAmount(_cryptoAmount);
|
|
break;
|
|
case WalletType.haven:
|
|
_amount = haven!.formatterMoneroParseAmount(amount: _cryptoAmount);
|
|
break;
|
|
case WalletType.ethereum:
|
|
_amount = ethereum!.formatterEthereumParseAmount(_cryptoAmount);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (_amount > 0) {
|
|
amount = _amount;
|
|
}
|
|
}
|
|
} catch (e) {
|
|
amount = 0;
|
|
}
|
|
|
|
return amount;
|
|
}
|
|
|
|
@computed
|
|
double get estimatedFee {
|
|
try {
|
|
final fee = _wallet.calculateEstimatedFee(
|
|
_settingsStore.priority[_wallet.type]!, formattedCryptoAmount);
|
|
|
|
if (_wallet.type == WalletType.bitcoin ||
|
|
_wallet.type == WalletType.litecoin) {
|
|
return bitcoin!.formatterBitcoinAmountToDouble(amount: fee);
|
|
}
|
|
|
|
if (_wallet.type == WalletType.monero) {
|
|
return monero!.formatterMoneroAmountToDouble(amount: fee);
|
|
}
|
|
|
|
if (_wallet.type == WalletType.haven) {
|
|
return haven!.formatterMoneroAmountToDouble(amount: fee);
|
|
}
|
|
|
|
if (_wallet.type == WalletType.ethereum) {
|
|
return ethereum!.formatterEthereumAmountToDouble(amount: BigInt.from(fee));
|
|
}
|
|
} catch (e) {
|
|
print(e.toString());
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
@computed
|
|
String get estimatedFeeFiatAmount {
|
|
try {
|
|
final currency = _wallet.type == WalletType.ethereum ? _wallet.currency : cryptoCurrencyHandler();
|
|
final fiat = calculateFiatAmountRaw(
|
|
price: _fiatConversationStore.prices[currency]!,
|
|
cryptoAmount: estimatedFee);
|
|
return fiat;
|
|
} catch (_) {
|
|
return '0.00';
|
|
}
|
|
}
|
|
|
|
WalletType get walletType => _wallet.type;
|
|
final CryptoCurrency Function() cryptoCurrencyHandler;
|
|
final WalletBase _wallet;
|
|
final SettingsStore _settingsStore;
|
|
final FiatConversionStore _fiatConversationStore;
|
|
final NumberFormat _cryptoNumberFormat;
|
|
|
|
@action
|
|
void setSendAll() => sendAll = true;
|
|
|
|
@action
|
|
void reset() {
|
|
sendAll = false;
|
|
cryptoAmount = '';
|
|
fiatAmount = '';
|
|
address = '';
|
|
note = '';
|
|
resetParsedAddress();
|
|
}
|
|
|
|
void resetParsedAddress() {
|
|
extractedAddress = '';
|
|
parsedAddress = ParsedAddress(addresses: []);
|
|
}
|
|
|
|
@action
|
|
void setCryptoAmount(String amount) {
|
|
if (amount.toUpperCase() != S.current.all) {
|
|
sendAll = false;
|
|
}
|
|
|
|
cryptoAmount = amount;
|
|
_updateFiatAmount();
|
|
}
|
|
|
|
@action
|
|
void setFiatAmount(String amount) {
|
|
fiatAmount = amount;
|
|
_updateCryptoAmount();
|
|
}
|
|
|
|
@action
|
|
void _updateFiatAmount() {
|
|
try {
|
|
final fiat = calculateFiatAmount(
|
|
price: _fiatConversationStore.prices[cryptoCurrencyHandler()]!,
|
|
cryptoAmount: cryptoAmount.replaceAll(',', '.'));
|
|
if (fiatAmount != fiat) {
|
|
fiatAmount = fiat;
|
|
}
|
|
} catch (_) {
|
|
fiatAmount = '';
|
|
}
|
|
}
|
|
|
|
@action
|
|
void _updateCryptoAmount() {
|
|
try {
|
|
final crypto = double.parse(fiatAmount.replaceAll(',', '.')) /
|
|
_fiatConversationStore.prices[cryptoCurrencyHandler()]!;
|
|
final cryptoAmountTmp = _cryptoNumberFormat.format(crypto);
|
|
|
|
if (cryptoAmount != cryptoAmountTmp) {
|
|
cryptoAmount = cryptoAmountTmp;
|
|
}
|
|
} catch (e) {
|
|
cryptoAmount = '';
|
|
}
|
|
}
|
|
|
|
void _setCryptoNumMaximumFractionDigits() {
|
|
var maximumFractionDigits = 0;
|
|
|
|
switch (_wallet.type) {
|
|
case WalletType.monero:
|
|
maximumFractionDigits = 12;
|
|
break;
|
|
case WalletType.bitcoin:
|
|
maximumFractionDigits = 8;
|
|
break;
|
|
case WalletType.litecoin:
|
|
maximumFractionDigits = 8;
|
|
break;
|
|
case WalletType.haven:
|
|
maximumFractionDigits = 12;
|
|
break;
|
|
case WalletType.ethereum:
|
|
maximumFractionDigits = 12;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
_cryptoNumberFormat.maximumFractionDigits = maximumFractionDigits;
|
|
}
|
|
|
|
Future<void> fetchParsedAddress(BuildContext context) async {
|
|
final domain = address;
|
|
final ticker = cryptoCurrencyHandler().title.toLowerCase();
|
|
parsedAddress = await getIt.get<AddressResolver>().resolve(domain, ticker);
|
|
extractedAddress = await extractAddressFromParsed(context, parsedAddress);
|
|
note = parsedAddress.description;
|
|
}
|
|
|
|
void loadContact(ContactBase contact) {
|
|
address = contact.name;
|
|
parsedAddress = ParsedAddress.fetchContactAddress(address: contact.address, name: contact.name);
|
|
extractedAddress = parsedAddress.addresses.first;
|
|
note = parsedAddress.description;
|
|
}
|
|
}
|