Add segwit/legacy checbox for address creation

This commit is contained in:
Oscar Guindzberg 2020-09-25 04:57:13 -03:00
parent a9cc28f65a
commit f9f5d92941
No known key found for this signature in database
GPG key ID: 209796BF2E1D4F75
3 changed files with 29 additions and 13 deletions

View file

@ -601,16 +601,21 @@ public class BtcWalletService extends WalletService {
Optional<AddressEntry> addressEntry = getAddressEntryListAsImmutableList().stream()
.filter(e -> context == e.getContext())
.findAny();
return getOrCreateAddressEntry(context, addressEntry);
return getOrCreateAddressEntry(context, addressEntry, false);
}
public AddressEntry getFreshAddressEntry() {
return getFreshAddressEntry(true);
}
public AddressEntry getFreshAddressEntry(boolean segwit) {
AddressEntry.Context context = AddressEntry.Context.AVAILABLE;
Optional<AddressEntry> addressEntry = getAddressEntryListAsImmutableList().stream()
.filter(e -> context == e.getContext())
.filter(e -> isAddressUnused(e.getAddress()))
.filter(e -> Script.ScriptType.P2WPKH.equals(e.getAddress().getOutputScriptType()) == segwit)
.findAny();
return getOrCreateAddressEntry(context, addressEntry);
return getOrCreateAddressEntry(context, addressEntry, segwit);
}
public void recoverAddressEntry(String offerId, String address, AddressEntry.Context context) {
@ -618,18 +623,15 @@ public class BtcWalletService extends WalletService {
addressEntryList.swapAvailableToAddressEntryWithOfferId(addressEntry, context, offerId));
}
private AddressEntry getOrCreateAddressEntry(AddressEntry.Context context, Optional<AddressEntry> addressEntry) {
private AddressEntry getOrCreateAddressEntry(AddressEntry.Context context, Optional<AddressEntry> addressEntry, boolean segwit) {
if (addressEntry.isPresent()) {
return addressEntry.get();
} else {
DeterministicKey key;
boolean segwit;
if (AddressEntry.Context.AVAILABLE.equals(context)) {
if (segwit) {
key = (DeterministicKey) wallet.findKeyFromAddress(wallet.freshReceiveAddress(Script.ScriptType.P2WPKH));
segwit = true;
} else {
key = (DeterministicKey) wallet.findKeyFromAddress(wallet.freshReceiveAddress(Script.ScriptType.P2PKH));
segwit = false;
}
AddressEntry entry = new AddressEntry(key, context, segwit);
addressEntryList.addAddressEntry(entry);

View file

@ -992,6 +992,7 @@ funds.deposit.fundWallet=Fund your wallet
funds.deposit.withdrawFromWallet=Send funds from wallet
funds.deposit.amount=Amount in BTC (optional)
funds.deposit.generateAddress=Generate new address
funds.deposit.generateAddressSegwit=Native segwit format (Bech32)
funds.deposit.selectUnused=Please select an unused address from the table above rather than generating a new one.
funds.withdrawal.arbitrationFee=Arbitration fee

View file

@ -41,8 +41,12 @@ import bisq.core.util.coin.CoinFormatter;
import bisq.common.UserThread;
import bisq.common.app.DevEnv;
import bisq.common.config.Config;
import org.bitcoinj.core.Address;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.SegwitAddress;
import org.bitcoinj.core.Transaction;
import net.glxn.qrgen.QRCode;
@ -54,6 +58,7 @@ import javax.inject.Named;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
@ -85,10 +90,7 @@ import java.util.concurrent.TimeUnit;
import org.jetbrains.annotations.NotNull;
import static bisq.desktop.util.FormBuilder.addAddressTextField;
import static bisq.desktop.util.FormBuilder.addButton;
import static bisq.desktop.util.FormBuilder.addInputTextField;
import static bisq.desktop.util.FormBuilder.addTitledGroupBg;
import static bisq.desktop.util.FormBuilder.*;
@FxmlView
public class DepositView extends ActivatableView<VBox, Void> {
@ -102,6 +104,7 @@ public class DepositView extends ActivatableView<VBox, Void> {
private ImageView qrCodeImageView;
private AddressTextField addressTextField;
private Button generateNewAddressButton;
private CheckBox generateNewAddressSegwitCheckbox;
private TitledGroupBg titledGroupBg;
private InputTextField amountTextField;
@ -195,16 +198,26 @@ public class DepositView extends ActivatableView<VBox, Void> {
addressTextField.setManaged(false);
amountTextField.setManaged(false);
generateNewAddressSegwitCheckbox = addCheckBox(gridPane, ++gridRow,
Res.get("funds.deposit.generateAddressSegwit"), -20);
generateNewAddressSegwitCheckbox.setAllowIndeterminate(false);
generateNewAddressSegwitCheckbox.setSelected(true);
GridPane.setColumnIndex(generateNewAddressSegwitCheckbox, 0);
GridPane.setHalignment(generateNewAddressSegwitCheckbox, HPos.LEFT);
generateNewAddressButton = addButton(gridPane, ++gridRow, Res.get("funds.deposit.generateAddress"), -20);
GridPane.setColumnIndex(generateNewAddressButton, 0);
GridPane.setHalignment(generateNewAddressButton, HPos.LEFT);
generateNewAddressButton.setOnAction(event -> {
boolean hasUnUsedAddress = observableList.stream().anyMatch(e -> e.getNumTxOutputs() == 0);
boolean segwit = generateNewAddressSegwitCheckbox.isSelected();
NetworkParameters params = Config.baseCurrencyNetworkParameters();
boolean hasUnUsedAddress = observableList.stream().anyMatch(e -> e.getNumTxOutputs() == 0
&& (Address.fromString(params, e.getAddressString()) instanceof SegwitAddress) == segwit);
if (hasUnUsedAddress) {
new Popup().warning(Res.get("funds.deposit.selectUnused")).show();
} else {
AddressEntry newSavingsAddressEntry = walletService.getFreshAddressEntry();
AddressEntry newSavingsAddressEntry = walletService.getFreshAddressEntry(segwit);
updateList();
observableList.stream()
.filter(depositListItem -> depositListItem.getAddressString().equals(newSavingsAddressEntry.getAddressString()))