dont send recipient amounts less than dust threshold

This commit is contained in:
Craig Raw 2020-07-11 11:40:28 +02:00
parent a37028b53f
commit 0ffb6e377b
2 changed files with 30 additions and 15 deletions

2
drongo

@ -1 +1 @@
Subproject commit 49a4b548b4b93aa9b765b0b6f9520d0314b1395f Subproject commit b86887838f7145d532a4572b6b3a81700e74acfb

View file

@ -4,6 +4,9 @@ import com.google.common.eventbus.Subscribe;
import com.sparrowwallet.drongo.BitcoinUnit; import com.sparrowwallet.drongo.BitcoinUnit;
import com.sparrowwallet.drongo.address.Address; import com.sparrowwallet.drongo.address.Address;
import com.sparrowwallet.drongo.address.InvalidAddressException; import com.sparrowwallet.drongo.address.InvalidAddressException;
import com.sparrowwallet.drongo.address.P2PKHAddress;
import com.sparrowwallet.drongo.protocol.Transaction;
import com.sparrowwallet.drongo.protocol.TransactionOutput;
import com.sparrowwallet.drongo.wallet.*; import com.sparrowwallet.drongo.wallet.*;
import com.sparrowwallet.sparrow.AppController; import com.sparrowwallet.sparrow.AppController;
import com.sparrowwallet.sparrow.CurrencyRate; import com.sparrowwallet.sparrow.CurrencyRate;
@ -150,6 +153,7 @@ public class SendController extends WalletFormController implements Initializabl
addValidation(); addValidation();
address.textProperty().addListener((observable, oldValue, newValue) -> { address.textProperty().addListener((observable, oldValue, newValue) -> {
revalidate(amount, amountListener);
maxButton.setDisable(!isValidRecipientAddress()); maxButton.setDisable(!isValidRecipientAddress());
updateTransaction(); updateTransaction();
}); });
@ -175,16 +179,8 @@ public class SendController extends WalletFormController implements Initializabl
maxButton.setDisable(!isValidRecipientAddress()); maxButton.setDisable(!isValidRecipientAddress());
insufficientInputsProperty.addListener((observable, oldValue, newValue) -> { insufficientInputsProperty.addListener((observable, oldValue, newValue) -> {
amount.textProperty().removeListener(amountListener); revalidate(amount, amountListener);
String amt = amount.getText(); revalidate(fee, feeListener);
amount.setText(amt + "0");
amount.setText(amt);
amount.textProperty().addListener(amountListener);
fee.textProperty().removeListener(feeListener);
String feeAmt = fee.getText();
fee.setText(feeAmt + "0");
fee.setText(feeAmt);
fee.textProperty().addListener(feeListener);
}); });
targetBlocks.setMin(0); targetBlocks.setMin(0);
@ -282,7 +278,7 @@ public class SendController extends WalletFormController implements Initializabl
)); ));
validationSupport.registerValidator(amount, Validator.combine( validationSupport.registerValidator(amount, Validator.combine(
(Control c, String newValue) -> ValidationResult.fromErrorIf( c, "Insufficient Inputs", insufficientInputsProperty.get()), (Control c, String newValue) -> ValidationResult.fromErrorIf( c, "Insufficient Inputs", insufficientInputsProperty.get()),
(Control c, String newValue) -> ValidationResult.fromErrorIf( c, "Insufficient Value", getRecipientValueSats() != null && getRecipientValueSats() == 0) (Control c, String newValue) -> ValidationResult.fromErrorIf( c, "Insufficient Value", getRecipientValueSats() != null && getRecipientValueSats() <= getMinimumRecipientAmount())
)); ));
validationSupport.registerValidator(fee, Validator.combine( validationSupport.registerValidator(fee, Validator.combine(
(Control c, String newValue) -> ValidationResult.fromErrorIf( c, "Insufficient Inputs", userFeeSet.get() && insufficientInputsProperty.get()), (Control c, String newValue) -> ValidationResult.fromErrorIf( c, "Insufficient Inputs", userFeeSet.get() && insufficientInputsProperty.get()),
@ -300,7 +296,7 @@ public class SendController extends WalletFormController implements Initializabl
try { try {
Address recipientAddress = getRecipientAddress(); Address recipientAddress = getRecipientAddress();
Long recipientAmount = sendAll ? Long.valueOf(1L) : getRecipientValueSats(); Long recipientAmount = sendAll ? Long.valueOf(1L) : getRecipientValueSats();
if(recipientAmount != null && recipientAmount != 0 && (!userFeeSet.get() || (getFeeValueSats() != null && getFeeValueSats() > 0))) { if(recipientAmount != null && recipientAmount > getMinimumRecipientAmount() && (!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(), userFee, sendAll); WalletTransaction walletTransaction = wallet.createWalletTransaction(getUtxoSelectors(), recipientAddress, recipientAmount, getFeeRate(), userFee, sendAll);
@ -335,11 +331,10 @@ public class SendController extends WalletFormController implements Initializabl
private boolean isValidRecipientAddress() { private boolean isValidRecipientAddress() {
try { try {
getRecipientAddress(); getRecipientAddress();
return true;
} catch (InvalidAddressException e) { } catch (InvalidAddressException e) {
return false; return false;
} }
return true;
} }
private Address getRecipientAddress() throws InvalidAddressException { private Address getRecipientAddress() throws InvalidAddressException {
@ -458,6 +453,18 @@ public class SendController extends WalletFormController implements Initializabl
} }
} }
private long getMinimumRecipientAmount() {
Address address;
try {
address = getRecipientAddress();
} catch(InvalidAddressException e) {
address = new P2PKHAddress(new byte[20]);
}
TransactionOutput txOutput = new TransactionOutput(new Transaction(), 1L, address.getOutputScript());
return address.getScriptType().getDustThreshold(txOutput, Transaction.DUST_RELAY_TX_FEE);
}
public void clear(ActionEvent event) { public void clear(ActionEvent event) {
address.setText(""); address.setText("");
label.setText(""); label.setText("");
@ -476,6 +483,14 @@ public class SendController extends WalletFormController implements Initializabl
walletTransactionProperty.setValue(null); walletTransactionProperty.setValue(null);
} }
private void revalidate(TextField field, ChangeListener<String> listener) {
field.textProperty().removeListener(listener);
String amt = field.getText();
field.setText(amt + "0");
field.setText(amt);
field.textProperty().addListener(listener);
}
public void createTransaction(ActionEvent event) { public void createTransaction(ActionEvent event) {
} }