diff --git a/FullyNoded.xcodeproj/project.pbxproj b/FullyNoded.xcodeproj/project.pbxproj
index d6935f58..5d1c16ee 100644
--- a/FullyNoded.xcodeproj/project.pbxproj
+++ b/FullyNoded.xcodeproj/project.pbxproj
@@ -1510,7 +1510,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 337;
+ CURRENT_PROJECT_VERSION = 338;
DEVELOPMENT_TEAM = 8JHDU5M9KD;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
@@ -1521,7 +1521,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.417;
+ MARKETING_VERSION = 1.418;
PRODUCT_BUNDLE_IDENTIFIER = com.fontaine.FullyNoded;
"PRODUCT_BUNDLE_IDENTIFIER[sdk=macosx*]" = com.fontaine.fullynodedmacos;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1546,7 +1546,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 337;
+ CURRENT_PROJECT_VERSION = 338;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 8JHDU5M9KD;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
@@ -1559,7 +1559,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.417;
+ MARKETING_VERSION = 1.418;
PRODUCT_BUNDLE_IDENTIFIER = com.fontaine.FullyNoded;
"PRODUCT_BUNDLE_IDENTIFIER[sdk=macosx*]" = com.fontaine.fullynodedmacos;
PRODUCT_NAME = "$(TARGET_NAME)";
diff --git a/FullyNoded/Base.lproj/Main.storyboard b/FullyNoded/Base.lproj/Main.storyboard
index 848bf65c..d5f80356 100644
--- a/FullyNoded/Base.lproj/Main.storyboard
+++ b/FullyNoded/Base.lproj/Main.storyboard
@@ -1559,6 +1559,15 @@
+
@@ -1567,6 +1576,7 @@
+
@@ -1575,6 +1585,7 @@
+
@@ -1813,6 +1824,15 @@ xxxxx
+
@@ -1829,8 +1849,10 @@ xxxxx
+
+
@@ -2165,6 +2187,7 @@ xxxxx
+
@@ -7729,9 +7752,9 @@ COLD means no keys will be generated and no private keys can be imported.
-
-
-
+
+
+
@@ -7773,6 +7796,7 @@ COLD means no keys will be generated and no private keys can be imported.
+
diff --git a/FullyNoded/FullyNoded.entitlements b/FullyNoded/FullyNoded.entitlements
index a74a3e30..7340fbb3 100644
--- a/FullyNoded/FullyNoded.entitlements
+++ b/FullyNoded/FullyNoded.entitlements
@@ -4,6 +4,12 @@
aps-environment
development
+ com.apple.developer.applesignin
+
+ Default
+
+ com.apple.developer.default-data-protection
+ NSFileProtectionComplete
com.apple.developer.icloud-container-identifiers
iCloud.com.fullynoded.backup
diff --git a/FullyNoded/FullyNodedRelease.entitlements b/FullyNoded/FullyNodedRelease.entitlements
index d741096f..4aa7a5e7 100644
--- a/FullyNoded/FullyNodedRelease.entitlements
+++ b/FullyNoded/FullyNodedRelease.entitlements
@@ -4,6 +4,12 @@
aps-environment
development
+ com.apple.developer.applesignin
+
+ Default
+
+ com.apple.developer.default-data-protection
+ NSFileProtectionComplete
com.apple.developer.icloud-container-identifiers
iCloud.com.fullynoded.backup
diff --git a/FullyNoded/View Controllers/Settings/Security Center/SecurityCenterViewController.swift b/FullyNoded/View Controllers/Settings/Security Center/SecurityCenterViewController.swift
index 6d18ebed..731292c8 100644
--- a/FullyNoded/View Controllers/Settings/Security Center/SecurityCenterViewController.swift
+++ b/FullyNoded/View Controllers/Settings/Security Center/SecurityCenterViewController.swift
@@ -161,12 +161,12 @@ class SecurityCenterViewController: UIViewController, UITableViewDelegate, UITab
}
case 1:
-// if KeyChain.getData("userIdentifier") == nil {
-// add2fa()
-// } else {
-// promptToDisable2fa()
-// }
- showAlert(vc: self, title: "", message: "This feature is not available for the dmg.")
+ if KeyChain.getData("userIdentifier") == nil {
+ add2fa()
+ } else {
+ promptToDisable2fa()
+ }
+ //showAlert(vc: self, title: "", message: "This feature is not available for the dmg.")
case 2:
DispatchQueue.main.async { [unowned vc = self] in
vc.performSegue(withIdentifier: "addPasswordSegue", sender: vc)
diff --git a/FullyNoded/View Controllers/VerifyTransactionViewController.swift b/FullyNoded/View Controllers/VerifyTransactionViewController.swift
index d68c5dee..12d14239 100644
--- a/FullyNoded/View Controllers/VerifyTransactionViewController.swift
+++ b/FullyNoded/View Controllers/VerifyTransactionViewController.swift
@@ -1456,6 +1456,7 @@ class VerifyTransactionViewController: UIViewController, UINavigationControllerD
let sigsImageView = inputCell.viewWithTag(17) as! UIImageView
let copyAddressButton = inputCell.viewWithTag(18) as! UIButton
let copyDescButton = inputCell.viewWithTag(19) as! UIButton
+ let addressQrButton = inputCell.viewWithTag(20) as! UIButton
backgroundView1.layer.cornerRadius = 5
backgroundView2.layer.cornerRadius = 5
@@ -1495,9 +1496,11 @@ class VerifyTransactionViewController: UIViewController, UINavigationControllerD
copyAddressButton.restorationIdentifier = inputAddress
copyDescButton.restorationIdentifier = desc
+ addressQrButton.restorationIdentifier = inputAddress
copyAddressButton.addTarget(self, action: #selector(copyAddress(_:)), for: .touchUpInside)
copyDescButton.addTarget(self, action: #selector(copyDesc(_:)), for: .touchUpInside)
+ addressQrButton.addTarget(self, action: #selector(showAddressQr(_:)), for: .touchUpInside)
signaturesLabel.text = signatureStatus
@@ -1584,6 +1587,7 @@ class VerifyTransactionViewController: UIViewController, UINavigationControllerD
let copyAddressButton = outputCell.viewWithTag(21) as! UIButton
let copyDescriptorButton = outputCell.viewWithTag(22) as! UIButton
let verifyOwnerButton = outputCell.viewWithTag(23) as! UIButton
+ let addressQrButton = outputCell.viewWithTag(24) as! UIButton
signableBackgroundView.layer.cornerRadius = 5
verifiedByFnBackgroundView.layer.cornerRadius = 5
@@ -1628,10 +1632,12 @@ class VerifyTransactionViewController: UIViewController, UINavigationControllerD
copyAddressButton.restorationIdentifier = outputAddress
verifyOwnerButton.restorationIdentifier = outputAddress + " " + "\(indexPath.row)"
copyDescriptorButton.restorationIdentifier = desc
+ addressQrButton.restorationIdentifier = outputAddress
copyAddressButton.addTarget(self, action: #selector(copyAddress(_:)), for: .touchUpInside)
copyDescriptorButton.addTarget(self, action: #selector(copyDesc(_:)), for: .touchUpInside)
verifyOwnerButton.addTarget(self, action: #selector(verifyOwner(_:)), for: .touchUpInside)
+ addressQrButton.addTarget(self, action: #selector(showAddressQr(_:)), for: .touchUpInside)
if isOursFullyNoded {
verifiedByFnLabel.text = "Owned by \(walletLabel)"
@@ -1988,6 +1994,17 @@ class VerifyTransactionViewController: UIViewController, UINavigationControllerD
showAlert(vc: self, title: "", message: "Address copied ✓")
}
+ @objc func showAddressQr(_ sender: UIButton) {
+ guard let address = sender.restorationIdentifier else { return }
+
+ DispatchQueue.main.async { [weak self] in
+ guard let self = self else { return }
+
+ self.qrCodeStringToExport = address
+ self.performSegue(withIdentifier: "segueToShowAddressQR", sender: self)
+ }
+ }
+
@objc func copyDesc(_ sender: UIButton) {
UIPasteboard.general.string = sender.restorationIdentifier
@@ -2388,8 +2405,16 @@ class VerifyTransactionViewController: UIViewController, UINavigationControllerD
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
+ if segue.identifier == "segueToShowAddressQR" {
+ if let vc = segue.destination as? QRDisplayerViewController {
+ vc.text = self.qrCodeStringToExport
+ vc.headerIcon = UIImage(systemName: "square.and.arrow.up")
+ vc.headerText = "Address"
+ vc.descriptionText = self.qrCodeStringToExport
+ }
+ }
+
if segue.identifier == "segueToExportPsbtAsQr" {
-
if let vc = segue.destination as? QRDisplayerViewController {
if self.qrCodeStringToExport != "" {