From fb2d577e650aa897f34b348b23f9289727677bae Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Sat, 16 Nov 2024 15:30:45 +0700 Subject: [PATCH] feat: dynamic crowdnode fees --- DashSyncCurrentCommit | 2 +- DashWallet.xcodeproj/project.pbxproj | 100 +++++++++--------- .../Sources/Categories/DSChain+DashWallet.m | 13 +-- .../Models/CrowdNode/API/CrowdNodeAPI.swift | 20 ---- .../CrowdNode/API/CrowdNodeEndpoint.swift | 8 +- .../Models/CrowdNode/API/DTOs/FeeInfo.swift | 46 ++++++++ .../CrowdNode/CrowdNode+Constants.swift | 1 + .../CrowdNode/CrowdNode+UserDefaults.swift | 10 ++ .../Sources/Models/CrowdNode/CrowdNode.swift | 21 +++- .../Services/CrowdNodeWebService.swift | 4 + DashWallet/Sources/Models/DWGlobalOptions.m | 2 +- .../UI/CrowdNode/Views/CrowdNodeAPYView.swift | 2 +- Podfile.lock | 14 ++- 13 files changed, 156 insertions(+), 87 deletions(-) delete mode 100644 DashWallet/Sources/Models/CrowdNode/API/CrowdNodeAPI.swift create mode 100644 DashWallet/Sources/Models/CrowdNode/API/DTOs/FeeInfo.swift diff --git a/DashSyncCurrentCommit b/DashSyncCurrentCommit index 9a1806aff..8e620c641 100644 --- a/DashSyncCurrentCommit +++ b/DashSyncCurrentCommit @@ -1 +1 @@ -751595434308e0761cceb15b428a41ca5eefdb8b +1828f755c499de14261343e0426c83f2aa88a9bd diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index ae25303c8..d8ea589ee 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -47,7 +47,6 @@ 114CFED2296489CD005F421B /* MinimumDepositBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114CFED1296489CD005F421B /* MinimumDepositBanner.swift */; }; 114D16B629812730009A124C /* OnlineAccountDetailsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114D16B529812730009A124C /* OnlineAccountDetailsController.swift */; }; 114D16B829828BCC009A124C /* OnlineAccountConfirmationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114D16B729828BCC009A124C /* OnlineAccountConfirmationController.swift */; }; - 11517C832949E6A3004FC7BF /* CrowdNodeAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11517C822949E6A3004FC7BF /* CrowdNodeAPI.swift */; }; 11517C852949E6F0004FC7BF /* CrowdNodeEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11517C842949E6F0004FC7BF /* CrowdNodeEndpoint.swift */; }; 11517C87294B0FED004FC7BF /* CrowdNodeWebService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11517C86294B0FED004FC7BF /* CrowdNodeWebService.swift */; }; 11517C8A294B11DD004FC7BF /* CrowdNodeBalance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11517C89294B11DD004FC7BF /* CrowdNodeBalance.swift */; }; @@ -565,6 +564,8 @@ 755C32392C358FC0007DA721 /* BackupSeedPhraseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755C32372C358FBD007DA721 /* BackupSeedPhraseViewController.swift */; }; 755E6DFE2A99E7A000A42870 /* DWInvitationSetupState.m in Sources */ = {isa = PBXBuildFile; fileRef = 755E6DFC2A99E7A000A42870 /* DWInvitationSetupState.m */; }; 756188212B1EE78A00B778E3 /* DPVotingResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756188202B1EE78A00B778E3 /* DPVotingResultView.swift */; }; + 756557B52CE84FFA0060348D /* FeeInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756557B42CE84FF70060348D /* FeeInfo.swift */; }; + 756557B62CE84FFA0060348D /* FeeInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756557B42CE84FF70060348D /* FeeInfo.swift */; }; 7565D5952B08B35F0092C9BA /* RequestUsernameViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7565D5942B08B35F0092C9BA /* RequestUsernameViewModel.swift */; }; 7566F4832BB6949E005238D2 /* ToolsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7566F4822BB69498005238D2 /* ToolsMenuViewController.swift */; }; 7566F4842BB6949E005238D2 /* ToolsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7566F4822BB69498005238D2 /* ToolsMenuViewController.swift */; }; @@ -940,7 +941,6 @@ C9D2C6972A320AA000D15901 /* DWBiometricAuthViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A44314622CF82D9009BAF7F /* DWBiometricAuthViewController.m */; }; C9D2C6982A320AA000D15901 /* CrowdNodeWebService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11517C86294B0FED004FC7BF /* CrowdNodeWebService.swift */; }; C9D2C6992A320AA000D15901 /* DWStartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB231D12196E25D00A6E7E6 /* DWStartViewController.m */; }; - C9D2C69A2A320AA000D15901 /* CrowdNodeAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11517C822949E6A3004FC7BF /* CrowdNodeAPI.swift */; }; C9D2C69B2A320AA000D15901 /* DWStartModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB231D62196E5CF00A6E7E6 /* DWStartModel.m */; }; C9D2C69C2A320AA000D15901 /* DWAdvancedSecurityModelStub.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB3417923A929B6004E37A7 /* DWAdvancedSecurityModelStub.m */; }; C9D2C69D2A320AA000D15901 /* Foundation+Bitcoin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4709C32028818D5400B4BD48 /* Foundation+Bitcoin.swift */; }; @@ -1040,7 +1040,7 @@ C9D2C70C2A320AA000D15901 /* DWUpholdLogoutTutorialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A9FFE652230FF4600956D5F /* DWUpholdLogoutTutorialViewController.m */; }; C9D2C70D2A320AA000D15901 /* CBAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47CF46A429654E190067B6EE /* CBAccount.swift */; }; C9D2C70E2A320AA000D15901 /* Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AF180429070B720025803E /* Types.swift */; }; - C9D2C70F2A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C70F2A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C7112A320AA000D15901 /* Coinbase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4774DCDA28F3FA9C008CF87D /* Coinbase.swift */; }; C9D2C7122A320AA000D15901 /* SyncModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F452072A11F28600825057 /* SyncModel.swift */; }; C9D2C7132A320AA000D15901 /* ReceiveContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FAA29DC1098001BC549 /* ReceiveContentView.swift */; }; @@ -1060,7 +1060,7 @@ C9D2C7242A320AA000D15901 /* WKWebView+CrowdNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 110D1780298BA9AF005BEB30 /* WKWebView+CrowdNode.swift */; }; C9D2C7252A320AA000D15901 /* SyncingActivityMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47FA3AFE29350929008D58DC /* SyncingActivityMonitor.swift */; }; C9D2C7262A320AA000D15901 /* EmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FAF29DC27F4001BC549 /* EmptyView.swift */; }; - C9D2C7272A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C7272A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C7282A320AA000D15901 /* DWQRScanModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AC92C891FEB0B8B008CAEE0 /* DWQRScanModel.m */; }; C9D2C72A2A320AA000D15901 /* SyncView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F451F62A0CAE1300825057 /* SyncView.swift */; }; C9D2C72B2A320AA000D15901 /* SuccessfulOperationStatusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47522F4F2927CB9000EE143E /* SuccessfulOperationStatusViewController.swift */; }; @@ -1092,7 +1092,7 @@ C9D2C7492A320AA000D15901 /* DWCurrencyObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AA87CF926E5681100F0CEA6 /* DWCurrencyObject.m */; }; C9D2C74A2A320AA000D15901 /* ShortcutsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94F5E8F29D4060A0034FD57 /* ShortcutsView.swift */; }; C9D2C74B2A320AA000D15901 /* DWFormSectionModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A9FFE3E2230FF4600956D5F /* DWFormSectionModel.m */; }; - C9D2C74C2A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C74C2A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C74D2A320AA000D15901 /* CoinbasePlaceBuyOrderResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6EDFA628C896BC000427E7 /* CoinbasePlaceBuyOrderResponse.swift */; }; C9D2C74E2A320AA000D15901 /* ExploreMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8BDC28C1305E00490F5E /* ExploreMapView.swift */; }; C9D2C74F2A320AA000D15901 /* DWSeedPhraseRow.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AD1CE9322DD078600C99324 /* DWSeedPhraseRow.m */; }; @@ -1116,7 +1116,7 @@ C9D2C7642A320AA000D15901 /* BasePageSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47F2C67C28602D4F00C2B774 /* BasePageSheetViewController.swift */; }; C9D2C7662A320AA000D15901 /* CrowdNodeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 119E8D0329051F9900D406C1 /* CrowdNodeRequest.swift */; }; C9D2C7672A320AA000D15901 /* CoinbaseExchangeRateResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6EDFAF28C896BC000427E7 /* CoinbaseExchangeRateResponse.swift */; }; - C9D2C7692A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C7692A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C76A2A320AA000D15901 /* CrowdNodePortalItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 117728A2297A7D24006F1553 /* CrowdNodePortalItem.swift */; }; C9D2C76B2A320AA000D15901 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C661B528FE75A700028A8D /* BaseViewController.swift */; }; C9D2C76C2A320AA000D15901 /* AccountListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751CABF296EFD2900F63AC4 /* AccountListController.swift */; }; @@ -1168,13 +1168,13 @@ C9D2C7A62A320AA000D15901 /* PointOfUseInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8C1028C5430300490F5E /* PointOfUseInfoViewController.swift */; }; C9D2C7A72A320AA000D15901 /* ActionButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C661B328FDCF7800028A8D /* ActionButtonViewController.swift */; }; C9D2C7A82A320AA000D15901 /* BuySellServiceItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4774DCE428F4668B008CF87D /* BuySellServiceItemCell.swift */; }; - C9D2C7AA2A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C7AA2A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C7AB2A320AA000D15901 /* DWBaseFormTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */; }; C9D2C7AC2A320AA000D15901 /* AccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751CAC6296FAEBB00F63AC4 /* AccountCell.swift */; }; C9D2C7AD2A320AA000D15901 /* DWTransactionListDataProviderStub.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A913EA723A79AD2006A2A59 /* DWTransactionListDataProviderStub.m */; }; C9D2C7B02A320AA000D15901 /* DWExploreHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8BE128C1305E00490F5E /* DWExploreHeaderView.m */; }; C9D2C7B12A320AA000D15901 /* CoinbaseBaseIDForCurrencyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6EDFA028C896BC000427E7 /* CoinbaseBaseIDForCurrencyResponse.swift */; }; - C9D2C7B22A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C7B22A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C7B32A320AA000D15901 /* SpecifyAmountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AC8412297822E000BD1B49 /* SpecifyAmountViewController.swift */; }; C9D2C7B42A320AA000D15901 /* DWUpholdTransactionObject+DWView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AFCB9C323BE76EC00FF59A6 /* DWUpholdTransactionObject+DWView.m */; }; C9D2C7B62A320AA000D15901 /* CrowdNodeDepositTx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114CFECF296469D9005F421B /* CrowdNodeDepositTx.swift */; }; @@ -1187,7 +1187,7 @@ C9D2C7BF2A320AA000D15901 /* TerritoriesListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A50F3D29192F8D00C70123 /* TerritoriesListViewController.swift */; }; C9D2C7C02A320AA000D15901 /* HomeHeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F4520A2A1209D100825057 /* HomeHeaderModel.swift */; }; C9D2C7C12A320AA000D15901 /* TerritoryListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C6E6DF2919578C003FEDF2 /* TerritoryListModel.swift */; }; - C9D2C7C22A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C7C22A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C7C32A320AA000D15901 /* DWDPRegistrationStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AFF01DA243F4559003718DC /* DWDPRegistrationStatus.m */; }; C9D2C7C42A320AA000D15901 /* CurrencyExchanger_Objc.m in Sources */ = {isa = PBXBuildFile; fileRef = 472D13EC299E6579006903F1 /* CurrencyExchanger_Objc.m */; }; C9D2C7C52A320AA000D15901 /* GiftCardInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8C0D28C540C100490F5E /* GiftCardInfoViewController.swift */; }; @@ -1195,7 +1195,7 @@ C9D2C7C72A320AA000D15901 /* BuySellPortalModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478A2C7028DC554200AD1420 /* BuySellPortalModel.swift */; }; C9D2C7C92A320AA000D15901 /* BuyDashViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478C98252942DC2700FAA0F0 /* BuyDashViewController.swift */; }; C9D2C7CA2A320AA000D15901 /* DWModalDismissalAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A0C69CF23143435001B8C90 /* DWModalDismissalAnimation.m */; }; - C9D2C7CB2A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C7CB2A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C7CD2A320AA000D15901 /* UIViewController+DashWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47CDEECD294A3CF2008AE06D /* UIViewController+DashWallet.swift */; }; C9D2C7CE2A320AA000D15901 /* CrowdNodeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470617D5299A671900DCC667 /* CrowdNodeCell.swift */; }; C9D2C7CF2A320AA000D15901 /* MerchantListLocationOffCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8BD128C1305E00490F5E /* MerchantListLocationOffCell.swift */; }; @@ -1299,7 +1299,7 @@ C9D2C8472A320AA000D15901 /* DWBaseTransactionListDataProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A913EAD23A7AC86006A2A59 /* DWBaseTransactionListDataProvider.m */; }; C9D2C8482A320AA000D15901 /* CoinbaseTransactionsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6EDFA828C896BC000427E7 /* CoinbaseTransactionsRequest.swift */; }; C9D2C8492A320AA000D15901 /* DWAppRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A9CEBAC22E1DA4000A50237 /* DWAppRootViewController.m */; }; - C9D2C84A2A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C84A2A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C84B2A320AA000D15901 /* UITableView+DashWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47F005FE297164600029EB10 /* UITableView+DashWallet.swift */; }; C9D2C84C2A320AA000D15901 /* TransferAmountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C661B128FDC72700028A8D /* TransferAmountViewController.swift */; }; C9D2C84D2A320AA000D15901 /* ShortcutCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94F5E8D29D404850034FD57 /* ShortcutCell.swift */; }; @@ -1324,7 +1324,7 @@ C9D2C8642A320AA000D15901 /* AppliedFiltersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C6E6E4291A68B6003FEDF2 /* AppliedFiltersView.swift */; }; C9D2C8652A320AA000D15901 /* DWCaptureSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */; }; C9D2C8662A320AA000D15901 /* DWDataMigrationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A11F59E2194BD6200E7B563 /* DWDataMigrationManager.m */; }; - C9D2C86A2A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C86A2A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C86B2A320AA000D15901 /* AmountPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472D13E5299E3C81006903F1 /* AmountPreviewView.swift */; }; C9D2C86C2A320AA000D15901 /* ModalNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4759D513292FEFFB002F20DC /* ModalNavigationController.swift */; }; C9D2C86E2A320AA000D15901 /* TransferAmountModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A50F3A2913BC0900C70123 /* TransferAmountModel.swift */; }; @@ -1359,7 +1359,7 @@ C9D2C8952A320AA000D15901 /* ConvertCryptoOrderPreviewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751CACF2970224D00F63AC4 /* ConvertCryptoOrderPreviewModel.swift */; }; C9D2C8972A320AA000D15901 /* RatesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A2E3A82972B15F0032A63B /* RatesProvider.swift */; }; C9D2C8982A320AA000D15901 /* CBAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A2A2E8293E612900938DB7 /* CBAuth.swift */; }; - C9D2C8992A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C8992A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C89A2A320AA000D15901 /* CoinbaseCreateAddressesRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6EDFAE28C896BC000427E7 /* CoinbaseCreateAddressesRequest.swift */; }; C9D2C89B2A320AA000D15901 /* DWImportWalletInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A10EB342358996700C38B61 /* DWImportWalletInfoViewController.m */; }; C9D2C89D2A320AA000D15901 /* SyncingAlertContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F451ED2A0BF1F500825057 /* SyncingAlertContentView.swift */; }; @@ -1414,7 +1414,7 @@ C9D2C8DD2A320AA000D15901 /* AtmDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8BD528C1305E00490F5E /* AtmDataProvider.swift */; }; C9D2C8DE2A320AA000D15901 /* GettingStartedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 110C67942921147F006B580C /* GettingStartedViewController.swift */; }; C9D2C8DF2A320AA000D15901 /* NetworkUnavailableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477A963D292CD27D0013605B /* NetworkUnavailableView.swift */; }; - C9D2C8E02A320AA000D15901 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + C9D2C8E02A320AA000D15901 /* (null) in Sources */ = {isa = PBXBuildFile; }; C9D2C8E12A320AA000D15901 /* DWLockScreenViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A63004D2328F37C00827825 /* DWLockScreenViewController.m */; }; C9D2C8E22A320AA000D15901 /* UpholdTransferViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4789D2302981069700BAFEFA /* UpholdTransferViewController.swift */; }; C9D2C8E32A320AA000D15901 /* DWVerifySeedPhraseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AD1CE8322DC9B5D00C99324 /* DWVerifySeedPhraseViewController.m */; }; @@ -1478,7 +1478,7 @@ C9D2C9272A320AA000D15901 /* SyncView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4E531922EA382B00E5168A /* SyncView.xib */; }; C9D2C9292A320AA000D15901 /* BackupInfoItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9F42FB529DD8702001BC549 /* BackupInfoItemView.xib */; }; C9D2C92A2A320AA000D15901 /* explore.db in Resources */ = {isa = PBXBuildFile; fileRef = 47AE8BAF28BFF28400490F5E /* explore.db */; }; - C9D2C92B2A320AA000D15901 /* BuildFile in Resources */ = {isa = PBXBuildFile; }; + C9D2C92B2A320AA000D15901 /* (null) in Resources */ = {isa = PBXBuildFile; }; C9D2C92C2A320AA000D15901 /* Coinbase.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0F3693812919A70B007F4E91 /* Coinbase.storyboard */; }; C9D2C92E2A320AA000D15901 /* ImportWalletInfo.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A10EB3D2358BDA500C38B61 /* ImportWalletInfo.storyboard */; }; C9D2C92F2A320AA000D15901 /* ReceiveContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9F42FAC29DC115A001BC549 /* ReceiveContentView.xib */; }; @@ -1536,7 +1536,7 @@ C9FAABB52AB793CE00878224 /* BuySellPortal.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9FAABB42AB793CE00878224 /* BuySellPortal.storyboard */; }; C9FAABB72AB799AE00878224 /* UpholdPortalModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9FAABB62AB799AE00878224 /* UpholdPortalModel.swift */; }; CC5F88E358330F8EE192D5BE /* libPods-DashWalletScreenshotsUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0CDD4C961516ED20BC9F01FA /* libPods-DashWalletScreenshotsUITests.a */; }; - DE3A167A235B79D705C0A962 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; + DE3A167A235B79D705C0A962 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; FB248B5D1F73803100405AE0 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB248B5C1F73803100405AE0 /* UserNotifications.framework */; }; FB248B631F79BB7C00405AE0 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB248B621F79BB7C00405AE0 /* SafariServices.framework */; }; FB2E5537218BA161003A1B7C /* DWVersionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB2E5536218BA161003A1B7C /* DWVersionManager.m */; }; @@ -1672,7 +1672,6 @@ 114CFED1296489CD005F421B /* MinimumDepositBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MinimumDepositBanner.swift; sourceTree = ""; }; 114D16B529812730009A124C /* OnlineAccountDetailsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnlineAccountDetailsController.swift; sourceTree = ""; }; 114D16B729828BCC009A124C /* OnlineAccountConfirmationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnlineAccountConfirmationController.swift; sourceTree = ""; }; - 11517C822949E6A3004FC7BF /* CrowdNodeAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrowdNodeAPI.swift; sourceTree = ""; }; 11517C842949E6F0004FC7BF /* CrowdNodeEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrowdNodeEndpoint.swift; sourceTree = ""; }; 11517C86294B0FED004FC7BF /* CrowdNodeWebService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrowdNodeWebService.swift; sourceTree = ""; }; 11517C89294B11DD004FC7BF /* CrowdNodeBalance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrowdNodeBalance.swift; sourceTree = ""; }; @@ -2442,6 +2441,7 @@ 755E6DFC2A99E7A000A42870 /* DWInvitationSetupState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWInvitationSetupState.m; sourceTree = ""; }; 755E6DFD2A99E7A000A42870 /* DWInvitationSetupState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWInvitationSetupState.h; sourceTree = ""; }; 756188202B1EE78A00B778E3 /* DPVotingResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DPVotingResultView.swift; sourceTree = ""; }; + 756557B42CE84FF70060348D /* FeeInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeeInfo.swift; sourceTree = ""; }; 7565D5942B08B35F0092C9BA /* RequestUsernameViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestUsernameViewModel.swift; sourceTree = ""; }; 7566F4822BB69498005238D2 /* ToolsMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolsMenuViewController.swift; sourceTree = ""; }; 7566F4892BB6CAF2005238D2 /* MenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuItem.swift; sourceTree = ""; }; @@ -3114,7 +3114,7 @@ 222E7F561C46E9B8009AB45D /* Security.framework in Frameworks */, 222040C61C1A1940005CE1C3 /* WebKit.framework in Frameworks */, 22B6A4481C0E963900673913 /* libbz2.tbd in Frameworks */, - DE3A167A235B79D705C0A962 /* BuildFile in Frameworks */, + DE3A167A235B79D705C0A962 /* (null) in Frameworks */, A90D08EA4AA9019A2D806A9C /* libPods-dashwallet.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3331,7 +3331,6 @@ isa = PBXGroup; children = ( 11517C88294B11CE004FC7BF /* DTOs */, - 11517C822949E6A3004FC7BF /* CrowdNodeAPI.swift */, 11517C842949E6F0004FC7BF /* CrowdNodeEndpoint.swift */, ); path = API; @@ -3340,6 +3339,7 @@ 11517C88294B11CE004FC7BF /* DTOs */ = { isa = PBXGroup; children = ( + 756557B42CE84FF70060348D /* FeeInfo.swift */, 11517C89294B11DD004FC7BF /* CrowdNodeBalance.swift */, 111C3C4D296C52F800788E18 /* WithdrawalLimit.swift */, 1186092029758B2F00279FCC /* IsAddressInUse.swift */, @@ -7999,7 +7999,7 @@ C9D2C9272A320AA000D15901 /* SyncView.xib in Resources */, C9D2C9292A320AA000D15901 /* BackupInfoItemView.xib in Resources */, C9D2C92A2A320AA000D15901 /* explore.db in Resources */, - C9D2C92B2A320AA000D15901 /* BuildFile in Resources */, + C9D2C92B2A320AA000D15901 /* (null) in Resources */, C9D2C92C2A320AA000D15901 /* Coinbase.storyboard in Resources */, 75889B892AD2DF0200C17F5D /* CoinJoin.storyboard in Resources */, C9D2C92E2A320AA000D15901 /* ImportWalletInfo.storyboard in Resources */, @@ -8446,7 +8446,6 @@ 11517C87294B0FED004FC7BF /* CrowdNodeWebService.swift in Sources */, 75EBAA1D2BBA71D9004488E3 /* ZenLedgerInfoSheet.swift in Sources */, 2A4E531422E9F0A200E5168A /* DWStartViewController.m in Sources */, - 11517C832949E6A3004FC7BF /* CrowdNodeAPI.swift in Sources */, 2A4E531522E9F0A200E5168A /* DWStartModel.m in Sources */, 2AB3417A23A929B6004E37A7 /* DWAdvancedSecurityModelStub.m in Sources */, 4709C32128818D5400B4BD48 /* Foundation+Bitcoin.swift in Sources */, @@ -8539,6 +8538,7 @@ 47F2C6842860513900C2B774 /* TxReclassifyTransactionsWhereToChangeViewController.swift in Sources */, 2A7A7C16234B763600451078 /* DWLocalCurrencyViewController.m in Sources */, C9F451FD2A0CC4A300825057 /* BadgeView.swift in Sources */, + 756557B52CE84FFA0060348D /* FeeInfo.swift in Sources */, C9F451F52A0CAC9400825057 /* HomeHeaderView.swift in Sources */, C9F451F92A0CB08900825057 /* ProgressView.swift in Sources */, 2A2120EA2214566A009906DC /* DWAmountInputValidator.m in Sources */, @@ -9049,7 +9049,6 @@ 75A8C1652AE5726B0042256E /* UsernameRequestsDAO.swift in Sources */, C9D2C6992A320AA000D15901 /* DWStartViewController.m in Sources */, C943B4C02A40A54600AF23C5 /* DWContactsSearchInfoHeaderView.m in Sources */, - C9D2C69A2A320AA000D15901 /* CrowdNodeAPI.swift in Sources */, C9D2C69B2A320AA000D15901 /* DWStartModel.m in Sources */, 754495DD2AE91B6300492817 /* GroupedRequestCell.swift in Sources */, C9D2C69C2A320AA000D15901 /* DWAdvancedSecurityModelStub.m in Sources */, @@ -9208,7 +9207,7 @@ 75A8C1672AE5734A0042256E /* UsernameRequest.swift in Sources */, C9D2C70D2A320AA000D15901 /* CBAccount.swift in Sources */, C9D2C70E2A320AA000D15901 /* Types.swift in Sources */, - C9D2C70F2A320AA000D15901 /* BuildFile in Sources */, + C9D2C70F2A320AA000D15901 /* (null) in Sources */, C943B33B2A408CED00AF23C5 /* DWUploadAvatarChildView.m in Sources */, C9D2C7112A320AA000D15901 /* Coinbase.swift in Sources */, C9D2C7122A320AA000D15901 /* SyncModel.swift in Sources */, @@ -9238,7 +9237,7 @@ C9D2C7242A320AA000D15901 /* WKWebView+CrowdNode.swift in Sources */, C9D2C7252A320AA000D15901 /* SyncingActivityMonitor.swift in Sources */, C9D2C7262A320AA000D15901 /* EmptyView.swift in Sources */, - C9D2C7272A320AA000D15901 /* BuildFile in Sources */, + C9D2C7272A320AA000D15901 /* (null) in Sources */, C9D2C7282A320AA000D15901 /* DWQRScanModel.m in Sources */, C943B3292A408CED00AF23C5 /* DWExternalSourceViewController.m in Sources */, C9D2C72A2A320AA000D15901 /* SyncView.swift in Sources */, @@ -9293,7 +9292,7 @@ C943B50B2A40A54600AF23C5 /* DWDPSearchItemsFactory.m in Sources */, C9D2C74A2A320AA000D15901 /* ShortcutsView.swift in Sources */, C9D2C74B2A320AA000D15901 /* DWFormSectionModel.m in Sources */, - C9D2C74C2A320AA000D15901 /* BuildFile in Sources */, + C9D2C74C2A320AA000D15901 /* (null) in Sources */, C9D2C74D2A320AA000D15901 /* CoinbasePlaceBuyOrderResponse.swift in Sources */, C9D2C74E2A320AA000D15901 /* ExploreMapView.swift in Sources */, C943B32F2A408CED00AF23C5 /* DWSaveAlertViewController.m in Sources */, @@ -9335,7 +9334,7 @@ C9D2C7662A320AA000D15901 /* CrowdNodeRequest.swift in Sources */, 75EBAA0A2BB9791B004488E3 /* Icon.swift in Sources */, C9D2C7672A320AA000D15901 /* CoinbaseExchangeRateResponse.swift in Sources */, - C9D2C7692A320AA000D15901 /* BuildFile in Sources */, + C9D2C7692A320AA000D15901 /* (null) in Sources */, C9D2C76A2A320AA000D15901 /* CrowdNodePortalItem.swift in Sources */, C943B4C82A40A54600AF23C5 /* DWSearchStateViewController.m in Sources */, C9D2C76B2A320AA000D15901 /* BaseViewController.swift in Sources */, @@ -9419,7 +9418,7 @@ C9D2C7A72A320AA000D15901 /* ActionButtonViewController.swift in Sources */, C9D2C7A82A320AA000D15901 /* BuySellServiceItemCell.swift in Sources */, C956AF122A5B5949002FAB75 /* PasteboardContentView.swift in Sources */, - C9D2C7AA2A320AA000D15901 /* BuildFile in Sources */, + C9D2C7AA2A320AA000D15901 /* (null) in Sources */, C943B5002A40A54600AF23C5 /* DWDPTxItemView.m in Sources */, C9D2C7AB2A320AA000D15901 /* DWBaseFormTableViewCell.m in Sources */, C9D2C7AC2A320AA000D15901 /* AccountCell.swift in Sources */, @@ -9430,9 +9429,10 @@ C9D2C7B02A320AA000D15901 /* DWExploreHeaderView.m in Sources */, 759609242C455B2000F3BF04 /* SendIntro.swift in Sources */, C9D2C7B12A320AA000D15901 /* CoinbaseBaseIDForCurrencyResponse.swift in Sources */, - C9D2C7B22A320AA000D15901 /* BuildFile in Sources */, + C9D2C7B22A320AA000D15901 /* (null) in Sources */, C9D2C7B32A320AA000D15901 /* SpecifyAmountViewController.swift in Sources */, C943B4EA2A40A54600AF23C5 /* DWUserProfileViewController.m in Sources */, + 756557B62CE84FFA0060348D /* FeeInfo.swift in Sources */, C943B5922A40ED7B00AF23C5 /* DWTextField.m in Sources */, 75EBAA0D2BB9792F004488E3 /* FeatureTopText.swift in Sources */, C9D2C7B42A320AA000D15901 /* DWUpholdTransactionObject+DWView.m in Sources */, @@ -9452,7 +9452,7 @@ C9D2C7C02A320AA000D15901 /* HomeHeaderModel.swift in Sources */, C943B5942A40ED7B00AF23C5 /* DWPlanetarySystemView.m in Sources */, C9D2C7C12A320AA000D15901 /* TerritoryListModel.swift in Sources */, - C9D2C7C22A320AA000D15901 /* BuildFile in Sources */, + C9D2C7C22A320AA000D15901 /* (null) in Sources */, C9D2C7C32A320AA000D15901 /* DWDPRegistrationStatus.m in Sources */, C9D2C7C42A320AA000D15901 /* CurrencyExchanger_Objc.m in Sources */, 7573C2E12B01103900F4C347 /* VotingFilterItemSelectableCell.swift in Sources */, @@ -9465,7 +9465,7 @@ C9D2C7C92A320AA000D15901 /* BuyDashViewController.swift in Sources */, C956AF0D2A5B592E002FAB75 /* TappableLabel.swift in Sources */, C9D2C7CA2A320AA000D15901 /* DWModalDismissalAnimation.m in Sources */, - C9D2C7CB2A320AA000D15901 /* BuildFile in Sources */, + C9D2C7CB2A320AA000D15901 /* (null) in Sources */, C9D2C7CD2A320AA000D15901 /* UIViewController+DashWallet.swift in Sources */, C9D2C7CE2A320AA000D15901 /* CrowdNodeCell.swift in Sources */, 751B61C62ADFFD0A00D1C2EF /* IntegrationViewController+Coinbase.swift in Sources */, @@ -9619,7 +9619,7 @@ 75A664D82B09F1EA007EFD16 /* VotingInfoViewController.swift in Sources */, C943B3372A408CED00AF23C5 /* DWEditProfileTextFieldCell.m in Sources */, C9D2C8492A320AA000D15901 /* DWAppRootViewController.m in Sources */, - C9D2C84A2A320AA000D15901 /* BuildFile in Sources */, + C9D2C84A2A320AA000D15901 /* (null) in Sources */, 7513DA882AB175E0005D55F6 /* TopperViewModel.swift in Sources */, C9D2C84B2A320AA000D15901 /* UITableView+DashWallet.swift in Sources */, C9D2C84C2A320AA000D15901 /* TransferAmountViewController.swift in Sources */, @@ -9652,7 +9652,7 @@ C9D2C8652A320AA000D15901 /* DWCaptureSessionManager.m in Sources */, C9D2C8662A320AA000D15901 /* DWDataMigrationManager.m in Sources */, 7502A4872AE401EF00ACDDD3 /* UsernameVotingViewController.swift in Sources */, - C9D2C86A2A320AA000D15901 /* BuildFile in Sources */, + C9D2C86A2A320AA000D15901 /* (null) in Sources */, C943B51F2A40A54600AF23C5 /* DWSuccessInvitationView.m in Sources */, C9D2C86B2A320AA000D15901 /* AmountPreviewView.swift in Sources */, 75CDD7812C0898E400F433D2 /* Shape.swift in Sources */, @@ -9709,7 +9709,7 @@ C9D2C8972A320AA000D15901 /* RatesProvider.swift in Sources */, C9D2C8982A320AA000D15901 /* CBAuth.swift in Sources */, C943B51C2A40A54600AF23C5 /* SuccessInvitationViewController.swift in Sources */, - C9D2C8992A320AA000D15901 /* BuildFile in Sources */, + C9D2C8992A320AA000D15901 /* (null) in Sources */, C9D2C89A2A320AA000D15901 /* CoinbaseCreateAddressesRequest.swift in Sources */, C943B3382A408CED00AF23C5 /* DWEditProfileAvatarView.m in Sources */, C943B5582A40DA3700AF23C5 /* DWFullScreenModalControllerViewController.m in Sources */, @@ -9792,7 +9792,7 @@ C943B50E2A40A54600AF23C5 /* DWConfirmInvitationContentView.m in Sources */, C9D2C8DE2A320AA000D15901 /* GettingStartedViewController.swift in Sources */, C9D2C8DF2A320AA000D15901 /* NetworkUnavailableView.swift in Sources */, - C9D2C8E02A320AA000D15901 /* BuildFile in Sources */, + C9D2C8E02A320AA000D15901 /* (null) in Sources */, 751B61C32ADFF9AE00D1C2EF /* UpholdPortalModel.swift in Sources */, C943B4FC2A40A54600AF23C5 /* DWDPEstablishedContactNotificationObject.m in Sources */, C9D2C8E12A320AA000D15901 /* DWLockScreenViewController.m in Sources */, @@ -10258,7 +10258,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -10398,7 +10398,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -10572,7 +10572,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -10594,7 +10594,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -10619,7 +10619,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -10646,7 +10646,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -10678,7 +10678,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -10707,7 +10707,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -11386,7 +11386,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -11499,7 +11499,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -11555,7 +11555,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -11580,7 +11580,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -11697,7 +11697,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -11809,7 +11809,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -11864,7 +11864,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -11889,7 +11889,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.2.0; + MARKETING_VERSION = 8.2.3; 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 e930a899e..a9b75238f 100644 --- a/DashWallet/Sources/Categories/DSChain+DashWallet.m +++ b/DashWallet/Sources/Categories/DSChain+DashWallet.m @@ -20,9 +20,9 @@ #import "DSChainsManager.h" #import "DSCheckpoint.h" #import "DSMasternodeManager.h" +#import "DSSimplifiedMasternodeEntry.h" #import "NSDate+Utils.h" #import -#import "DSSimplifiedMasternodeEntry.h" NS_ASSUME_NONNULL_BEGIN @@ -91,17 +91,18 @@ - (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 { + } + else { virtualMNCount += 1; } } @@ -188,14 +189,14 @@ - (uint64_t)calculateMasternodePaymentWithHeight:(uint64_t)height blockReward:(u // Activated but we have to wait for the next cycle to start realocation, nothing to do return ret; } - + if ([self isCore20ActiveAtHeight:height]) { // Once MNRewardReallocated activates, block reward is 80% of block subsidy (+ tx fees) since treasury is 20% // Since the MN reward needs to be equal to 60% of the block subsidy (according to the proposal), MN reward is set to 75% of the block reward. // Previous reallocation periods are dropped. return blockReward * 3 / 4; } - + NSUInteger reallocCycle = superblockCycle * 3; NSUInteger nCurrentPeriod = MIN((height - reallocStart) / reallocCycle, periodsCount - 1); return (blockReward * periods[nCurrentPeriod]) / 1000; diff --git a/DashWallet/Sources/Models/CrowdNode/API/CrowdNodeAPI.swift b/DashWallet/Sources/Models/CrowdNode/API/CrowdNodeAPI.swift deleted file mode 100644 index dcd520648..000000000 --- a/DashWallet/Sources/Models/CrowdNode/API/CrowdNodeAPI.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// Created by Andrei Ashikhmin -// Copyright © 2022 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. -// - -final class CrowdNodeAPI: HTTPClient { - static let shared = CrowdNodeAPI() -} diff --git a/DashWallet/Sources/Models/CrowdNode/API/CrowdNodeEndpoint.swift b/DashWallet/Sources/Models/CrowdNode/API/CrowdNodeEndpoint.swift index 6eb001742..64de5a96a 100644 --- a/DashWallet/Sources/Models/CrowdNode/API/CrowdNodeEndpoint.swift +++ b/DashWallet/Sources/Models/CrowdNode/API/CrowdNodeEndpoint.swift @@ -33,6 +33,7 @@ public enum CrowdNodeEndpoint { case hasDefaultEmail(String) case sendSignedMessage(address: String, message: String, signature: String, messagetype: MessageType) case getMessages(String) + case getFees(String) } // MARK: TargetType @@ -53,9 +54,10 @@ extension CrowdNodeEndpoint: TargetType { case .hasDefaultEmail(let address): return "odata/apiaddresses/UsingDefaultApiEmail(address='\(address)')" case .sendSignedMessage(let address, let message, let signature, let messagetype): return "odata/apimessages/SendMessage(address='\(address)',message='\(message)',signature='\(signature)',messagetype=\(messagetype.rawValue))" case .getMessages(let address): return "odata/apimessages/GetMessages(address='\(address)')" + case .getFees(let address): return "odata/apifundings/GetFeeJson(address='\(address)')" } } - + public var method: Moya.Method { .get } @@ -68,3 +70,7 @@ extension CrowdNodeEndpoint: TargetType { [:] } } + +final class CrowdNodeAPI: HTTPClient { + static let shared = CrowdNodeAPI() +} diff --git a/DashWallet/Sources/Models/CrowdNode/API/DTOs/FeeInfo.swift b/DashWallet/Sources/Models/CrowdNode/API/DTOs/FeeInfo.swift new file mode 100644 index 000000000..59827bdb3 --- /dev/null +++ b/DashWallet/Sources/Models/CrowdNode/API/DTOs/FeeInfo.swift @@ -0,0 +1,46 @@ +// +// Created by 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. +// + +private let kDefaultAmount = 100.0 +private let kTypeNormal = "Normal" + +struct FeeInfo: Codable { + static let empty = FeeInfo(feeLadder: [FeeLadder.empty]) + let feeLadder: [FeeLadder] + + enum CodingKeys: String, CodingKey { + case feeLadder = "FeeLadder" + } + + func getNormalFee() -> FeeLadder? { + return feeLadder.first { $0.type == kTypeNormal } + } +} + +struct FeeLadder: Codable { + let name: String + let type: String + let amount: Double + let fee: Double + + static let empty = FeeLadder( + name: "", + type: kTypeNormal, + amount: kDefaultAmount, + fee: CrowdNode.defaultFee * 100 + ) +} diff --git a/DashWallet/Sources/Models/CrowdNode/CrowdNode+Constants.swift b/DashWallet/Sources/Models/CrowdNode/CrowdNode+Constants.swift index e99c14c0b..629b29d6e 100644 --- a/DashWallet/Sources/Models/CrowdNode/CrowdNode+Constants.swift +++ b/DashWallet/Sources/Models/CrowdNode/CrowdNode+Constants.swift @@ -35,6 +35,7 @@ extension CrowdNode { static let minimumDeposit = UInt64(kOneDash / 2) static let minimumLeftoverBalance: UInt64 = 30_000 static let apiConfirmationDashAmount: UInt64 = 54321 + static let defaultFee = 0.35 static let notificationID = "CrowdNode" diff --git a/DashWallet/Sources/Models/CrowdNode/CrowdNode+UserDefaults.swift b/DashWallet/Sources/Models/CrowdNode/CrowdNode+UserDefaults.swift index 46c6dfc9c..bfad12759 100644 --- a/DashWallet/Sources/Models/CrowdNode/CrowdNode+UserDefaults.swift +++ b/DashWallet/Sources/Models/CrowdNode/CrowdNode+UserDefaults.swift @@ -32,6 +32,7 @@ private let kOnlineInfoShown = "crowdNodeOnlineInfoShownKey" private let kSignedEmailMessageId = "crowdNodeSignedEmailMessageId" private let kShouldShowConfirmedNotification = "shouldShowConfirmedNotification" private let kLastWithdrawalBlock = "lastWithdrawalBlockKey" +private let kFeePercentage = "feePercentageKey" // MARK: - CrowdNodeDefaults @@ -91,6 +92,15 @@ class CrowdNodeDefaults { UserDefaults.standard.set(value, forKey: kWithdrawalLimitPerDay) } } + + private var _feePercentage: Double? = nil + var feePercentage: Double { + get { _feePercentage ?? UserDefaults.standard.value(forKey: kFeePercentage) as? Double ?? CrowdNode.defaultFee } + set(value) { + _feePercentage = value + UserDefaults.standard.set(value, forKey: kFeePercentage) + } + } private var _withdrawalLimitsInfoShown: Bool? = nil var withdrawalLimitsInfoShown: Bool { diff --git a/DashWallet/Sources/Models/CrowdNode/CrowdNode.swift b/DashWallet/Sources/Models/CrowdNode/CrowdNode.swift index d3cc28baf..82d4b2d35 100644 --- a/DashWallet/Sources/Models/CrowdNode/CrowdNode.swift +++ b/DashWallet/Sources/Models/CrowdNode/CrowdNode.swift @@ -132,7 +132,8 @@ public final class CrowdNode { init() { masternodeAPY = DWEnvironment.sharedInstance().apy.doubleValue - crowdnodeAPY = masternodeAPY * 0.85 + crowdnodeAPY = masternodeAPY * (1 - prefs.feePercentage) + print("CrowdNode: masternodeAPY: \(masternodeAPY), crowdnodeAPY: \(crowdnodeAPY)") NotificationCenter.default.publisher(for: NSNotification.Name.DWWillWipeWallet) .sink { [weak self] _ in self?.reset() } @@ -195,6 +196,7 @@ extension CrowdNode { if tryRestoreSignUp() { refreshWithdrawalLimits() + refreshFees() restoreCreatedOnlineAccount(accountAddress) return } @@ -306,7 +308,8 @@ extension CrowdNode { if let apy = chain.calculateMasternodeAPY()?.doubleValue { masternodeAPY = apy - crowdnodeAPY = masternodeAPY * 0.85 + let multiplier = 1 - prefs.feePercentage + crowdnodeAPY = masternodeAPY * multiplier chain.apy = NSNumber(value: apy) } } @@ -612,6 +615,20 @@ extension CrowdNode { } } } + + private func refreshFees() { + Task { + do { + let feeInfo = try await webService.getFees(address: accountAddress) + + if let value = feeInfo.getNormalFee() { + prefs.feePercentage = value.fee / 100 + } + } catch { + DSLogger.log("CrowdNode refreshFees error: \(error.localizedDescription)") + } + } + } private func getWithdrawalLimit(_ period: WithdrawalLimitPeriod) -> UInt64 { switch period { diff --git a/DashWallet/Sources/Models/CrowdNode/Services/CrowdNodeWebService.swift b/DashWallet/Sources/Models/CrowdNode/Services/CrowdNodeWebService.swift index d837d476e..5a5dc76e7 100644 --- a/DashWallet/Sources/Models/CrowdNode/Services/CrowdNodeWebService.swift +++ b/DashWallet/Sources/Models/CrowdNode/Services/CrowdNodeWebService.swift @@ -101,4 +101,8 @@ extension CrowdNodeService { return nil } } + + func getFees(address: String) async throws -> FeeInfo { + try await httpClient.request(.getFees(address)) + } } diff --git a/DashWallet/Sources/Models/DWGlobalOptions.m b/DashWallet/Sources/Models/DWGlobalOptions.m index efd1fe864..dbe4dca4f 100644 --- a/DashWallet/Sources/Models/DWGlobalOptions.m +++ b/DashWallet/Sources/Models/DWGlobalOptions.m @@ -154,7 +154,7 @@ - (void)restoreToDefaults { self.dateHistoricalRatesActivated = nil; self.exploreDashMerchantsInfoShown = NO; self.coinbaseInfoShown = NO; - + #ifdef DASHPAY self.dashpayUsername = nil; self.dashpayRegistrationCompleted = NO; diff --git a/DashWallet/Sources/UI/CrowdNode/Views/CrowdNodeAPYView.swift b/DashWallet/Sources/UI/CrowdNode/Views/CrowdNodeAPYView.swift index 91c2946c6..0cd221846 100644 --- a/DashWallet/Sources/UI/CrowdNode/Views/CrowdNodeAPYView.swift +++ b/DashWallet/Sources/UI/CrowdNode/Views/CrowdNodeAPYView.swift @@ -68,7 +68,7 @@ class CrowdNodeAPYView: UIView { } private var apy: String { - let apyValue = DWEnvironment.sharedInstance().apy.doubleValue * 0.85 + let apyValue = CrowdNode.shared.crowdnodeAPY let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .percent diff --git a/Podfile.lock b/Podfile.lock index 2549914ea..8f95e89a0 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.10.0) + - Alamofire (5.10.1) - BlueCryptor (1.0.32) - BlueECC (1.2.5) - BlueRSA (1.0.200) @@ -591,9 +591,11 @@ PODS: - "!ProtoCompiler-gRPCPlugin (~> 1.0)" - DAPI-GRPC/Messages - gRPC-ProtoRPC + - DashSharedCore (0.4.19) - DashSync (0.1.0): - CocoaLumberjack (= 3.7.2) - DAPI-GRPC (= 0.22.0-dev.8) + - DashSharedCore (= 0.4.19) - DSDynamicOptions (= 0.1.2) - DWAlertController (= 0.2.1) - TinyCborObjc (= 0.4.6) @@ -708,7 +710,7 @@ PODS: - nanopb/decode (2.30908.0) - nanopb/encode (2.30908.0) - PromisesObjC (2.4.0) - - Protobuf (3.28.2) + - Protobuf (3.28.3) - SDWebImage (5.13.2): - SDWebImage/Core (= 5.13.2) - SDWebImage/Core (5.13.2) @@ -764,6 +766,7 @@ SPEC REPOS: - CloudInAppMessaging - CocoaLumberjack - DAPI-GRPC + - DashSharedCore - DSDynamicOptions - DWAlertController - Firebase @@ -819,7 +822,7 @@ SPEC CHECKSUMS: "!ProtoCompiler": e9c09244955a8565817aa59a4787b6bb849a63c6 "!ProtoCompiler-gRPCPlugin": 755f0ee414a0d5f0028e0dcfe98c23bdbc3e6fa3 abseil: 926fb7a82dc6d2b8e1f2ed7f3a718bce691d1e46 - Alamofire: cd0b98508df05796dd2ff278f3bb055a631b5390 + Alamofire: 840d2a1ad82355b536ec6ba5f97e5bfa54600ca3 BlueCryptor: b0aee3d9b8f367b49b30de11cda90e1735571c24 BlueECC: 0d18e93347d3ec6d41416de21c1ffa4d4cd3c2cc BlueRSA: dfeef51db96bcc4edec654956c1581adbda4e6a3 @@ -828,7 +831,8 @@ SPEC CHECKSUMS: CocoaImageHashing: 8656031d0899abe6c1c415827de43e9798189c53 CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da DAPI-GRPC: 138d62523bbfe7e88a39896f1053c0bc12390d9f - DashSync: 2438dbf626f13a8633ccc19c718c1c223c8ee831 + DashSharedCore: 009f29640756017406ee2b0ab5f1073f1856f85e + DashSync: f0ee76fe1409c9071bcee21202cc8002944c801d DSDynamicOptions: 347cc5d2c4e080eb3de6a86719ad3d861b82adfc DWAlertController: 5f4cd8adf90336331c054857f709f5f8d4b16a5b Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d @@ -852,7 +856,7 @@ SPEC CHECKSUMS: Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - Protobuf: 28c89b24435762f60244e691544ed80f50d82701 + Protobuf: 5a8a7781d8e1004302f108977ac2d5b99323146f SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866 SQLite.swift: 8d054987f02728cc912b0eb5a9659650573a65a2 SQLiteMigrationManager.swift: b63bb5eaf834f8e8cc78b37fdf2ce064e35914cd