Merge pull request #2335 from ManfredKarrer/dao-vaious-bug-fixes

Dao various bug fixes
This commit is contained in:
Christoph Atteneder 2019-01-30 13:02:02 +01:00 committed by GitHub
commit 15201cb5da
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 151 additions and 49 deletions

View file

@ -54,6 +54,7 @@ import javafx.collections.ObservableList;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
@ -73,6 +74,11 @@ import lombok.extern.slf4j.Slf4j;
*/
@Slf4j
public class VoteRevealService implements DaoStateListener, DaoSetupService {
public interface VoteRevealTxPublishedListener {
void onVoteRevealTxPublished(String txId);
}
private final DaoStateService daoStateService;
private final BlindVoteListService blindVoteListService;
private final PeriodService periodService;
@ -86,7 +92,7 @@ public class VoteRevealService implements DaoStateListener, DaoSetupService {
@Getter
private final ObservableList<VoteRevealException> voteRevealExceptions = FXCollections.observableArrayList();
private final BsqNode bsqNode;
private final List<VoteRevealTxPublishedListener> voteRevealTxPublishedListeners = new ArrayList<>();
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
@ -144,6 +150,10 @@ public class VoteRevealService implements DaoStateListener, DaoSetupService {
return VoteRevealConsensus.getHashOfBlindVoteList(blindVotes);
}
public void addVoteRevealTxPublishedListener(VoteRevealTxPublishedListener voteRevealTxPublishedListener) {
voteRevealTxPublishedListeners.add(voteRevealTxPublishedListener);
}
///////////////////////////////////////////////////////////////////////////////////////////
// DaoStateListener
@ -267,6 +277,7 @@ public class VoteRevealService implements DaoStateListener, DaoSetupService {
@Override
public void onSuccess(Transaction transaction) {
log.info("voteRevealTx successfully broadcasted.");
voteRevealTxPublishedListeners.forEach(l -> l.onVoteRevealTxPublished(transaction.getHashAsString()));
}
@Override

View file

@ -20,6 +20,7 @@ package bisq.core.util;
import bisq.core.app.BisqEnvironment;
import bisq.core.dao.exceptions.ValidationException;
import bisq.core.dao.governance.param.Param;
import bisq.core.locale.GlobalSettings;
import bisq.core.locale.Res;
import bisq.core.provider.price.MarketPrice;
import bisq.core.util.validation.BtcAddressValidator;
@ -36,6 +37,9 @@ import org.bitcoinj.utils.MonetaryFormat;
import javax.inject.Inject;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import lombok.extern.slf4j.Slf4j;
@ -44,14 +48,17 @@ public class BsqFormatter extends BSFormatter {
@SuppressWarnings("PointlessBooleanExpression")
private static final boolean useBsqAddressFormat = true || !DevEnv.isDevMode();
private final String prefix = "B";
private final DecimalFormat amountFormat = new DecimalFormat("###,###,###.##");
private final DecimalFormat marketCapFormat = new DecimalFormat("###,###,###");
private DecimalFormat amountFormat;
private DecimalFormat marketCapFormat;
private final MonetaryFormat btcCoinFormat;
@Inject
public BsqFormatter() {
super();
GlobalSettings.localeProperty().addListener((observable, oldValue, newValue) -> setFormatter(newValue));
setFormatter(GlobalSettings.getLocale());
btcCoinFormat = super.coinFormat;
final String baseCurrencyCode = BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode();
@ -73,6 +80,16 @@ public class BsqFormatter extends BSFormatter {
amountFormat.setMinimumFractionDigits(2);
}
private void setFormatter(Locale locale) {
amountFormat = (DecimalFormat) NumberFormat.getNumberInstance(locale);
amountFormat.setMinimumFractionDigits(2);
amountFormat.setMaximumFractionDigits(2);
marketCapFormat = (DecimalFormat) NumberFormat.getNumberInstance(locale);
marketCapFormat = new DecimalFormat();
marketCapFormat.setMaximumFractionDigits(0);
}
/**
* Returns the base-58 encoded String representation of this
* object, including version and checksum bytes.

View file

@ -0,0 +1,45 @@
/*
* This file is part of Bisq.
*
* Bisq is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bisq is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bisq. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.core.util.validation;
import bisq.core.locale.Res;
import java.net.URL;
import static com.google.common.base.Preconditions.checkArgument;
public class UrlInputValidator extends InputValidator {
public UrlInputValidator() {
}
public ValidationResult validate(String input) {
ValidationResult validationResult = super.validate(input);
if (!validationResult.isValid)
return validationResult;
try {
new URL(input); // does not cover all invalid urls, so we use a regex as well
String regex = "^(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
checkArgument(input.matches(regex), "URL does not match regex");
return validationResult;
} catch (Throwable t) {
return new ValidationResult(false, Res.get("validation.invalidUrl"));
}
}
}

View file

@ -1204,6 +1204,10 @@ dao.cycle.voteReveal=Vote reveal phase
dao.cycle.voteResult=Vote result
dao.cycle.phaseDuration={0} blocks (≈{1}); Block {2} - {3} (≈{4} - ≈{5})
dao.voteReveal.txPublished.headLine=Vote reveal transaction published
dao.voteReveal.txPublished=Your vote reveal transaction with transaction ID {0} was successfully published.\n\n\
This happens automatically by the software if you have participated in the DAO voting.
dao.results.cycles.header=Cycles
dao.results.cycles.table.header.cycle=Cycle
dao.results.cycles.table.header.numProposals=Proposals
@ -1433,7 +1437,7 @@ dao.bond.bondedRoleType.MEDIATOR=Mediator
# suppress inspection "UnusedProperty"
dao.bond.bondedRoleType.ARBITRATOR=Arbitrator
dao.burnBsq.assetFee=Asset listing fee
dao.burnBsq.assetFee=Asset listing
dao.burnBsq.menuItem.assetFee=Asset listing fee
dao.burnBsq.menuItem.proofOfBurn=Proof of burn
dao.burnBsq.header=Fee for asset listing
@ -1603,7 +1607,9 @@ dao.proposal.display.assetComboBox.label=Asset to remove
dao.blindVote=blind vote
dao.blindVote.startPublishing=Publishing blind vote transaction...
dao.blindVote.success=Your blind vote has been successfully published.
dao.blindVote.success=Your blind vote transaction has been successfully published.\n\nPlease note, that you have to be \
online in the vote reveal phase so that your Bisq application can publish the vote reveal transaction. \
Without the vote reveal transaction your vote would be invalid!
dao.wallet.menuItem.send=Send
dao.wallet.menuItem.receive=Receive
@ -1695,7 +1701,12 @@ dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
dao.tx.issuanceFromReimbursement.tooltip=Reimbursement request which led to an issuance of new BSQ.\n\
Issuance date: {0}
dao.proposal.create.missingFunds=You don''t have sufficient funds for creating the proposal.\n\
dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for creating the proposal. If you have an \
unconfirmed BSQ transaction you need to wait for a blockchain confirmation because BSQ is validated only if it is \
included in a block.\n\
Missing: {0}
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. \
Any BSQ transaction require also a miner fee in BTC.\n\
Missing: {0}
dao.feeTx.confirm=Confirm {0} transaction
dao.feeTx.confirm.details={0} fee: {1}\n\
@ -2561,3 +2572,4 @@ validation.length=Length must be between {0} and {1}
validation.pattern=Input must be of format: {0}
validation.noHexString=The input is not in HEX format.
validation.advancedCash.invalidFormat=Must be a valid email or wallet id of format: X000000000000
validation.invalidUrl=This is not a valid URL

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Entlohnungsanfrage/ausgabe
dao.tx.issuanceFromCompReq.tooltip=Entlohnungsanfrage, die zur Ausgabe neuere BSQ führte.\nAusgabedatum: {0}
dao.tx.issuanceFromReimbursement=Rückerstattungsantrag/Ausgabe
dao.tx.issuanceFromReimbursement.tooltip=Rückerstattungsanfrage, die zur Ausgabe neuer BSQ führte.\nAusgabedatum: {0}
dao.proposal.create.missingFunds=Sie haben nicht genügend Gelder um den Vorschlag zu erstellen.\nFehlend: {0}
dao.proposal.create.missingBsqFunds=Sie haben nicht genügend Gelder um den Vorschlag zu erstellen.\nFehlend: {0}
dao.feeTx.confirm=Bestätige {0} Transaktion
dao.feeTx.confirm.details={0} Gebühr: {1}\nMining-Gebühr: {2} ({3} Satoshis/Byte)\nTransaktionsgröße: {4} Kb\n\nSind Sie sicher, dass Sie die {5} Transaktion senden wollen?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Αίτημα/έκδοση αποζημίωσης
dao.tx.issuanceFromCompReq.tooltip=Αίτημα αποζημίωσης το οποίο οδήγησε σε έκδοση νέων BSQ.\nΗμερομηνία έκδοσης: {0}
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
dao.tx.issuanceFromReimbursement.tooltip=Reimbursement request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.proposal.create.missingFunds=Δεν έχεις επαρκή κεφάλαια για τη δημιουργία της πρότασης.\nΥπολείπονται: {0}
dao.proposal.create.missingBsqFunds=Δεν έχεις επαρκή κεφάλαια για τη δημιουργία της πρότασης.\nΥπολείπονται: {0}
dao.feeTx.confirm=Επιβεβαίωση συναλλαγής {0}
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Solicitud/emisión de compensación
dao.tx.issuanceFromCompReq.tooltip=Solicitud de compensación que lleva a emitir nuevos BSQ.\nFecha de emisión: {0}
dao.tx.issuanceFromReimbursement=Solicitud de reembolso/emisión
dao.tx.issuanceFromReimbursement.tooltip=Solicitud de reembolso que lleva a una emisión de nuevos BSQ.\nFecha de emisión: {0}
dao.proposal.create.missingFunds=No tiene suficientes fondos para crear la propuesta.\nFaltan: {0}
dao.proposal.create.missingBsqFunds=No tiene suficientes fondos para crear la propuesta.\nFaltan: {0}
dao.feeTx.confirm=Confirmar transacción {0}
dao.feeTx.confirm.details={0} tasa: {1}\nTasa de minado: {2} ({3} Satoshis/byte)\nTamaño de la transacción: {4} Kb\n\nEstá seguro de que quire publicar la transacción {5}?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=درخواست/صدور خسارت
dao.tx.issuanceFromCompReq.tooltip=درخواست خسارت که منجر به صدور BSQ جدید می‌شود.\nتاریخ صدور: {0}
dao.tx.issuanceFromReimbursement=درخواست/صدور بازپرداخت
dao.tx.issuanceFromReimbursement.tooltip=درخواست بازپرداختی که منجر به صدور BSQ جدید می‌شود.\nتاریخ صدور: {0}
dao.proposal.create.missingFunds=شما وجوه کافی برای ایجاد پیشنهاد را ندارید.\nمقدار مورد نیاز: {0}
dao.proposal.create.missingBsqFunds=شما وجوه کافی برای ایجاد پیشنهاد را ندارید.\nمقدار مورد نیاز: {0}
dao.feeTx.confirm=تایید {0} تراکنش
dao.feeTx.confirm.details=کارمزد {0}: {1}\nکارمزد استخراج: {2} ({3} ساتوشی بر بایت)\nاندازه تراکنش: {4} Kb\n\nآیا از انتشار تراکنش {5} اطمینان دارید؟

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Compensation request/issuance
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
dao.tx.issuanceFromReimbursement.tooltip=Reimbursement request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.proposal.create.missingFunds=You don''t have sufficient funds for creating the proposal.\nMissing: {0}
dao.proposal.create.missingBsqFunds=You don''t have sufficient funds for creating the proposal.\nMissing: {0}
dao.feeTx.confirm=Confirm {0} transaction
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Compensation request/issuance
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
dao.tx.issuanceFromReimbursement.tooltip=Reimbursement request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.proposal.create.missingFunds=Nem rendelkezik elegendő összegekkel a kártérítési kérelem létrehozásához.\nHiányzó: {0}
dao.proposal.create.missingBsqFunds=Nem rendelkezik elegendő összegekkel a kártérítési kérelem létrehozásához.\nHiányzó: {0}
dao.feeTx.confirm=Confirm {0} transaction
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Compensation request/issuance
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
dao.tx.issuanceFromReimbursement.tooltip=Reimbursement request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.proposal.create.missingFunds=Você não tem saldo suficiente para criar a proposta.\nFaltam: {0}
dao.proposal.create.missingBsqFunds=Você não tem saldo suficiente para criar a proposta.\nFaltam: {0}
dao.feeTx.confirm=Confirmar transação {0}
dao.feeTx.confirm.details=Taxa de {0}: {1}\nTaxa de mineração: {2} ({3} satoshis/byte)\nTamanho da transação: {4} Kb\n\nTem certeza de que deseja publicar a transação {5}?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Compensation request/issuance
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
dao.tx.issuanceFromReimbursement.tooltip=Reimbursement request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.proposal.create.missingFunds=Nu ai suficiente fonduri pentru crearea solicitării de despăgubire.\nLipsesc: {0}
dao.proposal.create.missingBsqFunds=Nu ai suficiente fonduri pentru crearea solicitării de despăgubire.\nLipsesc: {0}
dao.feeTx.confirm=Confirm {0} transaction
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Запрос/выдача компенсации
dao.tx.issuanceFromCompReq.tooltip=Запрос компенсации, который привел к выпуску новых BSQ.\nДата выпуска: {0}
dao.tx.issuanceFromReimbursement=Запрос/выдача возмещения
dao.tx.issuanceFromReimbursement.tooltip=Запрос возмещения, который привел к выпуску новых BSQ.\nДата выпуска: {0}
dao.proposal.create.missingFunds=У Вас недостаточно средств для создания предложения.\nНехватает: {0}
dao.proposal.create.missingBsqFunds=У Вас недостаточно средств для создания предложения.\nНехватает: {0}
dao.feeTx.confirm=Подтвердить транзакцию {0}
dao.feeTx.confirm.details={0} сбор: {1}\nкомиссия майнера: {2} ({3} сатоши/байт)\nРазмер транзакиции: {4} Кб\n\nДействительно хотите опубликовать транзакцию {5}?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Compensation request/issuance
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
dao.tx.issuanceFromReimbursement.tooltip=Reimbursement request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.proposal.create.missingFunds=You don''t have sufficient funds for creating the proposal.\nMissing: {0}
dao.proposal.create.missingBsqFunds=You don''t have sufficient funds for creating the proposal.\nMissing: {0}
dao.feeTx.confirm=Confirm {0} transaction
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=คำขอหรือการออกค่า
dao.tx.issuanceFromCompReq.tooltip=คำขอค่าสินไหมทดแทน ซึ่งนำไปสู่การออก BSQ ใหม่\nวันที่ออก: {0}
dao.tx.issuanceFromReimbursement=การออกคำสั่ง/การยื่นคำร้องขอการชำระเงินคืน
dao.tx.issuanceFromReimbursement.tooltip=การเรียกร้องขอการชำระเงินคืนซึ่งเป็นคำสั่งภายใต้ BSQ ฉบับใหม่\nวันที่เริ่มทำการ: {0}
dao.proposal.create.missingFunds=คุณไม่มีเงินเพียงพอสำหรับการสร้างข้อเสนอ\nขาดไป: {0}
dao.proposal.create.missingBsqFunds=คุณไม่มีเงินเพียงพอสำหรับการสร้างข้อเสนอ\nขาดไป: {0}
dao.feeTx.confirm=ยืนยันการทำรายการ {0}
dao.feeTx.confirm.details={0} ค่าธรรมเนียม: {1}\nค่าธรรมเนียมการขุด: {2} ({3} Satoshis / byte)\nขนาดของธุรกรรม: {4} Kb\n\nคุณแน่ใจหรือไม่ว่าต้องการเผยแพร่ {5} ธุรกรรม?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=Yêu cầu bồi thường/ban hành
dao.tx.issuanceFromCompReq.tooltip=Yêu cầu bồi thường dẫn đến ban hành BSQ mới.\nNgày ban hành: {0}
dao.tx.issuanceFromReimbursement=Yêu cầu/ Phát hành bồi hoàn
dao.tx.issuanceFromReimbursement.tooltip=Yêu cầu bồi hoàn dẫn đến ban hành BSQ mới.\nNgày ban hành: {0}
dao.proposal.create.missingFunds=Bạn không có đủ tiền để tạo đề xuất.\nThiếu: {0}
dao.proposal.create.missingBsqFunds=Bạn không có đủ tiền để tạo đề xuất.\nThiếu: {0}
dao.feeTx.confirm=Xác nhận {0} giao dịch
dao.feeTx.confirm.details={0} phí: {1}\nPhí đào: {2} ({3} Satoshis/byte)\nKích thước giao dịch: {4} Kb\n\nBạn có chắc là muốn công bố giao dịch {5}?

View file

@ -1551,7 +1551,7 @@ dao.tx.issuanceFromCompReq=补偿请求/发行
dao.tx.issuanceFromCompReq.tooltip=导致新BSQ发行的补偿请求\n发行日期: {0}
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
dao.tx.issuanceFromReimbursement.tooltip=Reimbursement request which led to an issuance of new BSQ.\nIssuance date: {0}
dao.proposal.create.missingFunds=You don''t have sufficient funds for creating the proposal.\nMissing: {0}
dao.proposal.create.missingBsqFunds=You don''t have sufficient funds for creating the proposal.\nMissing: {0}
dao.feeTx.confirm=Confirm {0} transaction
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?

View file

@ -30,8 +30,10 @@ import bisq.desktop.main.dao.burnbsq.BurnBsqView;
import bisq.desktop.main.dao.governance.GovernanceView;
import bisq.desktop.main.dao.wallet.BsqWalletView;
import bisq.desktop.main.dao.wallet.dashboard.BsqDashboardView;
import bisq.desktop.main.overlays.popups.Popup;
import bisq.core.app.BisqEnvironment;
import bisq.core.dao.governance.votereveal.VoteRevealService;
import bisq.core.locale.Res;
import bisq.common.app.DevEnv;
@ -61,9 +63,15 @@ public class DaoView extends ActivatableViewAndModel<TabPane, Activatable> {
private BsqWalletView bsqWalletView;
@Inject
private DaoView(CachingViewLoader viewLoader, Navigation navigation) {
private DaoView(CachingViewLoader viewLoader, VoteRevealService voteRevealService, Navigation navigation) {
this.viewLoader = viewLoader;
this.navigation = navigation;
voteRevealService.addVoteRevealTxPublishedListener(txId -> {
new Popup<>().headLine(Res.get("dao.voteReveal.txPublished.headLine"))
.feedback(Res.get("dao.voteReveal.txPublished", txId))
.show();
});
}
@Override

View file

@ -44,7 +44,6 @@ class BondListItem {
private final String bondDetails;
private final BondState bondState;
private final String bondStateString;
private final Date lockupDate;
BondListItem(Bond bond, BsqFormatter bsqFormatter) {
this.bond = bond;
@ -59,8 +58,7 @@ class BondListItem {
bondDetails = Utilities.bytesAsHexString(bond.getBondedAsset().getHash());
}
lockupTxId = bond.getLockupTxId();
lockupDate = new Date(bond.getLockupDate());
lockupDateString = bsqFormatter.formatDateTime(lockupDate);
lockupDateString = bond.getLockupDate() > 0 ? bsqFormatter.formatDateTime(new Date(bond.getLockupDate())) : "-";
bondState = bond.getBondState();
bondStateString = Res.get("dao.bond.bondState." + bond.getBondState().name());
}

View file

@ -173,7 +173,7 @@ public class ProofOfBurnView extends ActivatableView<GridPane, Void> implements
if (!DevEnv.isDevMode()) {
GUIUtil.showBsqFeeInfoPopup(amount, miningFee, txSize, bsqFormatter, btcFormatter,
Res.get("dao.proofOfBurn.amount"), () -> doPublishFeeTx(transaction, preImageAsString));
Res.get("dao.proofOfBurn.header"), () -> doPublishFeeTx(transaction, preImageAsString));
} else {
doPublishFeeTx(transaction, preImageAsString);
}

View file

@ -52,6 +52,7 @@ import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res;
import bisq.core.util.BsqFormatter;
import bisq.core.util.validation.InputValidator;
import bisq.core.util.validation.UrlInputValidator;
import bisq.asset.Asset;
@ -202,7 +203,7 @@ public class ProposalDisplay {
Res.get("dao.proposal.display.link"));
linkInputTextField.setPromptText(Res.get("dao.proposal.display.link.prompt"));
if (isMakeProposalScreen)
linkInputTextField.setValidator(new InputValidator());
linkInputTextField.setValidator(new UrlInputValidator());
inputControls.add(linkInputTextField);
Tuple3<Label, HyperlinkWithIcon, VBox> tuple = FormBuilder.addTopLabelHyperlinkWithIcon(gridPane, gridRow,

View file

@ -215,9 +215,14 @@ public class MakeProposalView extends ActivatableView<GridPane, Void> implements
doPublishMyProposal(proposal, transaction);
}
} catch (InsufficientMoneyException e) {
BSFormatter formatter = e instanceof InsufficientBsqException ? bsqFormatter : btcFormatter;
new Popup<>().warning(Res.get("dao.proposal.create.missingFunds",
formatter.formatCoinWithCode(e.missing))).show();
if (e instanceof InsufficientBsqException) {
new Popup<>().warning(Res.get("dao.proposal.create.missingBsqFunds",
bsqFormatter.formatCoinWithCode(e.missing))).show();
} else {
new Popup<>().warning(Res.get("dao.proposal.create.missingMinerFeeFunds",
btcFormatter.formatCoinWithCode(e.missing))).show();
}
} catch (ValidationException e) {
String message;
if (e.getMinRequestAmount() != null) {
@ -242,7 +247,7 @@ public class MakeProposalView extends ActivatableView<GridPane, Void> implements
proposalDisplay.clearForm();
proposalTypeComboBox.getSelectionModel().clearSelection();
if (!DevEnv.isDevMode())
new Popup<>().confirmation(Res.get("dao.tx.published.success")).show();
new Popup<>().feedback(Res.get("dao.tx.published.success")).show();
},
errorMessage -> new Popup<>().warning(errorMessage).show());
}
@ -253,18 +258,20 @@ public class MakeProposalView extends ActivatableView<GridPane, Void> implements
checkNotNull(proposalDisplay, "proposalDisplay must not be null");
String link = proposalDisplay.linkInputTextField.getText();
String name = proposalDisplay.nameTextField.getText();
switch (type) {
case COMPENSATION_REQUEST:
checkNotNull(proposalDisplay.requestedBsqTextField,
"proposalDisplay.requestedBsqTextField must not be null");
return daoFacade.getCompensationProposalWithTransaction(proposalDisplay.nameTextField.getText(),
proposalDisplay.linkInputTextField.getText(),
return daoFacade.getCompensationProposalWithTransaction(name,
link,
bsqFormatter.parseToCoin(proposalDisplay.requestedBsqTextField.getText()));
case REIMBURSEMENT_REQUEST:
checkNotNull(proposalDisplay.requestedBsqTextField,
"proposalDisplay.requestedBsqTextField must not be null");
return daoFacade.getReimbursementProposalWithTransaction(proposalDisplay.nameTextField.getText(),
proposalDisplay.linkInputTextField.getText(),
return daoFacade.getReimbursementProposalWithTransaction(name,
link,
bsqFormatter.parseToCoin(proposalDisplay.requestedBsqTextField.getText()));
case CHANGE_PARAM:
checkNotNull(proposalDisplay.paramComboBox,
@ -284,8 +291,8 @@ public class MakeProposalView extends ActivatableView<GridPane, Void> implements
log.info("Change param: paramValue={}, paramValueAsString={}", paramValue, paramValueAsString);
changeParamValidator.validateParamValue(selectedParam, paramValue);
return daoFacade.getParamProposalWithTransaction(proposalDisplay.nameTextField.getText(),
proposalDisplay.linkInputTextField.getText(),
return daoFacade.getParamProposalWithTransaction(name,
link,
selectedParam,
paramValue);
} catch (Throwable e) {
@ -295,27 +302,22 @@ public class MakeProposalView extends ActivatableView<GridPane, Void> implements
case BONDED_ROLE:
checkNotNull(proposalDisplay.bondedRoleTypeComboBox,
"proposalDisplay.bondedRoleTypeComboBox must not be null");
Role role = new Role(proposalDisplay.nameTextField.getText(),
proposalDisplay.linkInputTextField.getText(),
Role role = new Role(name,
link,
proposalDisplay.bondedRoleTypeComboBox.getSelectionModel().getSelectedItem());
return daoFacade.getBondedRoleProposalWithTransaction(role);
case CONFISCATE_BOND:
checkNotNull(proposalDisplay.confiscateBondComboBox,
"proposalDisplay.confiscateBondComboBox must not be null");
Bond bond = proposalDisplay.confiscateBondComboBox.getSelectionModel().getSelectedItem();
return daoFacade.getConfiscateBondProposalWithTransaction(proposalDisplay.nameTextField.getText(),
proposalDisplay.linkInputTextField.getText(),
bond.getLockupTxId());
return daoFacade.getConfiscateBondProposalWithTransaction(name, link, bond.getLockupTxId());
case GENERIC:
return daoFacade.getGenericProposalWithTransaction(proposalDisplay.nameTextField.getText(),
proposalDisplay.linkInputTextField.getText());
return daoFacade.getGenericProposalWithTransaction(name, link);
case REMOVE_ASSET:
checkNotNull(proposalDisplay.assetComboBox,
"proposalDisplay.assetComboBox must not be null");
Asset asset = proposalDisplay.assetComboBox.getSelectionModel().getSelectedItem();
return daoFacade.getRemoveAssetProposalWithTransaction(proposalDisplay.nameTextField.getText(),
proposalDisplay.linkInputTextField.getText(),
asset);
return daoFacade.getRemoveAssetProposalWithTransaction(name, link, asset);
default:
final String msg = "Undefined ProposalType " + selectedProposalType;
log.error(msg);
@ -372,6 +374,10 @@ public class MakeProposalView extends ActivatableView<GridPane, Void> implements
.filter(Objects::nonNull).forEach(comboBox -> {
inputsValid.set(inputsValid.get() && comboBox.getSelectionModel().getSelectedItem() != null);
});
InputTextField linkInputTextField = proposalDisplay.linkInputTextField;
inputsValid.set(inputsValid.get() &&
linkInputTextField.getValidator().validate(linkInputTextField.getText()).isValid);
}
makeProposalButton.setDisable(!inputsValid.get());

View file

@ -244,6 +244,7 @@ public class BsqSendView extends ActivatableView<GridPane, Void> implements BsqB
txSize,
receiversAddressInputTextField.getText(),
bsqFormatter,
btcFormatter,
() -> {
receiversAddressInputTextField.setText("");
amountInputTextField.setText("");
@ -298,6 +299,7 @@ public class BsqSendView extends ActivatableView<GridPane, Void> implements BsqB
miningFee,
txSize, receiversBtcAddressInputTextField.getText(),
btcFormatter,
btcFormatter,
() -> {
receiversBtcAddressInputTextField.setText("");
btcAmountInputTextField.setText("");
@ -330,16 +332,17 @@ public class BsqSendView extends ActivatableView<GridPane, Void> implements BsqB
Transaction txWithBtcFee,
Coin miningFee,
int txSize, String address,
BSFormatter formatter,
BSFormatter amountFormatter, // can be BSQ or BTC formatter
BSFormatter feeFormatter,
ResultHandler resultHandler) {
new Popup<>().headLine(Res.get("dao.wallet.send.sendFunds.headline"))
.confirmation(Res.get("dao.wallet.send.sendFunds.details",
formatter.formatCoinWithCode(receiverAmount),
amountFormatter.formatCoinWithCode(receiverAmount),
address,
formatter.formatCoinWithCode(miningFee),
feeFormatter.formatCoinWithCode(miningFee),
CoinUtil.getFeePerByte(miningFee, txSize),
txSize / 1000d,
formatter.formatCoinWithCode(receiverAmount)))
amountFormatter.formatCoinWithCode(receiverAmount)))
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> {
walletsManager.publishAndCommitBsqTx(txWithBtcFee, new TxBroadcaster.Callback() {

View file

@ -343,6 +343,7 @@ public abstract class Overlay<T extends Overlay> {
public T error(String message) {
type = Type.Error;
showReportErrorButtons();
width = 1100;
if (headLine == null)
this.headLine = Res.get("popup.headline.error");
this.message = message;