diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MessageSignDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/MessageSignDialog.java index 867e702d..fac7e84a 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MessageSignDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MessageSignDialog.java @@ -240,6 +240,9 @@ public class MessageSignDialog extends Dialog { setFormatFromScriptType(address.getScriptType()); if(wallet != null) { setWalletNodeFromAddress(wallet, address); + if(walletNode != null) { + setFormatFromScriptType(getSigningScriptType(walletNode)); + } } } catch(InvalidAddressException e) { //can't happen @@ -273,7 +276,7 @@ public class MessageSignDialog extends Dialog { } if(wallet != null && walletNode != null) { - setFormatFromScriptType(wallet.getScriptType()); + setFormatFromScriptType(getSigningScriptType(walletNode)); } else { formatGroup.selectToggle(formatElectrum); } @@ -287,9 +290,13 @@ public class MessageSignDialog extends Dialog { } private boolean canSign(Wallet wallet) { - return wallet.getKeystores().get(0).hasPrivateKey() - || wallet.getKeystores().get(0).getSource() == KeystoreSource.HW_USB - || wallet.getKeystores().get(0).getWalletModel().isCard(); + return wallet.getKeystores().getFirst().hasPrivateKey() + || wallet.getKeystores().getFirst().getSource() == KeystoreSource.HW_USB + || wallet.getKeystores().getFirst().getWalletModel().isCard(); + } + + private boolean canSignBip322(Wallet wallet) { + return wallet.getKeystores().getFirst().hasPrivateKey(); } private Address getAddress()throws InvalidAddressException { @@ -313,6 +320,11 @@ public class MessageSignDialog extends Dialog { walletNode = wallet.getWalletAddresses().get(address); } + private ScriptType getSigningScriptType(WalletNode walletNode) { + ScriptType scriptType = walletNode.getWallet().getScriptType(); + return canSign(walletNode.getWallet()) && !canSignBip322(walletNode.getWallet()) ? ScriptType.P2PKH : scriptType; + } + private void setFormatFromScriptType(ScriptType scriptType) { formatElectrum.setDisable(scriptType == ScriptType.P2TR); formatTrezor.setDisable(scriptType == ScriptType.P2TR || scriptType == ScriptType.P2PKH); @@ -345,7 +357,7 @@ public class MessageSignDialog extends Dialog { //Note we can expect a single keystore due to the check in the constructor Wallet signingWallet = walletNode.getWallet(); - if(signingWallet.getKeystores().get(0).hasPrivateKey()) { + if(signingWallet.getKeystores().getFirst().hasPrivateKey()) { if(signingWallet.isEncrypted()) { EventManager.get().post(new RequestOpenWalletsEvent()); } else { @@ -358,7 +370,7 @@ public class MessageSignDialog extends Dialog { private void signUnencryptedKeystore(Wallet decryptedWallet) { try { - Keystore keystore = decryptedWallet.getKeystores().get(0); + Keystore keystore = decryptedWallet.getKeystores().getFirst(); ECKey privKey = keystore.getKey(walletNode); String signatureText; if(isBip322()) { @@ -378,8 +390,8 @@ public class MessageSignDialog extends Dialog { } private void signDeviceKeystore(Wallet deviceWallet) { - List fingerprints = List.of(deviceWallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint()); - KeyDerivation fullDerivation = deviceWallet.getKeystores().get(0).getKeyDerivation().extend(walletNode.getDerivation()); + List fingerprints = List.of(deviceWallet.getKeystores().getFirst().getKeyDerivation().getMasterFingerprint()); + KeyDerivation fullDerivation = deviceWallet.getKeystores().getFirst().getKeyDerivation().extend(walletNode.getDerivation()); DeviceSignMessageDialog deviceSignMessageDialog = new DeviceSignMessageDialog(fingerprints, deviceWallet, message.getText().trim(), fullDerivation); deviceSignMessageDialog.initOwner(getDialogPane().getScene().getWindow()); Optional optSignature = deviceSignMessageDialog.showAndWait();