2022-03-15 09:11:53 +00:00
|
|
|
import 'package:cake_wallet/di.dart';
|
2021-07-16 09:32:36 +00:00
|
|
|
import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart';
|
2021-07-22 16:48:26 +00:00
|
|
|
import 'package:cake_wallet/entities/parse_address_from_domain.dart';
|
|
|
|
import 'package:cake_wallet/entities/parsed_address.dart';
|
2023-08-04 17:01:49 +00:00
|
|
|
import 'package:cake_wallet/ethereum/ethereum.dart';
|
2022-03-30 15:57:04 +00:00
|
|
|
import 'package:cake_wallet/haven/haven.dart';
|
2021-09-29 11:38:31 +00:00
|
|
|
import 'package:cake_wallet/src/screens/send/widgets/extract_address_from_parsed.dart';
|
2022-03-30 15:57:04 +00:00
|
|
|
import 'package:cw_core/crypto_currency.dart';
|
2021-07-16 09:32:36 +00:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:intl/intl.dart';
|
|
|
|
import 'package:mobx/mobx.dart';
|
2021-12-24 12:37:24 +00:00
|
|
|
import 'package:cw_core/wallet_base.dart';
|
|
|
|
import 'package:cake_wallet/monero/monero.dart';
|
2021-07-16 09:32:36 +00:00
|
|
|
import 'package:cake_wallet/entities/calculate_fiat_amount.dart';
|
2021-12-24 12:37:24 +00:00
|
|
|
import 'package:cw_core/wallet_type.dart';
|
2021-07-16 09:32:36 +00:00
|
|
|
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';
|
2021-12-24 12:37:24 +00:00
|
|
|
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
2021-07-16 09:32:36 +00:00
|
|
|
|
2023-08-01 12:00:00 +00:00
|
|
|
import 'package:cake_wallet/entities/contact_base.dart';
|
|
|
|
|
2021-08-10 14:52:35 +00:00
|
|
|
part 'output.g.dart';
|
2021-07-16 09:32:36 +00:00
|
|
|
|
|
|
|
const String cryptoNumberPattern = '0.0';
|
|
|
|
|
2021-08-10 14:52:35 +00:00
|
|
|
class Output = OutputBase with _$Output;
|
2021-07-16 09:32:36 +00:00
|
|
|
|
2021-08-10 14:52:35 +00:00
|
|
|
abstract class OutputBase with Store {
|
2022-03-30 15:57:04 +00:00
|
|
|
OutputBase(this._wallet, this._settingsStore, this._fiatConversationStore, this.cryptoCurrencyHandler)
|
2022-10-12 17:09:57 +00:00
|
|
|
: _cryptoNumberFormat = NumberFormat(cryptoNumberPattern),
|
|
|
|
key = UniqueKey(),
|
|
|
|
sendAll = false,
|
|
|
|
cryptoAmount = '',
|
|
|
|
fiatAmount = '',
|
|
|
|
address = '',
|
|
|
|
note = '',
|
|
|
|
extractedAddress = '',
|
|
|
|
parsedAddress = ParsedAddress(addresses: []) {
|
2021-07-16 09:32:36 +00:00
|
|
|
_setCryptoNumMaximumFractionDigits();
|
|
|
|
}
|
|
|
|
|
|
|
|
Key key;
|
|
|
|
|
|
|
|
@observable
|
|
|
|
String fiatAmount;
|
|
|
|
|
|
|
|
@observable
|
|
|
|
String cryptoAmount;
|
|
|
|
|
|
|
|
@observable
|
|
|
|
String address;
|
|
|
|
|
|
|
|
@observable
|
|
|
|
String note;
|
|
|
|
|
|
|
|
@observable
|
|
|
|
bool sendAll;
|
|
|
|
|
2021-09-22 13:47:10 +00:00
|
|
|
@observable
|
2021-09-20 14:56:27 +00:00
|
|
|
ParsedAddress parsedAddress;
|
|
|
|
|
2021-09-22 13:47:10 +00:00
|
|
|
@observable
|
|
|
|
String extractedAddress;
|
|
|
|
|
|
|
|
@computed
|
2022-01-18 07:46:13 +00:00
|
|
|
bool get isParsedAddress =>
|
|
|
|
parsedAddress.parseFrom != ParseFrom.notParsed &&
|
|
|
|
parsedAddress.name.isNotEmpty;
|
2021-09-22 13:47:10 +00:00
|
|
|
|
2021-07-16 09:32:36 +00:00
|
|
|
@computed
|
2021-08-10 14:52:35 +00:00
|
|
|
int get formattedCryptoAmount {
|
|
|
|
int amount = 0;
|
2021-07-16 09:32:36 +00:00
|
|
|
|
|
|
|
try {
|
2023-08-01 12:00:00 +00:00
|
|
|
if (cryptoAmount.isNotEmpty) {
|
2021-07-16 09:32:36 +00:00
|
|
|
final _cryptoAmount = cryptoAmount.replaceAll(',', '.');
|
|
|
|
int _amount = 0;
|
|
|
|
switch (walletType) {
|
|
|
|
case WalletType.monero:
|
2022-10-12 17:09:57 +00:00
|
|
|
_amount = monero!.formatterMoneroParseAmount(amount: _cryptoAmount);
|
2021-07-16 09:32:36 +00:00
|
|
|
break;
|
|
|
|
case WalletType.bitcoin:
|
2022-01-18 07:46:13 +00:00
|
|
|
_amount =
|
2022-10-12 17:09:57 +00:00
|
|
|
bitcoin!.formatterStringDoubleToBitcoinAmount(_cryptoAmount);
|
2021-07-16 09:32:36 +00:00
|
|
|
break;
|
|
|
|
case WalletType.litecoin:
|
2022-01-18 07:46:13 +00:00
|
|
|
_amount =
|
2022-10-12 17:09:57 +00:00
|
|
|
bitcoin!.formatterStringDoubleToBitcoinAmount(_cryptoAmount);
|
2021-07-16 09:32:36 +00:00
|
|
|
break;
|
2022-03-30 15:57:04 +00:00
|
|
|
case WalletType.haven:
|
2022-10-12 17:09:57 +00:00
|
|
|
_amount = haven!.formatterMoneroParseAmount(amount: _cryptoAmount);
|
2022-03-30 15:57:04 +00:00
|
|
|
break;
|
2023-08-04 17:01:49 +00:00
|
|
|
case WalletType.ethereum:
|
|
|
|
_amount = ethereum!.formatterEthereumParseAmount(_cryptoAmount);
|
|
|
|
break;
|
2021-07-16 09:32:36 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_amount > 0) {
|
|
|
|
amount = _amount;
|
|
|
|
}
|
|
|
|
}
|
2022-01-18 07:46:13 +00:00
|
|
|
} catch (e) {
|
2021-08-10 14:52:35 +00:00
|
|
|
amount = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return amount;
|
|
|
|
}
|
2021-07-16 09:32:36 +00:00
|
|
|
|
2021-08-10 14:52:35 +00:00
|
|
|
@computed
|
|
|
|
double get estimatedFee {
|
|
|
|
try {
|
2021-07-16 09:32:36 +00:00
|
|
|
final fee = _wallet.calculateEstimatedFee(
|
2022-10-12 17:09:57 +00:00
|
|
|
_settingsStore.priority[_wallet.type]!, formattedCryptoAmount);
|
2021-07-16 09:32:36 +00:00
|
|
|
|
2022-01-18 07:46:13 +00:00
|
|
|
if (_wallet.type == WalletType.bitcoin ||
|
|
|
|
_wallet.type == WalletType.litecoin) {
|
2022-10-12 17:09:57 +00:00
|
|
|
return bitcoin!.formatterBitcoinAmountToDouble(amount: fee);
|
2021-07-16 09:32:36 +00:00
|
|
|
}
|
|
|
|
|
2021-12-24 12:37:24 +00:00
|
|
|
if (_wallet.type == WalletType.monero) {
|
2022-10-12 17:09:57 +00:00
|
|
|
return monero!.formatterMoneroAmountToDouble(amount: fee);
|
2021-07-16 09:32:36 +00:00
|
|
|
}
|
2022-03-30 15:57:04 +00:00
|
|
|
|
|
|
|
if (_wallet.type == WalletType.haven) {
|
2022-10-12 17:09:57 +00:00
|
|
|
return haven!.formatterMoneroAmountToDouble(amount: fee);
|
2022-03-30 15:57:04 +00:00
|
|
|
}
|
2023-08-04 17:01:49 +00:00
|
|
|
|
|
|
|
if (_wallet.type == WalletType.ethereum) {
|
|
|
|
return ethereum!.formatterEthereumAmountToDouble(amount: BigInt.from(fee));
|
|
|
|
}
|
2021-07-16 09:32:36 +00:00
|
|
|
} catch (e) {
|
|
|
|
print(e.toString());
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
@computed
|
|
|
|
String get estimatedFeeFiatAmount {
|
|
|
|
try {
|
2023-08-04 17:01:49 +00:00
|
|
|
final currency = _wallet.type == WalletType.ethereum ? _wallet.currency : cryptoCurrencyHandler();
|
2021-07-16 09:32:36 +00:00
|
|
|
final fiat = calculateFiatAmountRaw(
|
2023-08-04 17:01:49 +00:00
|
|
|
price: _fiatConversationStore.prices[currency]!,
|
2021-07-16 09:32:36 +00:00
|
|
|
cryptoAmount: estimatedFee);
|
|
|
|
return fiat;
|
|
|
|
} catch (_) {
|
|
|
|
return '0.00';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
WalletType get walletType => _wallet.type;
|
2022-03-30 15:57:04 +00:00
|
|
|
final CryptoCurrency Function() cryptoCurrencyHandler;
|
2021-07-16 09:32:36 +00:00
|
|
|
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 = '';
|
2021-09-20 14:56:27 +00:00
|
|
|
resetParsedAddress();
|
|
|
|
}
|
|
|
|
|
|
|
|
void resetParsedAddress() {
|
2021-09-22 13:47:10 +00:00
|
|
|
extractedAddress = '';
|
2021-09-20 14:56:27 +00:00
|
|
|
parsedAddress = ParsedAddress(addresses: []);
|
2021-07-16 09:32:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@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(
|
2022-10-12 17:09:57 +00:00
|
|
|
price: _fiatConversationStore.prices[cryptoCurrencyHandler()]!,
|
2021-07-16 09:32:36 +00:00
|
|
|
cryptoAmount: cryptoAmount.replaceAll(',', '.'));
|
|
|
|
if (fiatAmount != fiat) {
|
|
|
|
fiatAmount = fiat;
|
|
|
|
}
|
|
|
|
} catch (_) {
|
|
|
|
fiatAmount = '';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@action
|
|
|
|
void _updateCryptoAmount() {
|
|
|
|
try {
|
|
|
|
final crypto = double.parse(fiatAmount.replaceAll(',', '.')) /
|
2022-10-12 17:09:57 +00:00
|
|
|
_fiatConversationStore.prices[cryptoCurrencyHandler()]!;
|
2021-07-16 09:32:36 +00:00
|
|
|
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;
|
2022-03-30 15:57:04 +00:00
|
|
|
case WalletType.haven:
|
|
|
|
maximumFractionDigits = 12;
|
|
|
|
break;
|
2023-08-04 17:01:49 +00:00
|
|
|
case WalletType.ethereum:
|
|
|
|
maximumFractionDigits = 12;
|
|
|
|
break;
|
2021-07-16 09:32:36 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
_cryptoNumberFormat.maximumFractionDigits = maximumFractionDigits;
|
|
|
|
}
|
|
|
|
|
2021-09-20 14:56:27 +00:00
|
|
|
Future<void> fetchParsedAddress(BuildContext context) async {
|
2021-07-22 16:48:26 +00:00
|
|
|
final domain = address;
|
2022-03-30 15:57:04 +00:00
|
|
|
final ticker = cryptoCurrencyHandler().title.toLowerCase();
|
2022-03-15 09:11:53 +00:00
|
|
|
parsedAddress = await getIt.get<AddressResolver>().resolve(domain, ticker);
|
2021-09-29 11:38:31 +00:00
|
|
|
extractedAddress = await extractAddressFromParsed(context, parsedAddress);
|
2022-01-18 07:46:13 +00:00
|
|
|
note = parsedAddress.description;
|
2021-07-16 09:32:36 +00:00
|
|
|
}
|
2023-08-01 12:00:00 +00:00
|
|
|
|
|
|
|
void loadContact(ContactBase contact) {
|
|
|
|
address = contact.name;
|
|
|
|
parsedAddress = ParsedAddress.fetchContactAddress(address: contact.address, name: contact.name);
|
|
|
|
extractedAddress = parsedAddress.addresses.first;
|
|
|
|
note = parsedAddress.description;
|
|
|
|
}
|
2022-01-18 07:46:13 +00:00
|
|
|
}
|