From a3c5acf10599dc421f8b0815626c012e8c85ce5f Mon Sep 17 00:00:00 2001 From: pankcuf Date: Tue, 26 Sep 2023 18:57:44 +0700 Subject: [PATCH 1/8] chore: bump up version 7.1.0 (+ set disconnect reason for DashSync's PeerManager) --- DashSyncCurrentCommit | 2 +- DashWallet.xcodeproj/project.pbxproj | 32 +++++++++---------- .../UI/Menu/Settings/About/DWAboutModel.m | 2 +- Podfile.lock | 26 +++++++-------- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/DashSyncCurrentCommit b/DashSyncCurrentCommit index de8178d51..6979d2ba7 100644 --- a/DashSyncCurrentCommit +++ b/DashSyncCurrentCommit @@ -1 +1 @@ -af75b12a4dd613335bbec63f7380c59bd257e41e +c553d04f5806c6c2cc600e03910378a87fcd9320 diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 364ce935c..ae11791bc 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -7420,7 +7420,7 @@ INFOPLIST_KEY_CFBundleDisplayName = Dash; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; @@ -7476,7 +7476,7 @@ INFOPLIST_KEY_CFBundleDisplayName = Dash; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "DashWallet/dashwallet-Bridging-Header.h"; @@ -7561,7 +7561,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -7583,7 +7583,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -7604,7 +7604,7 @@ EXCLUDED_ARCHS = ""; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -7627,7 +7627,7 @@ EXCLUDED_ARCHS = ""; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -7655,7 +7655,7 @@ INFOPLIST_FILE = TodayExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -7680,7 +7680,7 @@ INFOPLIST_FILE = TodayExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -7795,7 +7795,7 @@ INFOPLIST_KEY_CFBundleDisplayName = Dash; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "DashWallet/dashwallet-Bridging-Header.h"; @@ -7823,7 +7823,7 @@ INFOPLIST_FILE = TodayExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -7875,7 +7875,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -7896,7 +7896,7 @@ EXCLUDED_ARCHS = ""; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -8010,7 +8010,7 @@ INFOPLIST_KEY_CFBundleDisplayName = Dash; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "DashWallet/dashwallet-Bridging-Header.h"; @@ -8037,7 +8037,7 @@ INFOPLIST_FILE = TodayExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -8088,7 +8088,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -8109,7 +8109,7 @@ EXCLUDED_ARCHS = ""; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 7.0.5; + MARKETING_VERSION = 7.1.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; diff --git a/DashWallet/Sources/UI/Menu/Settings/About/DWAboutModel.m b/DashWallet/Sources/UI/Menu/Settings/About/DWAboutModel.m index 76583318c..6a0812dc7 100644 --- a/DashWallet/Sources/UI/Menu/Settings/About/DWAboutModel.m +++ b/DashWallet/Sources/UI/Menu/Settings/About/DWAboutModel.m @@ -203,7 +203,7 @@ - (void)setFixedPeer:(NSString *)fixedPeer { host = @(inet_ntop(AF_INET6, &addr, s, sizeof(s))); } [[DWEnvironment sharedInstance].currentChainManager.peerManager setTrustedPeerHost:[NSString stringWithFormat:@"%@:%d", host, port]]; - [[DWEnvironment sharedInstance].currentChainManager.peerManager disconnect]; + [[DWEnvironment sharedInstance].currentChainManager.peerManager disconnect:DSDisconnectReason_TrustedPeerSet]; [[DWEnvironment sharedInstance].currentChainManager.peerManager connect]; break; } diff --git a/Podfile.lock b/Podfile.lock index eaa1659b8..528278415 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -565,7 +565,7 @@ PODS: - abseil/base/base_internal - abseil/base/config - abseil/meta/type_traits - - Alamofire (5.7.1) + - Alamofire (5.8.0) - BlueCryptor (1.0.32) - BlueECC (1.2.5) - BlueRSA (1.0.200) @@ -591,11 +591,11 @@ PODS: - "!ProtoCompiler-gRPCPlugin (~> 1.0)" - DAPI-GRPC/Messages - gRPC-ProtoRPC - - DashSharedCore (0.4.10) + - DashSharedCore (0.4.11) - DashSync (0.1.0): - CocoaLumberjack (= 3.7.2) - DAPI-GRPC (= 0.22.0-dev.8) - - DashSharedCore (= 0.4.10) + - DashSharedCore (= 0.4.11) - DSDynamicOptions (= 0.1.2) - DWAlertController (= 0.2.1) - TinyCborObjc (= 0.4.6) @@ -620,13 +620,13 @@ PODS: - FirebaseStorage (8.15.0): - FirebaseCore (~> 8.0) - GTMSessionFetcher/Core (~> 1.5) - - GoogleDataTransport (9.2.3): + - GoogleDataTransport (9.2.5): - GoogleUtilities/Environment (~> 7.7) - nanopb (< 2.30910.0, >= 2.30908.0) - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Environment (7.11.4): + - GoogleUtilities/Environment (7.11.5): - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.11.4): + - GoogleUtilities/Logger (7.11.5): - GoogleUtilities/Environment - gRPC-Core (1.49.0): - gRPC-Core/Implementation (= 1.49.0) @@ -707,7 +707,7 @@ PODS: - nanopb/decode (2.30908.0) - nanopb/encode (2.30908.0) - PromisesObjC (2.3.1) - - Protobuf (3.23.4) + - Protobuf (3.24.3) - SDWebImage (5.13.2): - SDWebImage/Core (= 5.13.2) - SDWebImage/Core (5.13.2) @@ -816,7 +816,7 @@ SPEC CHECKSUMS: "!ProtoCompiler": e9c09244955a8565817aa59a4787b6bb849a63c6 "!ProtoCompiler-gRPCPlugin": 755f0ee414a0d5f0028e0dcfe98c23bdbc3e6fa3 abseil: 926fb7a82dc6d2b8e1f2ed7f3a718bce691d1e46 - Alamofire: 0123a34370cb170936ae79a8df46cc62b2edeb88 + Alamofire: 0e92e751b3e9e66d7982db43919d01f313b8eb91 BlueCryptor: b0aee3d9b8f367b49b30de11cda90e1735571c24 BlueECC: 0d18e93347d3ec6d41416de21c1ffa4d4cd3c2cc BlueRSA: dfeef51db96bcc4edec654956c1581adbda4e6a3 @@ -825,8 +825,8 @@ SPEC CHECKSUMS: CocoaImageHashing: 8656031d0899abe6c1c415827de43e9798189c53 CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da DAPI-GRPC: 138d62523bbfe7e88a39896f1053c0bc12390d9f - DashSharedCore: d107a64758acebc53edacc160ad450f539ff33ee - DashSync: 4a9504583105eb2ace98f38f377cb44fe62f5021 + DashSharedCore: d4dc11749f3555702dbe10c563087e6b48399394 + DashSync: 2d80784e399b869aede6d5bd476a149733451651 DSDynamicOptions: 347cc5d2c4e080eb3de6a86719ad3d861b82adfc DWAlertController: 5f4cd8adf90336331c054857f709f5f8d4b16a5b Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d @@ -834,8 +834,8 @@ SPEC CHECKSUMS: FirebaseCoreDiagnostics: 92e07a649aeb66352b319d43bdd2ee3942af84cb FirebaseDynamicLinks: 1dc816ef789c5adac6fede0b46d11478175c70e4 FirebaseStorage: 8019af461599b2c3bc61c6a5dbdfa3d2de66a4d9 - GoogleDataTransport: f0308f5905a745f94fb91fea9c6cbaf3831cb1bd - GoogleUtilities: c63691989bf362ba0505507da00eeb326192e83e + GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2 + GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084 gRPC: 64f36d689b2ecd99c4351f74e6f91347cdc65d9f gRPC-Core: 3a9fdb5967d42211e875826f3f6fc163ea02c2a1 gRPC-ProtoRPC: 1c223e0f1732bb8d0b9e9e0ea60cc0fe995b8e2d @@ -850,7 +850,7 @@ SPEC CHECKSUMS: Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - Protobuf: c6bc59bbab3d38a71c67f62d7cb7ca8f8ea4eca1 + Protobuf: 970f7ee93a3a08e3cf64859b8efd95ee32b4f87f SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866 SQLite.swift: 903bfa3bc9ab06345fdfbb578e34f47cfcf417da SQLiteMigrationManager.swift: 5383578f5bc8955c06695e8bf04835ee0e6673a8 From b6866bcbfd9a5259ba414ba04d3eac30fd20c62e Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Mon, 11 Dec 2023 16:22:54 +0700 Subject: [PATCH 2/8] chore: disable Uphold and Coinbase --- .../Sources/UI/Portal/Model/PortalModel.swift | 1 + .../UI/Portal/Model/ServiceDataProvider.swift | 30 +++++++++---------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/DashWallet/Sources/UI/Portal/Model/PortalModel.swift b/DashWallet/Sources/UI/Portal/Model/PortalModel.swift index 7172bc6db..7e55c5fc3 100644 --- a/DashWallet/Sources/UI/Portal/Model/PortalModel.swift +++ b/DashWallet/Sources/UI/Portal/Model/PortalModel.swift @@ -107,6 +107,7 @@ class PortalModel: NetworkReachabilityHandling { self?.items = items self?.delegate?.serviceItemsDidChange() } + serviceItemDataProvider.initializeDataSources() networkStatusDidChange = { [weak self] _ in self?.refreshData() diff --git a/DashWallet/Sources/UI/Portal/Model/ServiceDataProvider.swift b/DashWallet/Sources/UI/Portal/Model/ServiceDataProvider.swift index f689c719d..45ce78946 100644 --- a/DashWallet/Sources/UI/Portal/Model/ServiceDataProvider.swift +++ b/DashWallet/Sources/UI/Portal/Model/ServiceDataProvider.swift @@ -20,6 +20,7 @@ import Foundation // MARK: - ServiceDataProvider protocol ServiceDataProvider { + func initializeDataSources() func listenForData(handler: @escaping (([ServiceItem]) -> Void)) func refresh() } @@ -27,6 +28,8 @@ protocol ServiceDataProvider { // MARK: - MookServiceDataProvider class MookServiceDataProvider: ServiceDataProvider { + func initializeDataSources() { } + func listenForData(handler: @escaping (([ServiceItem]) -> Void)) { handler([.init(status: .authorized, service: .uphold), .init(status: .idle, service: .coinbase)]) } @@ -42,13 +45,7 @@ class ServiceDataProviderImpl: ServiceDataProvider { private var upholdDataSource: ServiceDataSource = UpholdDataSource() private var coinbaseDataSource: ServiceDataSource = CoinbaseDataSource() - private var items: [ServiceItem] = [ - .init(status: .idle, service: .topper) // Topper item doesn't need a data source - ] - - init() { - initializeDataSources() - } + private var items: [ServiceItem] = [] func listenForData(handler: @escaping (([ServiceItem]) -> Void)) { self.handler = handler @@ -59,14 +56,17 @@ class ServiceDataProviderImpl: ServiceDataProvider { coinbaseDataSource.refresh() } - private func initializeDataSources() { - upholdDataSource.serviceDidUpdate = { [weak self] item in - self?.updateService(with: item) - } - - coinbaseDataSource.serviceDidUpdate = { [weak self] item in - self?.updateService(with: item) - } + func initializeDataSources() { + updateService(with: .init(status: .idle, service: .topper)) // Topper item doesn't need a data source) + + // Disabled due to App Store review hold-up +// upholdDataSource.serviceDidUpdate = { [weak self] item in +// self?.updateService(with: item) +// } +// +// coinbaseDataSource.serviceDidUpdate = { [weak self] item in +// self?.updateService(with: item) +// } } private func updateService(with item: ServiceItem) { From d01b36d4e4c22d2fa1a089752c50fdce90f05f76 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Mon, 11 Dec 2023 18:15:46 +0700 Subject: [PATCH 3/8] chore: don't start CoinbaseObjcWrapper --- DashWallet/AppDelegate.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DashWallet/AppDelegate.m b/DashWallet/AppDelegate.m index f923db737..167628bc3 100644 --- a/DashWallet/AppDelegate.m +++ b/DashWallet/AppDelegate.m @@ -102,7 +102,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [FIRApp configure]; [ExploreDashObjcWrapper configure]; [CurrencyExchangerObjcWrapper startExchangeRateFetching]; - [CoinbaseObjcWrapper start]; +// [CoinbaseObjcWrapper start]; Disabled due to App Store review hold-up [CrowdNodeObjcWrapper start]; [[NSNotificationCenter defaultCenter] addObserver:self From d365959e30dbf81b95fe2038b45f943c12fce59e Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Mon, 18 Dec 2023 14:52:30 +0700 Subject: [PATCH 4/8] fix: count HPMN as 4 virtual masternodes --- .../Sources/Categories/DSChain+DashWallet.m | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/DashWallet/Sources/Categories/DSChain+DashWallet.m b/DashWallet/Sources/Categories/DSChain+DashWallet.m index 6dc6f7bac..7ada7033b 100644 --- a/DashWallet/Sources/Categories/DSChain+DashWallet.m +++ b/DashWallet/Sources/Categories/DSChain+DashWallet.m @@ -22,6 +22,8 @@ #import "DSMasternodeManager.h" #import "NSDate+Utils.h" #import +#import "DSSimplifiedMasternodeEntry.h" + NS_ASSUME_NONNULL_BEGIN @@ -89,13 +91,25 @@ - (NSNumber *_Nullable)calculateMasternodeAPY { return nil; DSMasternodeList *masternodeList = self.chainManager.masternodeManager.currentMasternodeList; - + if (masternodeList.validMasternodeCount == 0) return nil; + + NSInteger virtualMNCount = 0; + + for (DSSimplifiedMasternodeEntry *entry in masternodeList.simplifiedMasternodeEntries) { + if (entry.isValid) { + if (entry.type == 1) { // HPMN + virtualMNCount += 4; + } else { + virtualMNCount += 1; + } + } + } return [self calculateMasternodeAPYWithHeight:self.lastTerminalBlock.height prevDifficultyTarget:self.lastTerminalBlock.target - masternodeCount:masternodeList.validMasternodeCount]; + masternodeCount:virtualMNCount]; } - (NSNumber *)calculateMasternodeAPYWithHeight:(uint64_t)height prevDifficultyTarget:(uint32_t)difficulty masternodeCount:(uint64_t)mnCount { From 15333d65595188802481a2554a4f78d192ec047c Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Tue, 19 Dec 2023 19:00:13 +0700 Subject: [PATCH 5/8] test: virtual masternodes --- DashWallet/Sources/Categories/DSChain+DashWallet.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/DashWallet/Sources/Categories/DSChain+DashWallet.m b/DashWallet/Sources/Categories/DSChain+DashWallet.m index 7ada7033b..ab71234e0 100644 --- a/DashWallet/Sources/Categories/DSChain+DashWallet.m +++ b/DashWallet/Sources/Categories/DSChain+DashWallet.m @@ -100,12 +100,17 @@ - (NSNumber *_Nullable)calculateMasternodeAPY { for (DSSimplifiedMasternodeEntry *entry in masternodeList.simplifiedMasternodeEntries) { if (entry.isValid) { if (entry.type == 1) { // HPMN + DSLog(@"masternodeList found HPMN: %@", entry.uniqueID); virtualMNCount += 4; } else { virtualMNCount += 1; } } } + + DSLog(@"masternodeList validMasternodeCount: %llu", masternodeList.validMasternodeCount); + DSLog(@"masternodeList virtualMNCount: %ld", (long)virtualMNCount); + DSLog(@"masternodeList HPMNCount: %llu", masternodeList.hpMasternodeCount); return [self calculateMasternodeAPYWithHeight:self.lastTerminalBlock.height prevDifficultyTarget:self.lastTerminalBlock.target From 052bbe96bf64049d448334db81392e1921a4a47a Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Thu, 18 Jan 2024 16:36:00 +0700 Subject: [PATCH 6/8] fix: coinbase crash --- DashWallet/AppDelegate.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DashWallet/AppDelegate.m b/DashWallet/AppDelegate.m index 167628bc3..f923db737 100644 --- a/DashWallet/AppDelegate.m +++ b/DashWallet/AppDelegate.m @@ -102,7 +102,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [FIRApp configure]; [ExploreDashObjcWrapper configure]; [CurrencyExchangerObjcWrapper startExchangeRateFetching]; -// [CoinbaseObjcWrapper start]; Disabled due to App Store review hold-up + [CoinbaseObjcWrapper start]; [CrowdNodeObjcWrapper start]; [[NSNotificationCenter defaultCenter] addObserver:self From 855ee002e0177ad35aa1baa219d7c1f619744946 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Fri, 19 Jan 2024 12:19:26 +0700 Subject: [PATCH 7/8] fix: CrowdNode APY calculation --- DashSyncCurrentCommit | 2 +- DashWallet.xcodeproj/project.pbxproj | 62 +++++++------- .../Sources/Categories/DSChain+DashWallet.m | 8 +- .../Sources/Models/CrowdNode/CrowdNode.swift | 15 +++- .../UI/CrowdNode/Views/CrowdNodeAPYView.swift | 80 +++++++++++++++++++ .../Views/DWExploreTestnetContentsView.m | 67 +--------------- 6 files changed, 132 insertions(+), 102 deletions(-) create mode 100644 DashWallet/Sources/UI/CrowdNode/Views/CrowdNodeAPYView.swift diff --git a/DashSyncCurrentCommit b/DashSyncCurrentCommit index 85619076b..d67413f27 100644 --- a/DashSyncCurrentCommit +++ b/DashSyncCurrentCommit @@ -1 +1 @@ -71d2f9578544a48331ffa09edc748b3ed8766b97 \ No newline at end of file +def9c768c36fcc1436f7e7185693369405977e61 diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 7fcea48cb..2461754bc 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 53; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -586,6 +586,8 @@ 75889B792AD2A04900C17F5D /* CoinJoinInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75889B752AD296E700C17F5D /* CoinJoinInfoViewController.swift */; }; 75889B7F2AD2D7F800C17F5D /* CoinJoin.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75889B812AD2D7F800C17F5D /* CoinJoin.storyboard */; }; 75889B892AD2DF0200C17F5D /* CoinJoin.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75889B812AD2D7F800C17F5D /* CoinJoin.storyboard */; }; + 759C8F9F2B593589004B1305 /* CrowdNodeAPYView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759C8F9E2B593589004B1305 /* CrowdNodeAPYView.swift */; }; + 759C8FA02B593589004B1305 /* CrowdNodeAPYView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759C8F9E2B593589004B1305 /* CrowdNodeAPYView.swift */; }; 75A664D82B09F1EA007EFD16 /* VotingInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A664D72B09F1EA007EFD16 /* VotingInfoViewController.swift */; }; 75A8C1652AE5726B0042256E /* UsernameRequestsDAO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A8C1632AE5725C0042256E /* UsernameRequestsDAO.swift */; }; 75A8C1672AE5734A0042256E /* UsernameRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A8C1662AE5734A0042256E /* UsernameRequest.swift */; }; @@ -2433,6 +2435,7 @@ 75889B802AD2D7F800C17F5D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CoinJoin.storyboard; sourceTree = ""; }; 759816E519357D6F005060EA /* BRBubbleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BRBubbleView.h; sourceTree = ""; }; 759816E619357D6F005060EA /* BRBubbleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BRBubbleView.m; sourceTree = ""; }; + 759C8F9E2B593589004B1305 /* CrowdNodeAPYView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrowdNodeAPYView.swift; sourceTree = ""; }; 75A664D72B09F1EA007EFD16 /* VotingInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VotingInfoViewController.swift; sourceTree = ""; }; 75A8C1632AE5725C0042256E /* UsernameRequestsDAO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsernameRequestsDAO.swift; sourceTree = ""; }; 75A8C1662AE5734A0042256E /* UsernameRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsernameRequest.swift; sourceTree = ""; }; @@ -5062,6 +5065,7 @@ isa = PBXGroup; children = ( 47083B3429893E2C0010AF71 /* Tx Cell */, + 759C8F9E2B593589004B1305 /* CrowdNodeAPYView.swift */, ); path = Views; sourceTree = ""; @@ -8725,6 +8729,7 @@ C9F42FB229DD5141001BC549 /* BackupInfoViewController.swift in Sources */, 47C6E6E5291A68B6003FEDF2 /* AppliedFiltersView.swift in Sources */, 2A7A7BAE234770C900451078 /* DWCaptureSessionManager.m in Sources */, + 759C8F9F2B593589004B1305 /* CrowdNodeAPYView.swift in Sources */, C94D982E2A544E8E00F3BEE1 /* UIButton+Dash.swift in Sources */, C956AF2B2A5CC97F002FAB75 /* ConfirmPaymentModel.swift in Sources */, 2A11F59F2194BD6200E7B563 /* DWDataMigrationManager.m in Sources */, @@ -9030,6 +9035,7 @@ C9D2C6FB2A320AA000D15901 /* TxReclassifyTransactionsWhereToChangeViewController.swift in Sources */, C9D2C6FC2A320AA000D15901 /* DWLocalCurrencyViewController.m in Sources */, C9D2C6FD2A320AA000D15901 /* BadgeView.swift in Sources */, + 759C8FA02B593589004B1305 /* CrowdNodeAPYView.swift in Sources */, C943B5162A40A54600AF23C5 /* DWCreateInvitationButton.m in Sources */, C9D2C6FE2A320AA000D15901 /* HomeHeaderView.swift in Sources */, C9D2C6FF2A320AA000D15901 /* ProgressView.swift in Sources */, @@ -10059,7 +10065,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = dashwallet/dashwallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; @@ -10088,7 +10094,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -10167,6 +10173,7 @@ "\"UIKit\"", "-weak_framework", "\"WebKit\"", + "-ld64", ); PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -10188,7 +10195,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = dashwallet/dashwallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -10226,7 +10233,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -10305,6 +10312,7 @@ "\"UIKit\"", "-weak_framework", "\"WebKit\"", + "-ld64", ); PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -10393,13 +10401,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; - CURRENT_PROJECT_VERSION = 10; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -10416,13 +10423,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; - CURRENT_PROJECT_VERSION = 10; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -10437,7 +10443,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C98AA93FF5283EC6405BCE4B /* Pods-WatchApp Extension.debug.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; @@ -10447,7 +10453,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -10464,7 +10470,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = CE02413EF0C60B1D1EDE6457 /* Pods-WatchApp Extension.release.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; @@ -10474,7 +10480,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -11176,7 +11182,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = dashwallet/dashwallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -11214,7 +11220,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -11293,6 +11299,7 @@ "\"UIKit\"", "-weak_framework", "\"WebKit\"", + "-ld64", ); PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -11376,12 +11383,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -11396,7 +11403,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 556B5EBEBAEA571D74FF69A3 /* Pods-WatchApp Extension.testflight.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; @@ -11406,7 +11413,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -11495,7 +11502,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = dashwallet/dashwallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -11523,7 +11530,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -11602,6 +11609,7 @@ "\"UIKit\"", "-weak_framework", "\"WebKit\"", + "-ld64", ); PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -11683,12 +11691,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -11703,7 +11711,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 29B232FD70BA2EDF87F86A56 /* Pods-WatchApp Extension.testnet.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 44RJ69WHFF; ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; @@ -11713,7 +11721,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.0.2; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; diff --git a/DashWallet/Sources/Categories/DSChain+DashWallet.m b/DashWallet/Sources/Categories/DSChain+DashWallet.m index ab71234e0..e930a899e 100644 --- a/DashWallet/Sources/Categories/DSChain+DashWallet.m +++ b/DashWallet/Sources/Categories/DSChain+DashWallet.m @@ -100,17 +100,12 @@ - (NSNumber *_Nullable)calculateMasternodeAPY { for (DSSimplifiedMasternodeEntry *entry in masternodeList.simplifiedMasternodeEntries) { if (entry.isValid) { if (entry.type == 1) { // HPMN - DSLog(@"masternodeList found HPMN: %@", entry.uniqueID); virtualMNCount += 4; } else { virtualMNCount += 1; } } } - - DSLog(@"masternodeList validMasternodeCount: %llu", masternodeList.validMasternodeCount); - DSLog(@"masternodeList virtualMNCount: %ld", (long)virtualMNCount); - DSLog(@"masternodeList HPMNCount: %llu", masternodeList.hpMasternodeCount); return [self calculateMasternodeAPYWithHeight:self.lastTerminalBlock.height prevDifficultyTarget:self.lastTerminalBlock.target @@ -256,7 +251,8 @@ - (uint64_t)calculateblockInflationWithHeight:(uint64_t)height nPrevBits:(uint32 } // Hard fork to reduce the block reward by 10 extra percent (allowing budget/superblocks) - uint64_t nSuperblockPart = (nPrevHeight > [self budgetPaymentsStartBlock]) ? nSubsidy / 10 : 0; + uint64_t treasuryPart = [self isCore20ActiveAtHeight:nPrevHeight] ? 20 : 10; // parts per 100, 20 is 20% + uint64_t nSuperblockPart = (nPrevHeight > [self budgetPaymentsStartBlock]) ? (nSubsidy * treasuryPart) / 100 : 0; return fSuperblockPartOnly ? nSuperblockPart : nSubsidy - nSuperblockPart; } diff --git a/DashWallet/Sources/Models/CrowdNode/CrowdNode.swift b/DashWallet/Sources/Models/CrowdNode/CrowdNode.swift index 8803b9f62..0c4355142 100644 --- a/DashWallet/Sources/Models/CrowdNode/CrowdNode.swift +++ b/DashWallet/Sources/Models/CrowdNode/CrowdNode.swift @@ -125,8 +125,8 @@ public final class CrowdNode { private(set) var isOnlineStateRestored = false var showNotificationOnResult = false - let masternodeAPY: Double - let crowdnodeAPY: Double + var masternodeAPY: Double + var crowdnodeAPY: Double public static let shared: CrowdNode = .init() @@ -188,6 +188,7 @@ extension CrowdNode { } DSLogger.log("restoring CrowdNode state") + checkAPY() signUpState = SignUpState.notStarted validatePrefs() @@ -298,6 +299,16 @@ extension CrowdNode { balance = 0 prefs.resetUserDefaults() } + + private func checkAPY() { + let chain = DWEnvironment.sharedInstance().currentChain + + if let apy = chain.calculateMasternodeAPY()?.doubleValue { + masternodeAPY = apy + crowdnodeAPY = masternodeAPY * 0.85 + chain.apy = NSNumber(value: apy) + } + } } // MARK: Signup diff --git a/DashWallet/Sources/UI/CrowdNode/Views/CrowdNodeAPYView.swift b/DashWallet/Sources/UI/CrowdNode/Views/CrowdNodeAPYView.swift new file mode 100644 index 000000000..91c2946c6 --- /dev/null +++ b/DashWallet/Sources/UI/CrowdNode/Views/CrowdNodeAPYView.swift @@ -0,0 +1,80 @@ +// +// Created by tkhp, Andrei Ashikhmin +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@objc(DWCrowdNodeAPYView) +class CrowdNodeAPYView: UIView { + + override init(frame: CGRect) { + super.init(frame: frame) + addCrowdNodeAPYLabel() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override var intrinsicContentSize: CGSize { + return CGSize(width: UIView.noIntrinsicMetric, height: 24.0) + } + + private func addCrowdNodeAPYLabel() { + let systemGreen = UIColor(red: 98.0 / 255.0, green: 182.0 / 255.0, blue: 125.0 / 255.0, alpha: 1.0) + + let apyStackView = UIStackView() + apyStackView.translatesAutoresizingMaskIntoConstraints = false + apyStackView.axis = .horizontal + apyStackView.spacing = 4 + apyStackView.backgroundColor = systemGreen.withAlphaComponent(0.1) + apyStackView.layer.cornerRadius = 6.0 + apyStackView.layer.masksToBounds = true + apyStackView.layoutMargins = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8) + apyStackView.isLayoutMarginsRelativeArrangement = true + addSubview(apyStackView) + + let iconImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 14, height: 14)) + iconImageView.contentMode = .center + iconImageView.image = UIImage(named: "image.crowdnode.apy") + apyStackView.addArrangedSubview(iconImageView) + + let apiLabel = UILabel() + apiLabel.textColor = systemGreen + apiLabel.font = UIFont.systemFont(ofSize: 11, weight: .semibold) + apiLabel.text = String.localizedStringWithFormat(NSLocalizedString("Current APY = %@", comment: "CrowdNode"), apy) + apyStackView.addArrangedSubview(apiLabel) + + NSLayoutConstraint.activate([ + apyStackView.topAnchor.constraint(equalTo: topAnchor), + apyStackView.bottomAnchor.constraint(equalTo: bottomAnchor), + apyStackView.leadingAnchor.constraint(equalTo: leadingAnchor), + apyStackView.trailingAnchor.constraint(equalTo: trailingAnchor), + apyStackView.heightAnchor.constraint(equalToConstant: 24.0) + ]) + } + + private var apy: String { + let apyValue = DWEnvironment.sharedInstance().apy.doubleValue * 0.85 + + let numberFormatter = NumberFormatter() + numberFormatter.numberStyle = .percent + numberFormatter.minimumFractionDigits = 0 + numberFormatter.maximumFractionDigits = 2 + numberFormatter.multiplier = 1 + return numberFormatter.string(from: NSNumber(value: apyValue)) ?? "" + } +} diff --git a/DashWallet/Sources/UI/Explore Dash/Views/DWExploreTestnetContentsView.m b/DashWallet/Sources/UI/Explore Dash/Views/DWExploreTestnetContentsView.m index c4e7f93cc..2a3d43684 100644 --- a/DashWallet/Sources/UI/Explore Dash/Views/DWExploreTestnetContentsView.m +++ b/DashWallet/Sources/UI/Explore Dash/Views/DWExploreTestnetContentsView.m @@ -19,10 +19,8 @@ #import "DWEnvironment.h" #import "DWUIKit.h" +#import "dashwallet-Swift.h" -@interface DWCrowdNodeAPYView : UIView - -@end @interface DWExploreTestnetContentsView () @end @@ -273,66 +271,3 @@ - (void)addContent:(UIView *)view { [_contentStack addArrangedSubview:view]; } @end - - -@implementation DWCrowdNodeAPYView - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self addCrowdNodeAPYLabel]; - } - - return self; -} - -- (CGSize)intrinsicContentSize { - return CGSizeMake(UIViewNoIntrinsicMetric, 24.0f); -} - -- (void)addCrowdNodeAPYLabel { - UIColor *systemGreen = [UIColor colorWithRed:98.0 / 255.0 green:182.0 / 255.0 blue:125.0 / 255.0 alpha:1.0]; - - UIStackView *apyStackView = [UIStackView new]; - apyStackView.translatesAutoresizingMaskIntoConstraints = NO; - apyStackView.axis = UILayoutConstraintAxisHorizontal; - apyStackView.spacing = 4; - apyStackView.backgroundColor = [systemGreen colorWithAlphaComponent:0.1]; - apyStackView.layer.cornerRadius = 6.0; - apyStackView.layer.masksToBounds = YES; - apyStackView.layoutMargins = UIEdgeInsetsMake(0, 8, 0, 8); - apyStackView.layoutMarginsRelativeArrangement = YES; - [self addSubview:apyStackView]; - - UIImageView *iconImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 14, 14)]; - iconImageView.contentMode = UIViewContentModeCenter; - [iconImageView setImage:[UIImage imageNamed:@"image.crowdnode.apy"]]; - [apyStackView addArrangedSubview:iconImageView]; - - UILabel *apiLabel = [[UILabel alloc] init]; - apiLabel.textColor = systemGreen; - apiLabel.font = [UIFont systemFontOfSize:11 weight:UIFontWeightSemibold]; - apiLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Current APY = %@", @"Crowdnode"), [self apy]]; - [apyStackView addArrangedSubview:apiLabel]; - - [NSLayoutConstraint activateConstraints:@[ - [apyStackView.topAnchor constraintEqualToAnchor:self.topAnchor], - [apyStackView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], - [apyStackView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], - [apyStackView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], - [apyStackView.heightAnchor constraintEqualToConstant:24.0f], - ]]; -} - -- (NSString *)apy { - double apyValue = [DWEnvironment sharedInstance].apy.doubleValue * 0.85; - - NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; - numberFormatter.numberStyle = NSNumberFormatterPercentStyle; - numberFormatter.minimumFractionDigits = 0; - numberFormatter.maximumFractionDigits = 2; - numberFormatter.multiplier = @(1); - return [numberFormatter stringFromNumber:@(apyValue)]; -} - -@end From 8fa8e50134561f382ecf44e7731c0bcae338c8ec Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Tue, 23 Jan 2024 18:54:19 +0700 Subject: [PATCH 8/8] chore: cleanup --- .../Sources/UI/Portal/Model/PortalModel.swift | 1 - .../UI/Portal/Model/ServiceDataProvider.swift | 30 +++++++++---------- DashWallet/dashwallet-Bridging-Header.h | 1 + 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/DashWallet/Sources/UI/Portal/Model/PortalModel.swift b/DashWallet/Sources/UI/Portal/Model/PortalModel.swift index 7e55c5fc3..7172bc6db 100644 --- a/DashWallet/Sources/UI/Portal/Model/PortalModel.swift +++ b/DashWallet/Sources/UI/Portal/Model/PortalModel.swift @@ -107,7 +107,6 @@ class PortalModel: NetworkReachabilityHandling { self?.items = items self?.delegate?.serviceItemsDidChange() } - serviceItemDataProvider.initializeDataSources() networkStatusDidChange = { [weak self] _ in self?.refreshData() diff --git a/DashWallet/Sources/UI/Portal/Model/ServiceDataProvider.swift b/DashWallet/Sources/UI/Portal/Model/ServiceDataProvider.swift index 45ce78946..f689c719d 100644 --- a/DashWallet/Sources/UI/Portal/Model/ServiceDataProvider.swift +++ b/DashWallet/Sources/UI/Portal/Model/ServiceDataProvider.swift @@ -20,7 +20,6 @@ import Foundation // MARK: - ServiceDataProvider protocol ServiceDataProvider { - func initializeDataSources() func listenForData(handler: @escaping (([ServiceItem]) -> Void)) func refresh() } @@ -28,8 +27,6 @@ protocol ServiceDataProvider { // MARK: - MookServiceDataProvider class MookServiceDataProvider: ServiceDataProvider { - func initializeDataSources() { } - func listenForData(handler: @escaping (([ServiceItem]) -> Void)) { handler([.init(status: .authorized, service: .uphold), .init(status: .idle, service: .coinbase)]) } @@ -45,7 +42,13 @@ class ServiceDataProviderImpl: ServiceDataProvider { private var upholdDataSource: ServiceDataSource = UpholdDataSource() private var coinbaseDataSource: ServiceDataSource = CoinbaseDataSource() - private var items: [ServiceItem] = [] + private var items: [ServiceItem] = [ + .init(status: .idle, service: .topper) // Topper item doesn't need a data source + ] + + init() { + initializeDataSources() + } func listenForData(handler: @escaping (([ServiceItem]) -> Void)) { self.handler = handler @@ -56,17 +59,14 @@ class ServiceDataProviderImpl: ServiceDataProvider { coinbaseDataSource.refresh() } - func initializeDataSources() { - updateService(with: .init(status: .idle, service: .topper)) // Topper item doesn't need a data source) - - // Disabled due to App Store review hold-up -// upholdDataSource.serviceDidUpdate = { [weak self] item in -// self?.updateService(with: item) -// } -// -// coinbaseDataSource.serviceDidUpdate = { [weak self] item in -// self?.updateService(with: item) -// } + private func initializeDataSources() { + upholdDataSource.serviceDidUpdate = { [weak self] item in + self?.updateService(with: item) + } + + coinbaseDataSource.serviceDidUpdate = { [weak self] item in + self?.updateService(with: item) + } } private func updateService(with item: ServiceItem) { diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index aaf0e423a..a2b6d3417 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -116,6 +116,7 @@ static const bool _SNAPSHOT = 0; #import "DWSeedPhraseModel.h" #import "UIImage+Utils.h" #import "NSData+Dash.h" +#import "DSChain+DashWallet.h" //MARK: Tabbar #import "DWHomeViewController.h"