utxo grouping, filtering and zero conf handling

This commit is contained in:
Craig Raw 2020-07-15 09:15:50 +02:00
parent 4d51bb40c2
commit 3cee45223e
8 changed files with 45 additions and 14 deletions

2
drongo

@ -1 +1 @@
Subproject commit 832ca8f257559864823c83d8d29dc2276f44fa51 Subproject commit f00754b15779e94faa65c3de5c0a977cc51d865b

View file

@ -37,7 +37,8 @@ public class DateCell extends TreeTableCell<Entry, Entry> {
setText(date); setText(date);
setContextMenu(new DateContextMenu(date, utxoEntry.getHashIndex())); setContextMenu(new DateContextMenu(date, utxoEntry.getHashIndex()));
Tooltip tooltip = new Tooltip(); Tooltip tooltip = new Tooltip();
tooltip.setText(Integer.toString(utxoEntry.getHashIndex().getHeight())); int height = utxoEntry.getHashIndex().getHeight();
tooltip.setText(height > 0 ? Integer.toString(height) : "Mempool");
setTooltip(tooltip); setTooltip(tooltip);
} }
setGraphic(null); setGraphic(null);
@ -58,7 +59,7 @@ public class DateCell extends TreeTableCell<Entry, Entry> {
copyHeight.setOnAction(AE -> { copyHeight.setOnAction(AE -> {
hide(); hide();
ClipboardContent content = new ClipboardContent(); ClipboardContent content = new ClipboardContent();
content.putString(Integer.toString(reference.getHeight())); content.putString(reference.getHeight() > 0 ? Integer.toString(reference.getHeight()) : "Mempool");
Clipboard.getSystemClipboard().setContent(content); Clipboard.getSystemClipboard().setContent(content);
}); });

View file

@ -146,7 +146,7 @@ class EntryCell extends TreeTableCell<Entry, Entry> {
copyHeight.setOnAction(AE -> { copyHeight.setOnAction(AE -> {
hide(); hide();
ClipboardContent content = new ClipboardContent(); ClipboardContent content = new ClipboardContent();
content.putString(Integer.toString(blockTransaction.getHeight())); content.putString(blockTransaction.getHeight() > 0 ? Integer.toString(blockTransaction.getHeight()) : "Mempool");
Clipboard.getSystemClipboard().setContent(content); Clipboard.getSystemClipboard().setContent(content);
}); });

View file

@ -15,6 +15,8 @@ public class Config {
private BitcoinUnit bitcoinUnit; private BitcoinUnit bitcoinUnit;
private Currency fiatCurrency; private Currency fiatCurrency;
private ExchangeSource exchangeSource; private ExchangeSource exchangeSource;
private boolean groupByAddress = true;
private boolean includeMempoolChange = true;
private Integer keyDerivationPeriod; private Integer keyDerivationPeriod;
private File hwi; private File hwi;
private String electrumServer; private String electrumServer;
@ -99,6 +101,24 @@ public class Config {
flush(); flush();
} }
public boolean isGroupByAddress() {
return groupByAddress;
}
public void setGroupByAddress(boolean groupByAddress) {
this.groupByAddress = groupByAddress;
flush();
}
public boolean isIncludeMempoolChange() {
return includeMempoolChange;
}
public void setIncludeMempoolChange(boolean includeMempoolChange) {
this.includeMempoolChange = includeMempoolChange;
flush();
}
public Integer getKeyDerivationPeriod() { public Integer getKeyDerivationPeriod() {
return keyDerivationPeriod; return keyDerivationPeriod;
} }

View file

@ -299,8 +299,10 @@ public class ElectrumServer {
try { try {
Set<Integer> blockHeights = new TreeSet<>(); Set<Integer> blockHeights = new TreeSet<>();
for(BlockTransactionHash reference : references) { for(BlockTransactionHash reference : references) {
if(reference.getHeight() > 0) {
blockHeights.add(reference.getHeight()); blockHeights.add(reference.getHeight());
} }
}
JsonRpcClient client = new JsonRpcClient(getTransport()); JsonRpcClient client = new JsonRpcClient(getTransport());
BatchRequestBuilder<Integer, String> batchRequest = client.createBatchRequest().keysType(Integer.class).returnType(String.class); BatchRequestBuilder<Integer, String> batchRequest = client.createBatchRequest().keysType(Integer.class).returnType(String.class);
@ -378,14 +380,20 @@ public class ElectrumServer {
} }
BlockTransactionHash reference = optionalReference.get(); BlockTransactionHash reference = optionalReference.get();
Date blockDate;
if(reference.getHeight() > 0) {
BlockHeader blockHeader = blockHeaderMap.get(reference.getHeight()); BlockHeader blockHeader = blockHeaderMap.get(reference.getHeight());
if(blockHeader == null) { if(blockHeader == null) {
transactionMap.put(hash, UNFETCHABLE_BLOCK_TRANSACTION); transactionMap.put(hash, UNFETCHABLE_BLOCK_TRANSACTION);
checkReferences.removeIf(ref -> ref.getHash().equals(hash)); checkReferences.removeIf(ref -> ref.getHash().equals(hash));
continue; continue;
} }
blockDate = blockHeader.getTimeAsDate();
} else {
blockDate = new Date();
}
BlockTransaction blockchainTransaction = new BlockTransaction(reference.getHash(), reference.getHeight(), blockHeader.getTimeAsDate(), reference.getFee(), transaction); BlockTransaction blockchainTransaction = new BlockTransaction(reference.getHash(), reference.getHeight(), blockDate, reference.getFee(), transaction);
transactionMap.put(hash, blockchainTransaction); transactionMap.put(hash, blockchainTransaction);
checkReferences.remove(reference); checkReferences.remove(reference);

View file

@ -94,7 +94,7 @@ public class HashIndexEntry extends Entry implements Comparable<HashIndexEntry>
} }
if(getHashIndex().getHeight() != o.getHashIndex().getHeight()) { if(getHashIndex().getHeight() != o.getHashIndex().getHeight()) {
return o.getHashIndex().getHeight() - getHashIndex().getHeight(); return (o.getHashIndex().getHeight() > 0 ? o.getHashIndex().getHeight() : Integer.MAX_VALUE) - (getHashIndex().getHeight() > 0 ? getHashIndex().getHeight() : Integer.MAX_VALUE);
} }
return (int)o.getHashIndex().getIndex() - (int)getHashIndex().getIndex(); return (int)o.getHashIndex().getIndex() - (int)getHashIndex().getIndex();

View file

@ -300,7 +300,9 @@ public class SendController extends WalletFormController implements Initializabl
if(recipientAmount != null && recipientAmount > recipientDustThreshold && (!userFeeSet.get() || (getFeeValueSats() != null && getFeeValueSats() > 0))) { if(recipientAmount != null && recipientAmount > recipientDustThreshold && (!userFeeSet.get() || (getFeeValueSats() != null && getFeeValueSats() > 0))) {
Wallet wallet = getWalletForm().getWallet(); Wallet wallet = getWalletForm().getWallet();
Long userFee = userFeeSet.get() ? getFeeValueSats() : null; Long userFee = userFeeSet.get() ? getFeeValueSats() : null;
WalletTransaction walletTransaction = wallet.createWalletTransaction(getUtxoSelectors(), recipientAddress, recipientAmount, getFeeRate(), getMinimumFeeRate(), userFee, sendAll); boolean groupByAddress = Config.get().isGroupByAddress();
boolean includeMempoolChange = Config.get().isIncludeMempoolChange();
WalletTransaction walletTransaction = wallet.createWalletTransaction(getUtxoSelectors(), recipientAddress, recipientAmount, getFeeRate(), getMinimumFeeRate(), userFee, sendAll, groupByAddress, includeMempoolChange);
walletTransactionProperty.setValue(walletTransaction); walletTransactionProperty.setValue(walletTransaction);
insufficientInputsProperty.set(false); insufficientInputsProperty.set(false);

View file

@ -71,7 +71,7 @@ public class TransactionEntry extends Entry implements Comparable<TransactionEnt
} }
public int calculateConfirmations() { public int calculateConfirmations() {
if(blockTransaction.getHeight() == 0) { if(blockTransaction.getHeight() <= 0) {
return 0; return 0;
} }