diff --git a/lib/pages/receive_view/addresses/address_details_view.dart b/lib/pages/receive_view/addresses/address_details_view.dart index a89581649..6da7be3c9 100644 --- a/lib/pages/receive_view/addresses/address_details_view.dart +++ b/lib/pages/receive_view/addresses/address_details_view.dart @@ -13,8 +13,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:isar/isar.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:stackwallet/db/isar/main_db.dart'; -import 'package:stackwallet/models/isar/models/blockchain_data/v2/input_v2.dart'; -import 'package:stackwallet/models/isar/models/blockchain_data/v2/output_v2.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/pages/receive_view/addresses/address_tag.dart'; @@ -485,17 +483,42 @@ class _AddressDetailsTxV2List extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final query = ref - .watch(mainDBProvider) - .isar - .transactionV2s - .where() - .walletIdEqualTo(walletId) - .filter() - .inputsElement((q) => q.addressesElementContains(address.value)) - .or() - .outputsElement((q) => q.addressesElementContains(address.value)) - .sortByTimestampDesc(); + final walletTxFilter = + ref.watch(pWallets).getWallet(walletId).transactionFilterOperation; + + final query = + ref.watch(mainDBProvider).isar.transactionV2s.buildQuery( + whereClauses: [ + IndexWhereClause.equalTo( + indexName: 'walletId', + value: [walletId], + ) + ], + filter: FilterGroup.and([ + if (walletTxFilter != null) walletTxFilter, + FilterGroup.or([ + ObjectFilter( + property: 'inputs', + filter: FilterCondition.contains( + property: "addresses", + value: address.value, + ), + ), + ObjectFilter( + property: 'outputs', + filter: FilterCondition.contains( + property: "addresses", + value: address.value, + ), + ) + ]), + ]), + sortBy: [ + const SortProperty( + property: "timestamp", + sort: Sort.desc, + ), + ]); final count = query.countSync(); diff --git a/lib/pages/token_view/sub_widgets/token_transaction_list_widget.dart b/lib/pages/token_view/sub_widgets/token_transaction_list_widget.dart index 639024995..c77eae03c 100644 --- a/lib/pages/token_view/sub_widgets/token_transaction_list_widget.dart +++ b/lib/pages/token_view/sub_widgets/token_transaction_list_widget.dart @@ -13,7 +13,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:isar/isar.dart'; -import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'; import 'package:stackwallet/pages/wallet_view/sub_widgets/no_transactions_found.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list_item.dart'; @@ -45,7 +44,7 @@ class _TransactionsListState extends ConsumerState { List _transactions = []; late final StreamSubscription> _subscription; - late final QueryBuilder _query; + late final Query _query; BorderRadius get _borderRadiusFirst { return BorderRadius.only( @@ -76,19 +75,22 @@ class _TransactionsListState extends ConsumerState { .getWallet(widget.walletId) .cryptoCurrency .minConfirms; - - _query = ref - .read(mainDBProvider) - .isar - .transactionV2s - .where() - .walletIdEqualTo(widget.walletId) - .filter() - .subTypeEqualTo(TransactionSubType.ethToken) - .and() - .contractAddressEqualTo( - ref.read(pCurrentTokenWallet)!.tokenContract.address) - .sortByTimestampDesc(); + _query = + ref.read(mainDBProvider).isar.transactionV2s.buildQuery( + whereClauses: [ + IndexWhereClause.equalTo( + indexName: 'walletId', + value: [widget.walletId], + ) + ], + filter: ref.read(pCurrentTokenWallet)!.transactionFilterOperation, + sortBy: [ + const SortProperty( + property: "timestamp", + sort: Sort.desc, + ), + ], + ); _subscription = _query.watch().listen((event) { WidgetsBinding.instance.addPostFrameCallback((_) { diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart b/lib/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart index b5940d787..50a53291f 100644 --- a/lib/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart +++ b/lib/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart @@ -36,6 +36,7 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/format.dart'; import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/util.dart'; +import 'package:stackwallet/wallets/isar/providers/eth/current_token_wallet_provider.dart'; import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart'; import 'package:stackwallet/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart'; import 'package:stackwallet/widgets/conditional_parent.dart'; @@ -499,19 +500,14 @@ class _AllTransactionsV2ViewState extends ConsumerState { value: [widget.walletId], ) ], - // TODO: [prio=med] add filters to wallet or cryptocurrency class - filter: widget.contractAddress != null - ? FilterGroup.and([ - FilterCondition.equalTo( - property: r"contractAddress", - value: widget.contractAddress!, - ), - const FilterCondition.equalTo( - property: r"subType", - value: TransactionSubType.ethToken, - ), - ]) - : null, + filter: widget.contractAddress == null + ? ref + .watch(pWallets) + .getWallet(widget.walletId) + .transactionFilterOperation + : ref + .read(pCurrentTokenWallet)! + .transactionFilterOperation, sortBy: [ const SortProperty( property: "timestamp", diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart index 6835ebde6..f47417d99 100644 --- a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart +++ b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart @@ -43,7 +43,7 @@ class _TransactionsV2ListState extends ConsumerState { List _transactions = []; late final StreamSubscription> _subscription; - late final QueryBuilder _query; + late final Query _query; BorderRadius get _borderRadiusFirst { return BorderRadius.only( @@ -73,12 +73,23 @@ class _TransactionsV2ListState extends ConsumerState { .read(mainDBProvider) .isar .transactionV2s - .where() - .walletIdEqualTo(widget.walletId) - .filter() - .not() - .subTypeEqualTo(TransactionSubType.ethToken) - .sortByTimestampDesc(); + .buildQuery( + whereClauses: [ + IndexWhereClause.equalTo( + indexName: 'walletId', + value: [widget.walletId], + ) + ], + filter: ref + .read(pWallets) + .getWallet(widget.walletId) + .transactionFilterOperation, + sortBy: [ + const SortProperty( + property: "timestamp", + sort: Sort.desc, + ), + ]); _subscription = _query.watch().listen((event) { WidgetsBinding.instance.addPostFrameCallback((_) { diff --git a/lib/wallets/wallet/impl/ethereum_wallet.dart b/lib/wallets/wallet/impl/ethereum_wallet.dart index 4f0198637..fae9f040f 100644 --- a/lib/wallets/wallet/impl/ethereum_wallet.dart +++ b/lib/wallets/wallet/impl/ethereum_wallet.dart @@ -107,6 +107,14 @@ class EthereumWallet extends Bip39Wallet with PrivateKeyInterface { // ==================== Overrides ============================================ + @override + FilterOperation? get transactionFilterOperation => FilterGroup.not( + const FilterCondition.equalTo( + property: r"subType", + value: TransactionSubType.ethToken, + ), + ); + @override FilterOperation? get changeAddressFilterOperation => FilterGroup.and(standardChangeAddressFilters); diff --git a/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart b/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart index e9cc1cbf5..573ef5608 100644 --- a/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart +++ b/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart @@ -515,4 +515,16 @@ class EthTokenWallet extends Wallet { Future updateUTXOs() async { return await ethWallet.updateUTXOs(); } + + @override + FilterOperation? get transactionFilterOperation => FilterGroup.and([ + FilterCondition.equalTo( + property: r"contractAddress", + value: tokenContract.address, + ), + const FilterCondition.equalTo( + property: r"subType", + value: TransactionSubType.ethToken, + ), + ]); } diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index f55dbb547..1059b12cf 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -614,6 +614,8 @@ abstract class Wallet { // =========================================================================== + FilterOperation? get transactionFilterOperation => null; + FilterOperation? get receivingAddressFilterOperation; FilterOperation? get changeAddressFilterOperation; diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart index a9385e837..a2700fff6 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart @@ -1749,4 +1749,20 @@ mixin PaynymInterface utxoLabel: utxoLabel ); } + + @override + FilterOperation? get transactionFilterOperation => FilterGroup.not( + const FilterGroup.and( + [ + FilterCondition.equalTo( + property: r"subType", + value: TransactionSubType.bip47Notification, + ), + FilterCondition.equalTo( + property: r"type", + value: TransactionType.incoming, + ), + ], + ), + ); }