import 'package:cake_wallet/bitcoin/bitcoin_amount_format.dart'; import 'package:cake_wallet/bitcoin/bitcoin_transaction_priority.dart'; import 'package:cake_wallet/bitcoin/electrum_wallet.dart'; import 'package:cake_wallet/entities/balance_display_mode.dart'; import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart'; import 'package:cake_wallet/entities/transaction_description.dart'; import 'package:cake_wallet/entities/transaction_priority.dart'; import 'package:cake_wallet/monero/monero_amount_format.dart'; import 'package:cake_wallet/view_model/settings/settings_view_model.dart'; import 'package:hive/hive.dart'; import 'package:intl/intl.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/entities/openalias_record.dart'; import 'package:cake_wallet/entities/template.dart'; import 'package:cake_wallet/store/templates/send_template_store.dart'; import 'package:cake_wallet/core/template_validator.dart'; import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/amount_validator.dart'; import 'package:cake_wallet/core/pending_transaction.dart'; import 'package:cake_wallet/core/validator.dart'; import 'package:cake_wallet/core/wallet_base.dart'; import 'package:cake_wallet/core/execution_state.dart'; import 'package:cake_wallet/bitcoin/bitcoin_wallet.dart'; import 'package:cake_wallet/bitcoin/bitcoin_transaction_credentials.dart'; import 'package:cake_wallet/monero/monero_wallet.dart'; import 'package:cake_wallet/monero/monero_transaction_creation_credentials.dart'; import 'package:cake_wallet/entities/sync_status.dart'; import 'package:cake_wallet/entities/crypto_currency.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; import 'package:cake_wallet/entities/monero_transaction_priority.dart'; import 'package:cake_wallet/entities/calculate_fiat_amount.dart'; import 'package:cake_wallet/entities/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/view_model/send/send_view_model_state.dart'; import 'package:cake_wallet/generated/i18n.dart'; part 'send_view_model.g.dart'; const String cryptoNumberPattern = '0.0'; class SendViewModel = SendViewModelBase with _$SendViewModel; abstract class SendViewModelBase with Store { SendViewModelBase(this._wallet, this._settingsStore, this._sendTemplateStore, this._fiatConversationStore, this.transactionDescriptionBox) : state = InitialExecutionState(), _cryptoNumberFormat = NumberFormat(cryptoNumberPattern), note = '', sendAll = false { final priority = _settingsStore.priority[_wallet.type]; final priorities = priorityForWalletType(_wallet.type); if (!priorityForWalletType(_wallet.type).contains(priority)) { _settingsStore.priority[_wallet.type] = priorities.first; } _setCryptoNumMaximumFractionDigits(); } @observable ExecutionState state; @observable String fiatAmount; @observable String cryptoAmount; @observable String address; @observable String note; @observable bool sendAll; @computed double get estimatedFee { int amount; try { if (cryptoAmount?.isNotEmpty ?? false) { final _cryptoAmount = cryptoAmount.replaceAll(',', '.'); int _amount = 0; switch (walletType) { case WalletType.monero: _amount = moneroParseAmount(amount: _cryptoAmount); break; case WalletType.bitcoin: _amount = stringDoubleToBitcoinAmount(_cryptoAmount); break; case WalletType.litecoin: _amount = stringDoubleToBitcoinAmount(_cryptoAmount); break; default: break; } if (_amount > 0) { amount = _amount; } } final fee = _wallet.calculateEstimatedFee( _settingsStore.priority[_wallet.type], amount); if (_wallet is ElectrumWallet) { return bitcoinAmountToDouble(amount: fee); } if (_wallet is MoneroWallet) { return moneroAmountToDouble(amount: fee); } } catch (e) { print(e.toString()); } return 0; } @computed String get estimatedFeeFiatAmount { try { final fiat = calculateFiatAmountRaw( price: _fiatConversationStore.prices[_wallet.currency], cryptoAmount: estimatedFee); return fiat; } catch (_) { return '0.00'; } } @computed String get pendingTransactionFiatAmount { try { if (pendingTransaction != null) { final fiat = calculateFiatAmount( price: _fiatConversationStore.prices[_wallet.currency], cryptoAmount: pendingTransaction.amountFormatted); return fiat; } else { return '0.00'; } } catch (_) { return '0.00'; } } @computed String get pendingTransactionFeeFiatAmount { try { if (pendingTransaction != null) { final fiat = calculateFiatAmount( price: _fiatConversationStore.prices[_wallet.currency], cryptoAmount: pendingTransaction.feeFormatted); return fiat; } else { return '0.00'; } } catch (_) { return '0.00'; } } FiatCurrency get fiat => _settingsStore.fiatCurrency; TransactionPriority get transactionPriority => _settingsStore.priority[_wallet.type]; CryptoCurrency get currency => _wallet.currency; Validator get amountValidator => AmountValidator(type: _wallet.type); Validator get allAmountValidator => AllAmountValidator(); Validator get addressValidator => AddressValidator(type: _wallet.currency); Validator get templateValidator => TemplateValidator(); @observable PendingTransaction pendingTransaction; @computed String get balance => _wallet.balance.formattedAvailableBalance ?? '0.0'; @computed bool get isReadyForSend => _wallet.syncStatus is SyncedSyncStatus; @computed ObservableList