mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-30 06:48:49 +01:00
* Fix stub creation * Generate MWEB addresses * Fix mweb address derivation * Use camel-case * Show utxos in tx list * A few fixes * Add spent processing * Update balance * Balance fixes * Update address records * Get rid of debounce hack * Get sending up to the confirmation box * Fee estimation * Stop the daemon if plugin is unloaded * Normal fee for non-mweb txns * Fix fee estimation for send all * Don't hash mweb addresses * More fee fixes * Broadcast mweb * Remove test files * One more * Confirm sent txns * Couple of fixes * Resign inputs after mweb create * Some more fixes * Update balance after sending * Correctly update address records * Update confs * [skip ci] updates * [skip ci] add dep overrides * working * small fix * merge fixes [skip ci] * merge fixes [skip ci] * [skip ci] minor fixes * silent payment fixes [skip ci] * updates [skip ci] * save [skip ci] * use mwebutxos box * [skip ci] lots of fixes, still testing * add rescan from height feature and test workflow build * install go * use sudo * correct package name * move building mweb higher for faster testing * install fixes * install later version of go * go fixes * testing * testing * testing * testing * testing * should workgit add .github/workflows/pr_test_build.yml * ??? * ??? pt.2 * should work, for real this time * fix tx history not persisting + update build_mwebd script * updates * fix some rescan and address gen issues * save [skip ci] * fix unconfirmed balance not updating when receiving * unspent coins / coin control fixes * coin control fixes * address balance and txCount fixes, try/catch electrum call * fix txCount for addresses * save [skip ci] * potential fixes * minor fix * minor fix - 2 * sync status fixes, potential fix for background state issue * workflow and script updates * updates * expirimental optimization * [skip ci] minor enhancements * workflow and script fixes * workflow minor cleanup [skip ci] * minor code cleanup & friendlier error message on failed tx's * balance when sending fix * experimental * more experiments * save * updates * coin control edge cases * remove neutrino.db if no litecoin wallets left after deleting * update translations * updates * minor fix * [skip ci] update translations + minor fixes * state fixes * configure fix * ui updates * translation fixes * [skip ci] addressbook updates * fix popup * fix popup2 * fix litecoin address book * fix ios mwebd build script * fix for building monero.com * minor fix * uncomment fix for state issues * potential mweb sync fix (ios) * remove print [skip ci] * electrum stream potential fix * fix ios build issues [skip ci] * connection reliability updates, update kotlin code to match swift code, minor electrum error handling * dep fixes * minor fix * more merge fixes * bitcoin_flutter removal fixes * [skip ci] fix always scan setting, swift updates * updates * fixes * small fix * small fix * fix * dart:convert != package:convert * change address fixes * update bitcoin_base to fix mweb address program checking * fix ios xcode project [skip ci] * updates * more fixes * more fixes * ensure we don't initialize mweb until we really have to * fix regression * improve mweb reliability * [skip ci] wip adress generation * wip * wip * [skip ci] wip * updates [skip ci] * ios fixes * fix workflows + ios fix * test old mweb version * update go version and mwebd hash * review updates pt.1 * Update cw_bitcoin/lib/litecoin_wallet.dart Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com> * remove non-litecoin address types regex [skip ci] * more minor fixes * remove duplicate [skip ci] * Update lib/store/settings_store.dart Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com> * script updates, swap params on createLitecoinWalletService * topup fix * [skip ci] wip * [skip ci] testing * [skip ci] file didn't get saved * more address generation reliability fixes * [skip ci] minor * minor code cleanup * hopefully prevents send issue * [skip ci] wip address changes * [skip ci] save * save mweb addresses, auto-restart sync process if it gets stuck [skip ci] * address generation issues mostly resolved * more performance fixes * [skip ci] * this should maybe be refactored, pt.1 * separate mweb balances, pt.2 * [skip ci] save * add translations [skip ci] * fix sending with mweb amounts * works for simple mweb-mweb case, further testing needed * found an edge case * [skip ci] make failed broadcast error message less serious * minor * capture all grpc errors and much better error handling overall * [skip ci] minor * prevent transactions with < 6 confirmations from being used + hide mweb balances if mweb is off * fix * merge fixes pt.1 [skip ci] * fix mweb tags * fix * [skip ci] fix tag spacing * fix transaction history not showing up * fix mweb crash on non-fully deleted mweb cache, sync status ETA, other connection fixes * [skip ci] minor code cleanup * [skip ci] minor code cleanup * additional cleanup * silent payments eta fixes and updates * revert sync eta changes into separate pr * [skip ci] minor * [skip ci] minor * revert sync status title * review fixes, additional cleanup * [skip ci] minor * [skip ci] minor * [skip ci] minor * trigger build * review fixes, pt.2 * check if still processing utxos before updating sync status [skip ci] * [skip ci] minor * balance fix * minor * minor * [skip ci] minor * [skip ci] fix test net btc * don't use mwebd for non-mweb tx's * [skip ci] minor cleanup * don't show all 1000+ mweb addresses on receive page * minor cleanup + additional logging --------- Co-authored-by: Hector Chu <hectorchu@gmail.com> Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com> Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net>
195 lines
7.1 KiB
Dart
195 lines
7.1 KiB
Dart
import 'package:cake_wallet/entities/balance_display_mode.dart';
|
|
import 'package:cake_wallet/entities/fiat_currency.dart';
|
|
import 'package:cake_wallet/ethereum/ethereum.dart';
|
|
import 'package:cake_wallet/generated/i18n.dart';
|
|
import 'package:cake_wallet/nano/nano.dart';
|
|
import 'package:cake_wallet/polygon/polygon.dart';
|
|
import 'package:cake_wallet/reactions/wallet_connect.dart';
|
|
import 'package:cake_wallet/solana/solana.dart';
|
|
import 'package:cake_wallet/tron/tron.dart';
|
|
import 'package:cake_wallet/wownero/wownero.dart';
|
|
import 'package:cw_core/crypto_currency.dart';
|
|
import 'package:cw_core/transaction_direction.dart';
|
|
import 'package:cw_core/transaction_info.dart';
|
|
import 'package:cake_wallet/store/settings_store.dart';
|
|
import 'package:cake_wallet/view_model/dashboard/action_list_item.dart';
|
|
import 'package:cake_wallet/monero/monero.dart';
|
|
import 'package:cake_wallet/haven/haven.dart';
|
|
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
|
import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart';
|
|
import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart';
|
|
import 'package:cw_core/keyable.dart';
|
|
import 'package:cw_core/wallet_type.dart';
|
|
|
|
class TransactionListItem extends ActionListItem with Keyable {
|
|
TransactionListItem(
|
|
{required this.transaction, required this.balanceViewModel, required this.settingsStore});
|
|
|
|
final TransactionInfo transaction;
|
|
final BalanceViewModel balanceViewModel;
|
|
final SettingsStore settingsStore;
|
|
|
|
double get price => balanceViewModel.price;
|
|
|
|
FiatCurrency get fiatCurrency => settingsStore.fiatCurrency;
|
|
|
|
BalanceDisplayMode get displayMode => balanceViewModel.displayMode;
|
|
|
|
@override
|
|
dynamic get keyIndex => transaction.id;
|
|
|
|
bool get hasTokens =>
|
|
isEVMCompatibleChain(balanceViewModel.wallet.type) ||
|
|
balanceViewModel.wallet.type == WalletType.solana ||
|
|
balanceViewModel.wallet.type == WalletType.tron;
|
|
|
|
String get formattedCryptoAmount {
|
|
return displayMode == BalanceDisplayMode.hiddenBalance ? '---' : transaction.amountFormatted();
|
|
}
|
|
|
|
String get formattedTitle {
|
|
if (transaction.direction == TransactionDirection.incoming) {
|
|
return S.current.received;
|
|
}
|
|
|
|
return S.current.sent;
|
|
}
|
|
|
|
String get formattedPendingStatus {
|
|
if (balanceViewModel.wallet.type == WalletType.monero ||
|
|
balanceViewModel.wallet.type == WalletType.haven) {
|
|
if (transaction.confirmations >= 0 && transaction.confirmations < 10) {
|
|
return ' (${transaction.confirmations}/10)';
|
|
}
|
|
} else if (balanceViewModel.wallet.type == WalletType.wownero) {
|
|
if (transaction.confirmations >= 0 && transaction.confirmations < 3) {
|
|
return ' (${transaction.confirmations}/3)';
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
String get formattedStatus {
|
|
if (balanceViewModel.wallet.type == WalletType.monero ||
|
|
balanceViewModel.wallet.type == WalletType.wownero ||
|
|
balanceViewModel.wallet.type == WalletType.haven) {
|
|
return formattedPendingStatus;
|
|
}
|
|
return transaction.isPending ? S.current.pending : '';
|
|
}
|
|
|
|
String get formattedType {
|
|
if (transaction.evmSignatureName == 'approval') {
|
|
return ' (${transaction.evmSignatureName})';
|
|
}
|
|
return '';
|
|
}
|
|
|
|
CryptoCurrency? get assetOfTransaction {
|
|
try {
|
|
if (balanceViewModel.wallet.type == WalletType.ethereum) {
|
|
final asset = ethereum!.assetOfTransaction(balanceViewModel.wallet, transaction);
|
|
return asset;
|
|
}
|
|
|
|
if (balanceViewModel.wallet.type == WalletType.polygon) {
|
|
final asset = polygon!.assetOfTransaction(balanceViewModel.wallet, transaction);
|
|
return asset;
|
|
}
|
|
|
|
if (balanceViewModel.wallet.type == WalletType.solana) {
|
|
final asset = solana!.assetOfTransaction(balanceViewModel.wallet, transaction);
|
|
return asset;
|
|
}
|
|
|
|
if (balanceViewModel.wallet.type == WalletType.tron) {
|
|
final asset = tron!.assetOfTransaction(balanceViewModel.wallet, transaction);
|
|
return asset;
|
|
}
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
String get formattedFiatAmount {
|
|
var amount = '';
|
|
|
|
switch (balanceViewModel.wallet.type) {
|
|
case WalletType.monero:
|
|
amount = calculateFiatAmountRaw(
|
|
cryptoAmount: monero!.formatterMoneroAmountToDouble(amount: transaction.amount),
|
|
price: price);
|
|
break;
|
|
case WalletType.wownero:
|
|
amount = calculateFiatAmountRaw(
|
|
cryptoAmount: wownero!.formatterWowneroAmountToDouble(amount: transaction.amount),
|
|
price: price);
|
|
break;
|
|
case WalletType.bitcoin:
|
|
case WalletType.litecoin:
|
|
case WalletType.bitcoinCash:
|
|
amount = calculateFiatAmountRaw(
|
|
cryptoAmount: bitcoin!.formatterBitcoinAmountToDouble(amount: transaction.amount),
|
|
price: price);
|
|
break;
|
|
case WalletType.haven:
|
|
final asset = haven!.assetOfTransaction(transaction);
|
|
final price = balanceViewModel.fiatConvertationStore.prices[asset];
|
|
amount = calculateFiatAmountRaw(
|
|
cryptoAmount: haven!.formatterMoneroAmountToDouble(amount: transaction.amount),
|
|
price: price);
|
|
break;
|
|
case WalletType.ethereum:
|
|
final asset = ethereum!.assetOfTransaction(balanceViewModel.wallet, transaction);
|
|
final price = balanceViewModel.fiatConvertationStore.prices[asset];
|
|
amount = calculateFiatAmountRaw(
|
|
cryptoAmount: ethereum!.formatterEthereumAmountToDouble(transaction: transaction),
|
|
price: price);
|
|
break;
|
|
case WalletType.polygon:
|
|
final asset = polygon!.assetOfTransaction(balanceViewModel.wallet, transaction);
|
|
final price = balanceViewModel.fiatConvertationStore.prices[asset];
|
|
amount = calculateFiatAmountRaw(
|
|
cryptoAmount: polygon!.formatterPolygonAmountToDouble(transaction: transaction),
|
|
price: price);
|
|
break;
|
|
case WalletType.nano:
|
|
amount = calculateFiatAmountRaw(
|
|
cryptoAmount: double.parse(nanoUtil!.getRawAsUsableString(
|
|
nano!.getTransactionAmountRaw(transaction).toString(), nanoUtil!.rawPerNano)),
|
|
price: price);
|
|
break;
|
|
case WalletType.solana:
|
|
final asset = solana!.assetOfTransaction(balanceViewModel.wallet, transaction);
|
|
final price = balanceViewModel.fiatConvertationStore.prices[asset];
|
|
amount = calculateFiatAmountRaw(
|
|
cryptoAmount: solana!.getTransactionAmountRaw(transaction),
|
|
price: price,
|
|
);
|
|
break;
|
|
|
|
case WalletType.tron:
|
|
final asset = tron!.assetOfTransaction(balanceViewModel.wallet, transaction);
|
|
final price = balanceViewModel.fiatConvertationStore.prices[asset];
|
|
final cryptoAmount = tron!.getTransactionAmountRaw(transaction);
|
|
amount = calculateFiatAmountRaw(
|
|
cryptoAmount: cryptoAmount,
|
|
price: price,
|
|
);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
transaction.changeFiatAmount(amount);
|
|
return displayMode == BalanceDisplayMode.hiddenBalance
|
|
? '---'
|
|
: fiatCurrency.title + ' ' + transaction.fiatAmount();
|
|
}
|
|
|
|
@override
|
|
DateTime get date => transaction.date;
|
|
}
|