use cached txs in xmr wallet service instead of querying wallet

This commit is contained in:
woodser 2024-04-19 13:17:42 -04:00
parent a107acbdb4
commit 8097b0f499
8 changed files with 36 additions and 22 deletions

View file

@ -158,7 +158,7 @@ class CoreWalletsService {
List<MoneroTxWallet> getXmrTxs() { List<MoneroTxWallet> getXmrTxs() {
accountService.checkAccountOpen(); accountService.checkAccountOpen();
return xmrWalletService.getWallet().getTxs(); return xmrWalletService.getTxs();
} }
MoneroTxWallet createXmrTx(List<MoneroDestination> destinations) { MoneroTxWallet createXmrTx(List<MoneroDestination> destinations) {

View file

@ -947,14 +947,14 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
// return split output tx if already assigned // return split output tx if already assigned
if (openOffer != null && openOffer.getSplitOutputTxHash() != null) { if (openOffer != null && openOffer.getSplitOutputTxHash() != null) {
return xmrWalletService.getWallet().getTx(openOffer.getSplitOutputTxHash()); return xmrWalletService.getTx(openOffer.getSplitOutputTxHash());
} }
// return earliest tx with exact amount to offer's subaddress if available // return earliest tx with exact amount to offer's subaddress if available
if (preferredSubaddressIndex != null) { if (preferredSubaddressIndex != null) {
// get txs with exact output amount // get txs with exact output amount
fundingTxs = xmrWalletService.getWallet().getTxs(new MoneroTxQuery() fundingTxs = xmrWalletService.getTxs(new MoneroTxQuery()
.setIsConfirmed(true) .setIsConfirmed(true)
.setOutputQuery(new MoneroOutputQuery() .setOutputQuery(new MoneroOutputQuery()
.setAccountIndex(0) .setAccountIndex(0)
@ -972,7 +972,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
if (openOffer.getScheduledTxHashes() != null) return null; if (openOffer.getScheduledTxHashes() != null) return null;
// get all transactions including from pool // get all transactions including from pool
List<MoneroTxWallet> allTxs = xmrWalletService.getTransactions(false); List<MoneroTxWallet> allTxs = xmrWalletService.getTxs(false);
if (preferredSubaddressIndex != null) { if (preferredSubaddressIndex != null) {
@ -1067,7 +1067,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
} }
// get locked txs // get locked txs
List<MoneroTxWallet> lockedTxs = xmrWalletService.getWallet().getTxs(new MoneroTxQuery().setIsLocked(true)); List<MoneroTxWallet> lockedTxs = xmrWalletService.getTxs(new MoneroTxQuery().setIsLocked(true));
// get earliest unscheduled txs with sufficient incoming amount // get earliest unscheduled txs with sufficient incoming amount
List<String> scheduledTxHashes = new ArrayList<String>(); List<String> scheduledTxHashes = new ArrayList<String>();

View file

@ -1215,7 +1215,7 @@ public abstract class Trade implements Tradable, Model {
} }
// then check daemon // then check daemon
if (tx == null) tx = getXmrWalletService().getTxWithCache(txId); if (tx == null) tx = xmrWalletService.getDaemonTxWithCache(txId);
return tx; return tx;
} }
@ -1541,7 +1541,7 @@ public abstract class Trade implements Tradable, Model {
@Nullable @Nullable
public MoneroTx getPayoutTx() { public MoneroTx getPayoutTx() {
if (payoutTx == null) { if (payoutTx == null) {
payoutTx = payoutTxId == null ? null : (this instanceof ArbitratorTrade) ? xmrWalletService.getTxWithCache(payoutTxId) : xmrWalletService.getWallet().getTx(payoutTxId); payoutTx = payoutTxId == null ? null : (this instanceof ArbitratorTrade) ? xmrWalletService.getDaemonTxWithCache(payoutTxId) : xmrWalletService.getTx(payoutTxId);
} }
return payoutTx; return payoutTx;
} }

View file

@ -779,12 +779,12 @@ public class XmrWalletService {
return feeEstimate; return feeEstimate;
} }
public MoneroTx getTx(String txHash) { public MoneroTx getDaemonTx(String txHash) {
List<MoneroTx> txs = getTxs(Arrays.asList(txHash)); List<MoneroTx> txs = getDaemonTxs(Arrays.asList(txHash));
return txs.isEmpty() ? null : txs.get(0); return txs.isEmpty() ? null : txs.get(0);
} }
public List<MoneroTx> getTxs(List<String> txHashes) { public List<MoneroTx> getDaemonTxs(List<String> txHashes) {
synchronized (txCache) { synchronized (txCache) {
// fetch txs // fetch txs
@ -804,12 +804,12 @@ public class XmrWalletService {
} }
} }
public MoneroTx getTxWithCache(String txHash) { public MoneroTx getDaemonTxWithCache(String txHash) {
List<MoneroTx> cachedTxs = getTxsWithCache(Arrays.asList(txHash)); List<MoneroTx> cachedTxs = getDaemonTxsWithCache(Arrays.asList(txHash));
return cachedTxs.isEmpty() ? null : cachedTxs.get(0); return cachedTxs.isEmpty() ? null : cachedTxs.get(0);
} }
public List<MoneroTx> getTxsWithCache(List<String> txHashes) { public List<MoneroTx> getDaemonTxsWithCache(List<String> txHashes) {
synchronized (txCache) { synchronized (txCache) {
try { try {
// get cached txs // get cached txs
@ -821,7 +821,7 @@ public class XmrWalletService {
} }
// return txs from cache if available, otherwise fetch // return txs from cache if available, otherwise fetch
return uncachedTxHashes.isEmpty() ? cachedTxs : getTxs(txHashes); return uncachedTxHashes.isEmpty() ? cachedTxs : getDaemonTxs(txHashes);
} catch (Exception e) { } catch (Exception e) {
if (!isShutDownStarted) throw e; if (!isShutDownStarted) throw e;
return null; return null;
@ -1136,13 +1136,27 @@ public class XmrWalletService {
xmrAddressEntryList.requestPersistence(); xmrAddressEntryList.requestPersistence();
} }
public List<MoneroTxWallet> getTransactions(boolean includeFailed) { public List<MoneroTxWallet> getTxs(boolean includeFailed) {
List<MoneroTxWallet> txs = getTxs();
if (includeFailed) return txs;
return txs.stream().filter(tx -> !tx.isFailed()).collect(Collectors.toList());
}
public List<MoneroTxWallet> getTxs() {
return getTxs(new MoneroTxQuery());
}
public List<MoneroTxWallet> getTxs(MoneroTxQuery query) {
if (cachedTxs == null) { if (cachedTxs == null) {
log.warn("Transactions not cached, fetching from wallet"); log.warn("Transactions not cached, fetching from wallet");
cachedTxs = wallet.getTxs(new MoneroTxQuery().setIncludeOutputs(true)); // fetches from pool cachedTxs = wallet.getTxs(new MoneroTxQuery().setIncludeOutputs(true)); // fetches from pool
} }
if (includeFailed) return cachedTxs; return cachedTxs.stream().filter(tx -> query.meetsCriteria(tx)).collect(Collectors.toList());
return cachedTxs.stream().filter(tx -> !tx.isFailed()).collect(Collectors.toList()); }
public MoneroTxWallet getTx(String txId) {
List<MoneroTxWallet> txs = getTxs(new MoneroTxQuery().setHash(txId));
return txs.isEmpty() ? null : txs.get(0);
} }
public BigInteger getBalance() { public BigInteger getBalance() {

View file

@ -171,7 +171,7 @@ public class TxIdTextField extends AnchorPane {
private synchronized void updateConfidence(String txId, boolean useCache, Long height) { private synchronized void updateConfidence(String txId, boolean useCache, Long height) {
MoneroTx tx = null; MoneroTx tx = null;
try { try {
tx = useCache ? xmrWalletService.getTxWithCache(txId) : xmrWalletService.getTx(txId); tx = useCache ? xmrWalletService.getDaemonTxWithCache(txId) : xmrWalletService.getDaemonTx(txId);
tx.setNumConfirmations(tx.isConfirmed() ? (height == null ? xmrWalletService.getConnectionService().getLastInfo().getHeight() : height) - tx.getHeight(): 0l); // TODO: don't set if tx.getNumConfirmations() works reliably on non-local testnet tx.setNumConfirmations(tx.isConfirmed() ? (height == null ? xmrWalletService.getConnectionService().getLastInfo().getHeight() : height) - tx.getHeight(): 0l); // TODO: don't set if tx.getNumConfirmations() works reliably on non-local testnet
} catch (Exception e) { } catch (Exception e) {
// do nothing // do nothing

View file

@ -50,7 +50,7 @@ class DisplayedTransactions extends ObservableListDecorator<TransactionsListItem
} }
private List<TransactionsListItem> getTransactionListItems() { private List<TransactionsListItem> getTransactionListItems() {
List<MoneroTxWallet> transactions = xmrWalletService.getTransactions(false); List<MoneroTxWallet> transactions = xmrWalletService.getTxs(false);
return transactions.stream() return transactions.stream()
.map(this::convertTransactionToListItem) .map(this::convertTransactionToListItem)
.collect(Collectors.toList()); .collect(Collectors.toList());

View file

@ -171,7 +171,7 @@ public abstract class TradeStepView extends AnchorPane {
List<String> txIds = new ArrayList<String>(); List<String> txIds = new ArrayList<String>();
if (!model.dataModel.makerTxId.isEmpty().get()) txIds.add(model.dataModel.makerTxId.get()); if (!model.dataModel.makerTxId.isEmpty().get()) txIds.add(model.dataModel.makerTxId.get());
if (!model.dataModel.takerTxId.isEmpty().get()) txIds.add(model.dataModel.takerTxId.get()); if (!model.dataModel.takerTxId.isEmpty().get()) txIds.add(model.dataModel.takerTxId.get());
new Thread(() -> trade.getXmrWalletService().getTxsWithCache(txIds)).start(); new Thread(() -> trade.getXmrWalletService().getDaemonTxsWithCache(txIds)).start();
} }
public void activate() { public void activate() {

View file

@ -40,7 +40,7 @@ public class DisplayedTransactionsTest {
List<MoneroTxWallet> transactions = Lists.newArrayList(mock(MoneroTxWallet.class), mock(MoneroTxWallet.class)); List<MoneroTxWallet> transactions = Lists.newArrayList(mock(MoneroTxWallet.class), mock(MoneroTxWallet.class));
XmrWalletService walletService = mock(XmrWalletService.class); XmrWalletService walletService = mock(XmrWalletService.class);
when(walletService.getTransactions(false)).thenReturn(transactions); when(walletService.getTxs(false)).thenReturn(transactions);
TransactionListItemFactory transactionListItemFactory = mock(TransactionListItemFactory.class, TransactionListItemFactory transactionListItemFactory = mock(TransactionListItemFactory.class,
RETURNS_DEEP_STUBS); RETURNS_DEEP_STUBS);
@ -60,7 +60,7 @@ public class DisplayedTransactionsTest {
@Test @Test
public void testUpdateWhenRepositoryIsEmpty() { public void testUpdateWhenRepositoryIsEmpty() {
XmrWalletService walletService = mock(XmrWalletService.class); XmrWalletService walletService = mock(XmrWalletService.class);
when(walletService.getTransactions(false)) when(walletService.getTxs(false))
.thenReturn(Collections.singletonList(mock(MoneroTxWallet.class))); .thenReturn(Collections.singletonList(mock(MoneroTxWallet.class)));
TradableRepository tradableRepository = mock(TradableRepository.class); TradableRepository tradableRepository = mock(TradableRepository.class);