Add btc address validator to last trade step for withdrawal.

Remove dontshow again option for tx summary popup.
This commit is contained in:
Manfred Karrer 2017-06-30 21:03:36 +02:00
parent 45001ad965
commit 5be0a3750e
3 changed files with 63 additions and 60 deletions

View file

@ -390,7 +390,7 @@ public class BtcWalletService extends WalletService {
public void resetAddressEntriesForPendingTrade(String offerId) { public void resetAddressEntriesForPendingTrade(String offerId) {
swapTradeEntryToAvailableEntry(offerId, AddressEntry.Context.MULTI_SIG); swapTradeEntryToAvailableEntry(offerId, AddressEntry.Context.MULTI_SIG);
swapTradeEntryToAvailableEntry(offerId, AddressEntry.Context.TRADE_PAYOUT); // Don't swap TRADE_PAYOUT as it might be still open in the last trade step to be used for external transfer
} }
public void swapAnyTradeEntryContextToAvailableEntry(String offerId) { public void swapAnyTradeEntryContextToAvailableEntry(String offerId) {

View file

@ -105,11 +105,13 @@ public class WithdrawalView extends ActivatableView<VBox, Void> {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Inject @Inject
private WithdrawalView(BtcWalletService walletService, TradeManager tradeManager, private WithdrawalView(BtcWalletService walletService,
TradeManager tradeManager,
ClosedTradableManager closedTradableManager, ClosedTradableManager closedTradableManager,
FailedTradesManager failedTradesManager, FailedTradesManager failedTradesManager,
BSFormatter formatter, Preferences preferences, BSFormatter formatter, Preferences preferences,
BtcAddressValidator btcAddressValidator, WalletPasswordWindow walletPasswordWindow) { BtcAddressValidator btcAddressValidator,
WalletPasswordWindow walletPasswordWindow) {
this.walletService = walletService; this.walletService = walletService;
this.tradeManager = tradeManager; this.tradeManager = tradeManager;
this.closedTradableManager = closedTradableManager; this.closedTradableManager = closedTradableManager;

View file

@ -40,6 +40,7 @@ import io.bisq.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bisq.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bisq.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bisq.gui.util.BSFormatter; import io.bisq.gui.util.BSFormatter;
import io.bisq.gui.util.Layout; import io.bisq.gui.util.Layout;
import io.bisq.gui.util.validation.BtcAddressValidator;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
@ -168,66 +169,66 @@ public class BuyerStep4View extends TradeStepView {
AddressEntry fromAddressesEntry = walletService.getOrCreateAddressEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT); AddressEntry fromAddressesEntry = walletService.getOrCreateAddressEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT);
String fromAddresses = fromAddressesEntry.getAddressString(); String fromAddresses = fromAddressesEntry.getAddressString();
String toAddresses = withdrawAddressTextField.getText(); String toAddresses = withdrawAddressTextField.getText();
if (new BtcAddressValidator().validate(toAddresses).isValid) {
Coin balance = walletService.getBalanceForAddress(fromAddressesEntry.getAddress()); Coin balance = walletService.getBalanceForAddress(fromAddressesEntry.getAddress());
try { try {
Transaction feeEstimationTransaction = walletService.getFeeEstimationTransaction(fromAddresses, toAddresses, amount, AddressEntry.Context.TRADE_PAYOUT); Transaction feeEstimationTransaction = walletService.getFeeEstimationTransaction(fromAddresses, toAddresses, amount, AddressEntry.Context.TRADE_PAYOUT);
Coin fee = feeEstimationTransaction.getFee(); Coin fee = feeEstimationTransaction.getFee();
//noinspection UnusedAssignment //noinspection UnusedAssignment
Coin receiverAmount = amount.subtract(fee); Coin receiverAmount = amount.subtract(fee);
if (balance.isZero()) { if (balance.isZero()) {
new Popup<>().warning(Res.get("portfolio.pending.step5_buyer.alreadyWithdrawn")).show(); new Popup<>().warning(Res.get("portfolio.pending.step5_buyer.alreadyWithdrawn")).show();
model.dataModel.tradeManager.addTradeToClosedTrades(trade); model.dataModel.tradeManager.addTradeToClosedTrades(trade);
} else {
if (toAddresses.isEmpty()) {
validateWithdrawAddress();
} else if (Restrictions.isAboveDust(amount, fee)) {
if (DevEnv.DEV_MODE) {
doWithdrawal(amount, fee);
} else {
BSFormatter formatter = model.btcFormatter;
String key = "reviewWithdrawalAtTradeComplete";
//noinspection ConstantConditions
if (!DevEnv.DEV_MODE && DontShowAgainLookup.showAgain(key)) {
int txSize = feeEstimationTransaction.bitcoinSerialize().length;
double feePerByte = CoinUtil.getFeePerByte(fee, txSize);
double kb = txSize / 1000d;
String recAmount = formatter.formatCoinWithCode(receiverAmount);
new Popup<>().headLine(Res.get("portfolio.pending.step5_buyer.confirmWithdrawal"))
.confirmation(Res.get("shared.sendFundsDetailsWithFee",
formatter.formatCoinWithCode(amount),
fromAddresses,
toAddresses,
formatter.formatCoinWithCode(fee),
feePerByte,
kb,
recAmount))
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> doWithdrawal(amount, fee))
.closeButtonText(Res.get("shared.cancel"))
.onClose(() -> {
useSavingsWalletButton.setDisable(false);
withdrawToExternalWalletButton.setDisable(false);
})
.dontShowAgainId(key)
.show();
} else {
doWithdrawal(amount, fee);
}
}
} else { } else {
new Popup<>().warning(Res.get("portfolio.pending.step5_buyer.amountTooLow")).show(); if (toAddresses.isEmpty()) {
validateWithdrawAddress();
} else if (Restrictions.isAboveDust(amount, fee)) {
if (DevEnv.DEV_MODE) {
doWithdrawal(amount, fee);
} else {
BSFormatter formatter = model.btcFormatter;
//noinspection ConstantConditions
if (!DevEnv.DEV_MODE) {
int txSize = feeEstimationTransaction.bitcoinSerialize().length;
double feePerByte = CoinUtil.getFeePerByte(fee, txSize);
double kb = txSize / 1000d;
String recAmount = formatter.formatCoinWithCode(receiverAmount);
new Popup<>().headLine(Res.get("portfolio.pending.step5_buyer.confirmWithdrawal"))
.confirmation(Res.get("shared.sendFundsDetailsWithFee",
formatter.formatCoinWithCode(amount),
fromAddresses,
toAddresses,
formatter.formatCoinWithCode(fee),
feePerByte,
kb,
recAmount))
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> doWithdrawal(amount, fee))
.closeButtonText(Res.get("shared.cancel"))
.onClose(() -> {
useSavingsWalletButton.setDisable(false);
withdrawToExternalWalletButton.setDisable(false);
})
.show();
} else {
doWithdrawal(amount, fee);
}
}
} else {
new Popup<>().warning(Res.get("portfolio.pending.step5_buyer.amountTooLow")).show();
}
} }
} catch (AddressFormatException e) {
validateWithdrawAddress();
} catch (AddressEntryException e) {
log.error(e.getMessage());
} catch (InsufficientFundsException e) {
log.error(e.getMessage());
e.printStackTrace();
new Popup<>().warning(e.getMessage()).show();
} }
} catch (AddressFormatException e) { } else {
validateWithdrawAddress(); new Popup<>().warning(Res.get("validation.btc.invalidAddress")).show();
} catch (AddressEntryException e) {
log.error(e.getMessage());
} catch (InsufficientFundsException e) {
log.error(e.getMessage());
e.printStackTrace();
new Popup<>().warning(e.getMessage()).show();
} }
} }