mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-19 05:58:50 +02:00
* initial commit * creating and restoring a wallet * [skip ci] add transaction priority * fix send and unspent screen * fix transaction priority type * replace Unspend with BitcoinUnspent * add transaction creation * fix transaction details screen * minor fix * fix create side wallet * basic transaction creation flow * fix fiat amount calculation * edit wallet * minor fix * fix address book parsing * merge commit fixes * minor fixes * Update gradle.properties * fix bch unspent coins * minor fix * fix BitcoinCashTransactionPriority * Fetch tags first before switching to one of them * Update build_haven.sh * Update build_haven.sh * Update build_haven.sh * Update build_haven.sh * update transaction build function * Update build_haven.sh * add ability to rename and delete * fix address format * Update pubspec.lock * Revert "fix address format" This reverts commit 1549bf4d8c3bdb0addbd6e3c5f049ebc3799ff8f. * fix address format for exange * restore from qr * Update configure.dart * [skip ci] minor fix * fix default fee rate * Update onramper_buy_provider.dart * Update wallet_address_list_view_model.dart * PR comments fixes * Update exchange_view_model.dart * fix merge conflict * Update address_validator.dart * merge fixes * update initialMigrationVersion * move cw_bitbox to Cake tech * PR fixes * PR fixes * Fix configure.dart brackets * update the new version text after macos * dummy change to run workflow * Fix Nano restore from QR issue Fix Conflicts with main * PR fixes * Update app_config.sh --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
267 lines
7.1 KiB
Dart
267 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:
|
|
case WalletType.litecoin:
|
|
case WalletType.bitcoinCash:
|
|
_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 ||
|
|
_wallet.type == WalletType.bitcoinCash) {
|
|
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.bitcoinCash:
|
|
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;
|
|
}
|
|
}
|