diff --git a/src/main/java/com/sparrowwallet/sparrow/AppController.java b/src/main/java/com/sparrowwallet/sparrow/AppController.java index ef0116b2..ef02d738 100644 --- a/src/main/java/com/sparrowwallet/sparrow/AppController.java +++ b/src/main/java/com/sparrowwallet/sparrow/AppController.java @@ -21,6 +21,8 @@ import com.sparrowwallet.sparrow.control.*; import com.sparrowwallet.sparrow.event.*; import com.sparrowwallet.sparrow.glyphfont.FontAwesome5; import com.sparrowwallet.sparrow.io.*; +import com.sparrowwallet.sparrow.io.bbqr.BBQR; +import com.sparrowwallet.sparrow.io.bbqr.BBQRType; import com.sparrowwallet.sparrow.net.ElectrumServer; import com.sparrowwallet.sparrow.net.ServerType; import com.sparrowwallet.sparrow.preferences.PreferenceGroup; @@ -752,8 +754,10 @@ public class AppController implements Initializable { Transaction transaction = transactionTabData.getTransaction(); try { - UR ur = UR.fromBytes(transaction.bitcoinSerialize()); - QRDisplayDialog qrDisplayDialog = new QRDisplayDialog(ur); + byte[] txBytes = transaction.bitcoinSerialize(); + UR ur = UR.fromBytes(txBytes); + BBQR bbqr = new BBQR(BBQRType.TXN, txBytes); + QRDisplayDialog qrDisplayDialog = new QRDisplayDialog(ur, bbqr, false, false, false); qrDisplayDialog.initOwner(rootStack.getScene().getWindow()); qrDisplayDialog.showAndWait(); } catch(Exception e) { @@ -851,8 +855,10 @@ public class AppController implements Initializable { if(tabData.getType() == TabData.TabType.TRANSACTION) { TransactionTabData transactionTabData = (TransactionTabData)tabData; - CryptoPSBT cryptoPSBT = new CryptoPSBT(transactionTabData.getPsbt().serialize()); - QRDisplayDialog qrDisplayDialog = new QRDisplayDialog(cryptoPSBT.toUR()); + byte[] psbtBytes = transactionTabData.getPsbt().serialize(); + CryptoPSBT cryptoPSBT = new CryptoPSBT(psbtBytes); + BBQR bbqr = new BBQR(BBQRType.PSBT, psbtBytes); + QRDisplayDialog qrDisplayDialog = new QRDisplayDialog(cryptoPSBT.toUR(), bbqr, false, true, false); qrDisplayDialog.initOwner(rootStack.getScene().getWindow()); qrDisplayDialog.show(); } diff --git a/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreExportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreExportPane.java index aa14fd6c..0cd2f562 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreExportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreExportPane.java @@ -4,12 +4,14 @@ import com.sparrowwallet.drongo.protocol.ScriptType; import com.sparrowwallet.drongo.wallet.Keystore; import com.sparrowwallet.drongo.wallet.KeystoreSource; import com.sparrowwallet.drongo.wallet.Wallet; -import com.sparrowwallet.hummingbird.registry.RegistryType; +import com.sparrowwallet.hummingbird.UR; import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.EventManager; import com.sparrowwallet.sparrow.event.KeystoreExportEvent; import com.sparrowwallet.sparrow.glyphfont.FontAwesome5; import com.sparrowwallet.sparrow.io.*; +import com.sparrowwallet.sparrow.io.bbqr.BBQR; +import com.sparrowwallet.sparrow.io.bbqr.BBQRType; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.ButtonType; @@ -153,7 +155,9 @@ public class FileKeystoreExportPane extends TitledDescriptionPane { } else { QRDisplayDialog qrDisplayDialog; if(exporter instanceof Bip129) { - qrDisplayDialog = new QRDisplayDialog(RegistryType.BYTES.toString(), baos.toByteArray(), false); + UR ur = UR.fromBytes(baos.toByteArray()); + BBQR bbqr = new BBQR(BBQRType.UNICODE, baos.toByteArray()); + qrDisplayDialog = new QRDisplayDialog(ur, bbqr, false, true, false); } else { qrDisplayDialog = new QRDisplayDialog(baos.toString(StandardCharsets.UTF_8)); } diff --git a/src/main/java/com/sparrowwallet/sparrow/control/FileWalletExportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/FileWalletExportPane.java index aee9debe..1d0bbaad 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/FileWalletExportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/FileWalletExportPane.java @@ -4,6 +4,7 @@ import com.sparrowwallet.drongo.KeyPurpose; import com.sparrowwallet.drongo.OutputDescriptor; import com.sparrowwallet.drongo.SecureString; import com.sparrowwallet.drongo.wallet.Wallet; +import com.sparrowwallet.hummingbird.UR; import com.sparrowwallet.hummingbird.registry.CryptoOutput; import com.sparrowwallet.hummingbird.registry.RegistryType; import com.sparrowwallet.sparrow.AppServices; @@ -13,6 +14,8 @@ import com.sparrowwallet.sparrow.event.TimedEvent; import com.sparrowwallet.sparrow.event.WalletExportEvent; import com.sparrowwallet.sparrow.glyphfont.FontAwesome5; import com.sparrowwallet.sparrow.io.*; +import com.sparrowwallet.sparrow.io.bbqr.BBQR; +import com.sparrowwallet.sparrow.io.bbqr.BBQRType; import javafx.concurrent.Service; import javafx.concurrent.Task; import javafx.geometry.Pos; @@ -163,8 +166,12 @@ public class FileWalletExportPane extends TitledDescriptionPane { QRDisplayDialog qrDisplayDialog; if(exporter instanceof CoboVaultMultisig) { qrDisplayDialog = new QRDisplayDialog(RegistryType.BYTES.toString(), outputStream.toByteArray(), true); - } else if(exporter instanceof PassportMultisig || exporter instanceof KeystoneMultisig || exporter instanceof JadeMultisig || exporter instanceof Bip129) { + } else if(exporter instanceof PassportMultisig || exporter instanceof KeystoneMultisig || exporter instanceof JadeMultisig) { qrDisplayDialog = new QRDisplayDialog(RegistryType.BYTES.toString(), outputStream.toByteArray(), false); + } else if(exporter instanceof Bip129) { + UR ur = UR.fromBytes(outputStream.toByteArray()); + BBQR bbqr = new BBQR(BBQRType.UNICODE, outputStream.toByteArray()); + qrDisplayDialog = new QRDisplayDialog(ur, bbqr, false, true, false); } else if(exporter instanceof Descriptor) { OutputDescriptor outputDescriptor = OutputDescriptor.getOutputDescriptor(exportWallet, KeyPurpose.DEFAULT_PURPOSES, null); CryptoOutput cryptoOutput = getCryptoOutput(exportWallet); diff --git a/src/main/java/com/sparrowwallet/sparrow/transaction/HeadersController.java b/src/main/java/com/sparrowwallet/sparrow/transaction/HeadersController.java index fd98e6a6..6d97dedc 100644 --- a/src/main/java/com/sparrowwallet/sparrow/transaction/HeadersController.java +++ b/src/main/java/com/sparrowwallet/sparrow/transaction/HeadersController.java @@ -906,7 +906,7 @@ public class HeadersController extends TransactionFormController implements Init //TODO: Remove once Cobo Vault support has been removed boolean addLegacyEncodingOption = headersForm.getSigningWallet().getKeystores().stream().anyMatch(keystore -> keystore.getWalletModel().equals(WalletModel.COBO_VAULT)); - boolean addBbqrOption = headersForm.getSigningWallet().getKeystores().stream().anyMatch(keystore -> keystore.getWalletModel().equals(WalletModel.COLDCARD) || keystore.getSource().equals(KeystoreSource.SW_WATCH)); + boolean addBbqrOption = headersForm.getSigningWallet().getKeystores().stream().anyMatch(keystore -> keystore.getWalletModel().equals(WalletModel.COLDCARD) || keystore.getSource().equals(KeystoreSource.SW_WATCH) || keystore.getSource().equals(KeystoreSource.SW_SEED)); boolean selectBbqrOption = headersForm.getSigningWallet().getKeystores().stream().allMatch(keystore -> keystore.getWalletModel().equals(WalletModel.COLDCARD)); //Don't include non witness utxo fields for segwit wallets when displaying the PSBT as a QR - it can add greatly to the time required for scanning