diff --git a/DashSyncCurrentCommit b/DashSyncCurrentCommit index d4e369a77..9a1806aff 100644 --- a/DashSyncCurrentCommit +++ b/DashSyncCurrentCommit @@ -1 +1 @@ -49b6db28808308255a8a6a30d1fe5670d9c9c50e +751595434308e0761cceb15b428a41ca5eefdb8b diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 799291577..449f9e512 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -128,7 +128,6 @@ 2A2CD71322F97B65008C7BC9 /* CALayer+DWShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A2CD71222F97B65008C7BC9 /* CALayer+DWShadow.m */; }; 2A2CD71822F99CAE008C7BC9 /* ShortcutsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A2CD71722F99CAE008C7BC9 /* ShortcutsView.xib */; }; 2A2CD72222F9B571008C7BC9 /* DWIntrinsicCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A2CD72122F9B571008C7BC9 /* DWIntrinsicCollectionView.m */; }; - 2A36A88B2350A05B0014DC60 /* DWBackupSeedPhraseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A36A88A2350A05B0014DC60 /* DWBackupSeedPhraseViewController.m */; }; 2A392568234CFE9D00316EA6 /* NSAttributedString+DWHighlightText.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A392567234CFE9D00316EA6 /* NSAttributedString+DWHighlightText.m */; }; 2A3DC86E239717C2004B3DBA /* DWRecoverWalletCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3DC86D239717C2004B3DBA /* DWRecoverWalletCommand.m */; }; 2A4430E722CBB6EC009BAF7F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4430E622CBB6EC009BAF7F /* AppDelegate.m */; }; @@ -160,10 +159,8 @@ 2A4E531A22EA382B00E5168A /* SyncView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4E531922EA382B00E5168A /* SyncView.xib */; }; 2A4E531D22EA49FE00E5168A /* DWProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4E531C22EA49FE00E5168A /* DWProgressView.m */; }; 2A4E533822F023AB00E5168A /* DWHomeModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4E533722F023AB00E5168A /* DWHomeModel.m */; }; - 2A4E534122F025FE00E5168A /* TxListEmptyTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4E533F22F025FE00E5168A /* TxListEmptyTableViewCell.xib */; }; 2A4E534422F02BC300E5168A /* UIView+DWReuseHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4E534322F02BC300E5168A /* UIView+DWReuseHelper.m */; }; 2A4E534D22F03AAC00E5168A /* DWFilterHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4E534C22F03AAC00E5168A /* DWFilterHeaderView.xib */; }; - 2A4E535522F1D0D900E5168A /* TxListTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4E535322F1D0D900E5168A /* TxListTableViewCell.xib */; }; 2A4E535C22F335C200E5168A /* DWTransactionListDataProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4E535B22F335C200E5168A /* DWTransactionListDataProvider.m */; }; 2A5279BC23D994BC00F856D3 /* CoreNFC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A5279BB23D994BC00F856D3 /* CoreNFC.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 2A58815921A5906C00FD4D2C /* DWBaseLegacyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A58815821A5906C00FD4D2C /* DWBaseLegacyViewController.m */; }; @@ -340,9 +337,6 @@ 47081199298CF57D003FCA3D /* TransactionListDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47081198298CF57D003FCA3D /* TransactionListDataSource.swift */; }; 4708119F2990F56F003FCA3D /* TransactionDataItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4708119E2990F56F003FCA3D /* TransactionDataItem.swift */; }; 47083B3229892D770010AF71 /* DSTransaction+DashWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47083B3129892D770010AF71 /* DSTransaction+DashWallet.swift */; }; - 47083B3629893E700010AF71 /* CNCreateAccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47083B3529893E700010AF71 /* CNCreateAccountCell.swift */; }; - 47083B3829893F4B0010AF71 /* CNCreateAccountCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 47083B3729893F4B0010AF71 /* CNCreateAccountCell.xib */; }; - 47083B3B298948B70010AF71 /* CNCreateAccountTxDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47083B3A298948B70010AF71 /* CNCreateAccountTxDetailsViewController.swift */; }; 4709C30F287E787700B4BD48 /* Migrations.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4709C30E287E787700B4BD48 /* Migrations.bundle */; }; 4709C312287E78BD00B4BD48 /* SeedDB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4709C311287E78BD00B4BD48 /* SeedDB.swift */; }; 4709C315287EA11900B4BD48 /* TxUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4709C314287EA11900B4BD48 /* TxUserInfo.swift */; }; @@ -376,8 +370,6 @@ 474C7213298A1EFC00475CA6 /* TxDetailInfoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 474C7212298A1EFC00475CA6 /* TxDetailInfoCell.xib */; }; 474C7215298A1FCF00475CA6 /* TxDetailActionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 474C7214298A1FCF00475CA6 /* TxDetailActionCell.xib */; }; 474C7218298A422500475CA6 /* TransactionItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474C7217298A422400475CA6 /* TransactionItemView.swift */; }; - 474C721A298A803200475CA6 /* TxListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474C7219298A803200475CA6 /* TxListTableViewCell.swift */; }; - 474C721D298B65C100475CA6 /* Cells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474C721C298B65C100475CA6 /* Cells.swift */; }; 4751136C28D9A3DB00223B77 /* BuySellPortalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751136B28D9A3DB00223B77 /* BuySellPortalViewController.swift */; }; 4751136F28D9B50E00223B77 /* CoinbaseInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751136E28D9B50E00223B77 /* CoinbaseInfoViewController.swift */; }; 4751137528DAF28800223B77 /* UIAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751137428DAF28800223B77 /* UIAssembly.swift */; }; @@ -420,7 +412,6 @@ 4789D27029825F5400BAFEFA /* CoinbaseAmountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4789D26F29825F5400BAFEFA /* CoinbaseAmountViewController.swift */; }; 478A2C7128DC554200AD1420 /* BuySellPortalModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478A2C7028DC554200AD1420 /* BuySellPortalModel.swift */; }; 478A2C7228DC909C00AD1420 /* BaseNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478A2C6E28DC457000AD1420 /* BaseNavigationController.swift */; }; - 478A9297299242EC0008C43E /* CNCreateAccountTxDetailsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478A9296299242EC0008C43E /* CNCreateAccountTxDetailsModel.swift */; }; 478C98262942DC2700FAA0F0 /* BuyDashViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478C98252942DC2700FAA0F0 /* BuyDashViewController.swift */; }; 478C98292942DDB800FAA0F0 /* BuyDashModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478C98282942DDB800FAA0F0 /* BuyDashModel.swift */; }; 478C982C2942F03500FAA0F0 /* SendingToView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478C982B2942F03500FAA0F0 /* SendingToView.swift */; }; @@ -565,9 +556,13 @@ 754119E01CDA93FF0042DC51 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BAE12BE61B2DEE7F00895CC5 /* NotificationCenter.framework */; }; 754495DD2AE91B6300492817 /* GroupedRequestCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754495DC2AE91B6300492817 /* GroupedRequestCell.swift */; }; 754495DF2AE91D3500492817 /* UsernameRequestCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754495DE2AE91D3500492817 /* UsernameRequestCell.swift */; }; + 754BEA122C0B6BD700E8C93C /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754BEA112C0B6BD700E8C93C /* HomeViewModel.swift */; }; + 754BEA132C0B6BD700E8C93C /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754BEA112C0B6BD700E8C93C /* HomeViewModel.swift */; }; 755A22BD2B1385FD001F170D /* IconAttributedText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755A22BC2B1385FD001F170D /* IconAttributedText.swift */; }; 755B4B222B0C903500B844F0 /* DWDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755B4B212B0C903500B844F0 /* DWDateFormatter.swift */; }; 755B4B232B0C903500B844F0 /* DWDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755B4B212B0C903500B844F0 /* DWDateFormatter.swift */; }; + 755C32382C358FC0007DA721 /* BackupSeedPhraseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755C32372C358FBD007DA721 /* BackupSeedPhraseViewController.swift */; }; + 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 */; }; 7565D5952B08B35F0092C9BA /* RequestUsernameViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7565D5942B08B35F0092C9BA /* RequestUsernameViewModel.swift */; }; @@ -584,6 +579,8 @@ 757514E22B15DB510026AD8E /* ShadowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757514E12B15DB510026AD8E /* ShadowView.swift */; }; 757514E32B15DF7C0026AD8E /* ShadowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757514E12B15DB510026AD8E /* ShadowView.swift */; }; 757514E52B1735370026AD8E /* DPWelcomeMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757514E42B1735370026AD8E /* DPWelcomeMenuView.swift */; }; + 757B937D2BFF4F93002046A5 /* CrowdNodeGroupedTransactionsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757B937C2BFF4F93002046A5 /* CrowdNodeGroupedTransactionsScreen.swift */; }; + 757B937E2BFF4F93002046A5 /* CrowdNodeGroupedTransactionsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757B937C2BFF4F93002046A5 /* CrowdNodeGroupedTransactionsScreen.swift */; }; 757E09991ADB8EEB006FD352 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 757E09971ADB8EEB006FD352 /* Localizable.strings */; }; 75889B762AD296E700C17F5D /* CoinJoinInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75889B752AD296E700C17F5D /* CoinJoinInfoViewController.swift */; }; 75889B792AD2A04900C17F5D /* CoinJoinInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75889B752AD296E700C17F5D /* CoinJoinInfoViewController.swift */; }; @@ -621,6 +618,12 @@ 75C1F09E2AFF675400FE675E /* EnterVotingKeyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75C1F09D2AFF675400FE675E /* EnterVotingKeyViewController.swift */; }; 75C72CDF2B19FB0C00129504 /* DPWelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75C72CDE2B19FB0C00129504 /* DPWelcomeView.swift */; }; 75C83B522B11B62400C33660 /* ConfirmRequestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75C83B512B11B62400C33660 /* ConfirmRequestViewController.swift */; }; + 75CDD7802C0898E400F433D2 /* Shape.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75CDD77F2C0898E400F433D2 /* Shape.swift */; }; + 75CDD7812C0898E400F433D2 /* Shape.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75CDD77F2C0898E400F433D2 /* Shape.swift */; }; + 75CDD7832C0898FA00F433D2 /* Wrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75CDD7822C0898FA00F433D2 /* Wrapper.swift */; }; + 75CDD7842C0898FA00F433D2 /* Wrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75CDD7822C0898FA00F433D2 /* Wrapper.swift */; }; + 75CDD7862C08D61300F433D2 /* DashAmount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75CDD7852C08D61300F433D2 /* DashAmount.swift */; }; + 75CDD7872C08D61300F433D2 /* DashAmount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75CDD7852C08D61300F433D2 /* DashAmount.swift */; }; 75CED09E2ACFD0ED0095F10C /* CoinbaseDepositRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75CED09D2ACFD0ED0095F10C /* CoinbaseDepositRequest.swift */; }; 75CED0A02ACFED200095F10C /* CoinbaseDepositResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75CED09F2ACFED200095F10C /* CoinbaseDepositResponse.swift */; }; 75D5F3CE191EC270004AB296 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 75D5F3CD191EC270004AB296 /* main.m */; }; @@ -629,6 +632,8 @@ 75D66D332B05E7AE00A8DDA6 /* QuickVoteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75D66D322B05E7AE00A8DDA6 /* QuickVoteViewController.swift */; }; 75E2F3C82AA4CF1900C3B458 /* Topper-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 75E2F3C72AA4CF1900C3B458 /* Topper-Info.plist */; }; 75E2F3CA2AA4D1B900C3B458 /* Topper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E2F3C92AA4D1B900C3B458 /* Topper.swift */; }; + 75E7CA092C076D8900C77368 /* CNCreateAccountTxDetailsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E7CA072C076D8900C77368 /* CNCreateAccountTxDetailsModel.swift */; }; + 75E7CA0A2C076D8900C77368 /* CNCreateAccountTxDetailsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E7CA072C076D8900C77368 /* CNCreateAccountTxDetailsModel.swift */; }; 75E83CF61B5F997A0038FB70 /* coinflip.aiff in Resources */ = {isa = PBXBuildFile; fileRef = 75E83CF51B5F997A0038FB70 /* coinflip.aiff */; }; 75EAFBB12B04C057005ABC6A /* CustomHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EAFBB02B04C057005ABC6A /* CustomHUDView.swift */; }; 75EAFBB22B04C057005ABC6A /* CustomHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EAFBB02B04C057005ABC6A /* CustomHUDView.swift */; }; @@ -999,7 +1004,6 @@ C9D2C6EB2A320AA000D15901 /* UpholdAmountModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4789D22E2981067600BAFEFA /* UpholdAmountModel.swift */; }; C9D2C6EC2A320AA000D15901 /* DWModalInteractiveTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A0C69BC23140779001B8C90 /* DWModalInteractiveTransition.m */; }; C9D2C6F02A320AA000D15901 /* UIImage+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = BAA4843B1B3EFFAF0075C749 /* UIImage+Utils.m */; }; - C9D2C6F12A320AA000D15901 /* CNCreateAccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47083B3529893E700010AF71 /* CNCreateAccountCell.swift */; }; C9D2C6F22A320AA000D15901 /* DWSetupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4430ED22CBBAC9009BAF7F /* DWSetupViewController.m */; }; C9D2C6F32A320AA000D15901 /* ExploreDatabaseConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8BA928BFAE5800490F5E /* ExploreDatabaseConnection.swift */; }; C9D2C6F42A320AA000D15901 /* WithdrawalLimitsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 111C3C4B296C51B500788E18 /* WithdrawalLimitsController.swift */; }; @@ -1144,7 +1148,6 @@ C9D2C7972A320AA000D15901 /* OnlineAccountConfirmationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114D16B729828BCC009A124C /* OnlineAccountConfirmationController.swift */; }; C9D2C7982A320AA000D15901 /* BaseResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47838B8B29068F110003E8AB /* BaseResponse.swift */; }; C9D2C7992A320AA000D15901 /* DWDemoAdvancedSecurityViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB3417623A92978004E37A7 /* DWDemoAdvancedSecurityViewController.m */; }; - C9D2C79A2A320AA000D15901 /* TxListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474C7219298A803200475CA6 /* TxListTableViewCell.swift */; }; C9D2C79C2A320AA000D15901 /* TxWithinTimePeriod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 111C3C4F296D5A4700788E18 /* TxWithinTimePeriod.swift */; }; C9D2C79D2A320AA000D15901 /* CoinbaseSwapeTradeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6EDF9F28C896BC000427E7 /* CoinbaseSwapeTradeRequest.swift */; }; C9D2C79E2A320AA000D15901 /* UIFont+DWFont.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A44311622CBF0B2009BAF7F /* UIFont+DWFont.m */; }; @@ -1166,7 +1169,6 @@ 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 */; }; - C9D2C7B52A320AA000D15901 /* DWBackupSeedPhraseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A36A88A2350A05B0014DC60 /* DWBackupSeedPhraseViewController.m */; }; C9D2C7B62A320AA000D15901 /* CrowdNodeDepositTx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114CFECF296469D9005F421B /* CrowdNodeDepositTx.swift */; }; C9D2C7B92A320AA000D15901 /* DWIntrinsicTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A9FFF072233E56E00956D5F /* DWIntrinsicTableView.m */; }; C9D2C7BA2A320AA000D15901 /* DWURLActions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A913E6523A11DFE006A2A59 /* DWURLActions.m */; }; @@ -1225,7 +1227,6 @@ C9D2C7FA2A320AA000D15901 /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47FA3B0129364991008D58DC /* HTTPClient.swift */; }; C9D2C7FB2A320AA000D15901 /* DWPasteboardAddressExtractor.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E6E2302A9C200FF8653 /* DWPasteboardAddressExtractor.m */; }; C9D2C7FC2A320AA000D15901 /* ViewModel+Coinbase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477F501429531C07003C7508 /* ViewModel+Coinbase.swift */; }; - C9D2C7FD2A320AA000D15901 /* CNCreateAccountTxDetailsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478A9296299242EC0008C43E /* CNCreateAccountTxDetailsModel.swift */; }; C9D2C7FE2A320AA000D15901 /* CBUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A2A2EB293E618600938DB7 /* CBUser.swift */; }; C9D2C7FF2A320AA000D15901 /* CBSecureTokenService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A2A2ED293E622700938DB7 /* CBSecureTokenService.swift */; }; C9D2C8002A320AA000D15901 /* PayTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FA029DA95F5001BC549 /* PayTableViewCell.swift */; }; @@ -1353,7 +1354,6 @@ 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 */; }; - C9D2C89C2A320AA000D15901 /* TxListEmptyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F452022A0CEB5800825057 /* TxListEmptyTableViewCell.swift */; }; C9D2C89D2A320AA000D15901 /* SyncingAlertContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F451ED2A0BF1F500825057 /* SyncingAlertContentView.swift */; }; C9D2C89E2A320AA000D15901 /* AddressUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 471A2604289ACD5C0056B7B2 /* AddressUserInfo.swift */; }; C9D2C89F2A320AA000D15901 /* MerchantInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8C0B28C53E4A00490F5E /* MerchantInfoViewController.swift */; }; @@ -1411,14 +1411,12 @@ C9D2C8E22A320AA000D15901 /* UpholdTransferViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4789D2302981069700BAFEFA /* UpholdTransferViewController.swift */; }; C9D2C8E32A320AA000D15901 /* DWVerifySeedPhraseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AD1CE8322DC9B5D00C99324 /* DWVerifySeedPhraseViewController.m */; }; C9D2C8E42A320AA000D15901 /* DerivationPathKeysCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C909615429F297DD00002D82 /* DerivationPathKeysCell.swift */; }; - C9D2C8E52A320AA000D15901 /* Cells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474C721C298B65C100475CA6 /* Cells.swift */; }; C9D2C8E62A320AA000D15901 /* DWContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A913E9723A400D3006A2A59 /* DWContainerViewController.m */; }; C9D2C8E72A320AA000D15901 /* DashTextAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B30D79290D035B0080C326 /* DashTextAttachment.swift */; }; C9D2C8E82A320AA000D15901 /* HomeBalanceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F067F129E4576D0022D958 /* HomeBalanceView.swift */; }; C9D2C8E92A320AA000D15901 /* PointOfUseListFiltersModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47838B81290271170003E8AB /* PointOfUseListFiltersModel.swift */; }; C9D2C8EA2A320AA000D15901 /* ConvertCryptoOrderPreviewViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751CAD82970509600F63AC4 /* ConvertCryptoOrderPreviewViews.swift */; }; C9D2C8EB2A320AA000D15901 /* DWAboutModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8F421F21BEFEEA00858B91 /* DWAboutModel.m */; }; - C9D2C8EC2A320AA000D15901 /* CNCreateAccountTxDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47083B3A298948B70010AF71 /* CNCreateAccountTxDetailsViewController.swift */; }; C9D2C8EE2A320AA000D15901 /* WelcomeToCrowdNodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1141E4C4291FDC7A00ACDA9E /* WelcomeToCrowdNodeViewController.swift */; }; C9D2C8EF2A320AA000D15901 /* TerritoriesListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C6E6E229196D48003FEDF2 /* TerritoriesListCell.swift */; }; C9D2C8F02A320AA000D15901 /* DWProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4E531C22EA49FE00E5168A /* DWProgressView.m */; }; @@ -1453,7 +1451,6 @@ C9D2C9112A320AA000D15901 /* DWShortcutCollectionViewCell~iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A1AF6DD23C7681B00442AF5 /* DWShortcutCollectionViewCell~iphone.xib */; }; C9D2C9122A320AA000D15901 /* DWInfoTextCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4431D422D52F67009BAF7F /* DWInfoTextCell.xib */; }; C9D2C9132A320AA000D15901 /* BiometricAuth.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A44314822CF82EF009BAF7F /* BiometricAuth.storyboard */; }; - C9D2C9142A320AA000D15901 /* TxListEmptyTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4E533F22F025FE00E5168A /* TxListEmptyTableViewCell.xib */; }; C9D2C9152A320AA000D15901 /* Payments.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A8B9E3C22FD71E100FF8653 /* Payments.storyboard */; }; C9D2C9172A320AA000D15901 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 757E09971ADB8EEB006FD352 /* Localizable.strings */; }; C9D2C9182A320AA000D15901 /* LockScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A6300412328CCE900827825 /* LockScreen.storyboard */; }; @@ -1471,7 +1468,6 @@ C9D2C9252A320AA000D15901 /* SharedAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2ADF83FE23633116008459A7 /* SharedAssets.xcassets */; }; C9D2C9262A320AA000D15901 /* BackupInfo.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A4431C422D4CAFA009BAF7F /* BackupInfo.storyboard */; }; C9D2C9272A320AA000D15901 /* SyncView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4E531922EA382B00E5168A /* SyncView.xib */; }; - C9D2C9282A320AA000D15901 /* TxListTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4E535322F1D0D900E5168A /* TxListTableViewCell.xib */; }; C9D2C9292A320AA000D15901 /* BackupInfoItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9F42FB529DD8702001BC549 /* BackupInfoItemView.xib */; }; C9D2C92A2A320AA000D15901 /* explore.db in Resources */ = {isa = PBXBuildFile; fileRef = 47AE8BAF28BFF28400490F5E /* explore.db */; }; C9D2C92B2A320AA000D15901 /* (null) in Resources */ = {isa = PBXBuildFile; }; @@ -1499,7 +1495,6 @@ C9D2C9442A320AA000D15901 /* uphold-logout.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 2A811558269CE09300215F81 /* uphold-logout.jpg */; }; C9D2C9452A320AA000D15901 /* AmountPreviewView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2ACCD864231959CD00A96B62 /* AmountPreviewView.xib */; }; C9D2C9462A320AA000D15901 /* TxDetailActionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 474C7214298A1FCF00475CA6 /* TxDetailActionCell.xib */; }; - C9D2C9472A320AA000D15901 /* CNCreateAccountCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 47083B3729893F4B0010AF71 /* CNCreateAccountCell.xib */; }; C9D2C95E2A386D7E00D15901 /* DWBasePressableControl.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D2C95D2A386D7E00D15901 /* DWBasePressableControl.m */; }; C9D2C9652A38733B00D15901 /* DPAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9D2C9642A38733B00D15901 /* DPAssets.xcassets */; }; C9D2C9692A3875BA00D15901 /* DWCurrentUserProfileModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D2C9672A3875BA00D15901 /* DWCurrentUserProfileModel.m */; }; @@ -1529,7 +1524,6 @@ C9F451F92A0CB08900825057 /* ProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F451F82A0CB08900825057 /* ProgressView.swift */; }; C9F451FD2A0CC4A300825057 /* BadgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F451FC2A0CC4A300825057 /* BadgeView.swift */; }; C9F452012A0CE6C900825057 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F452002A0CE6C900825057 /* HomeView.swift */; }; - C9F452032A0CEB5800825057 /* TxListEmptyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F452022A0CEB5800825057 /* TxListEmptyTableViewCell.swift */; }; C9F452082A11F28600825057 /* SyncModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F452072A11F28600825057 /* SyncModel.swift */; }; C9F4520B2A1209D100825057 /* HomeHeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F4520A2A1209D100825057 /* HomeHeaderModel.swift */; }; C9FAABB52AB793CE00878224 /* BuySellPortal.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9FAABB42AB793CE00878224 /* BuySellPortal.storyboard */; }; @@ -1794,8 +1788,6 @@ 2A2CD72022F9B571008C7BC9 /* DWIntrinsicCollectionView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWIntrinsicCollectionView.h; sourceTree = ""; }; 2A2CD72122F9B571008C7BC9 /* DWIntrinsicCollectionView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWIntrinsicCollectionView.m; sourceTree = ""; }; 2A36A887234F3F400014DC60 /* DWSelectorFormItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSelectorFormItem.h; sourceTree = ""; }; - 2A36A8892350A05B0014DC60 /* DWBackupSeedPhraseViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBackupSeedPhraseViewController.h; sourceTree = ""; }; - 2A36A88A2350A05B0014DC60 /* DWBackupSeedPhraseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBackupSeedPhraseViewController.m; sourceTree = ""; }; 2A36A88C2350A18A0014DC60 /* DWPreviewSeedPhraseViewController+DWProtected.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DWPreviewSeedPhraseViewController+DWProtected.h"; sourceTree = ""; }; 2A392566234CFE9D00316EA6 /* NSAttributedString+DWHighlightText.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSAttributedString+DWHighlightText.h"; sourceTree = ""; }; 2A392567234CFE9D00316EA6 /* NSAttributedString+DWHighlightText.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSAttributedString+DWHighlightText.m"; sourceTree = ""; }; @@ -1850,12 +1842,10 @@ 2A4E531C22EA49FE00E5168A /* DWProgressView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWProgressView.m; sourceTree = ""; }; 2A4E533622F023AB00E5168A /* DWHomeModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWHomeModel.h; sourceTree = ""; }; 2A4E533722F023AB00E5168A /* DWHomeModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWHomeModel.m; sourceTree = ""; }; - 2A4E533F22F025FE00E5168A /* TxListEmptyTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TxListEmptyTableViewCell.xib; sourceTree = ""; }; 2A4E534222F02BC300E5168A /* UIView+DWReuseHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+DWReuseHelper.h"; sourceTree = ""; }; 2A4E534322F02BC300E5168A /* UIView+DWReuseHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIView+DWReuseHelper.m"; sourceTree = ""; }; 2A4E534522F02C6000E5168A /* DWUIKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWUIKit.h; sourceTree = ""; }; 2A4E534C22F03AAC00E5168A /* DWFilterHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DWFilterHeaderView.xib; sourceTree = ""; }; - 2A4E535322F1D0D900E5168A /* TxListTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TxListTableViewCell.xib; sourceTree = ""; }; 2A4E535A22F335C200E5168A /* DWTransactionListDataProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWTransactionListDataProvider.h; sourceTree = ""; }; 2A4E535B22F335C200E5168A /* DWTransactionListDataProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWTransactionListDataProvider.m; sourceTree = ""; }; 2A4E535D22F33BD200E5168A /* DWTransactionListDataProviderProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWTransactionListDataProviderProtocol.h; sourceTree = ""; }; @@ -2212,9 +2202,6 @@ 4708119C298CF9E0003FCA3D /* DWDPRegistrationErrorRetryDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWDPRegistrationErrorRetryDelegate.h; sourceTree = ""; }; 4708119E2990F56F003FCA3D /* TransactionDataItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionDataItem.swift; sourceTree = ""; }; 47083B3129892D770010AF71 /* DSTransaction+DashWallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DSTransaction+DashWallet.swift"; sourceTree = ""; }; - 47083B3529893E700010AF71 /* CNCreateAccountCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNCreateAccountCell.swift; sourceTree = ""; }; - 47083B3729893F4B0010AF71 /* CNCreateAccountCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CNCreateAccountCell.xib; sourceTree = ""; }; - 47083B3A298948B70010AF71 /* CNCreateAccountTxDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNCreateAccountTxDetailsViewController.swift; sourceTree = ""; }; 4709C30E287E787700B4BD48 /* Migrations.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Migrations.bundle; sourceTree = ""; }; 4709C311287E78BD00B4BD48 /* SeedDB.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeedDB.swift; sourceTree = ""; }; 4709C314287EA11900B4BD48 /* TxUserInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TxUserInfo.swift; sourceTree = ""; }; @@ -2250,8 +2237,6 @@ 474C7212298A1EFC00475CA6 /* TxDetailInfoCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TxDetailInfoCell.xib; sourceTree = ""; }; 474C7214298A1FCF00475CA6 /* TxDetailActionCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TxDetailActionCell.xib; sourceTree = ""; }; 474C7217298A422400475CA6 /* TransactionItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionItemView.swift; sourceTree = ""; }; - 474C7219298A803200475CA6 /* TxListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TxListTableViewCell.swift; sourceTree = ""; }; - 474C721C298B65C100475CA6 /* Cells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cells.swift; sourceTree = ""; }; 4751136B28D9A3DB00223B77 /* BuySellPortalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuySellPortalViewController.swift; sourceTree = ""; }; 4751136E28D9B50E00223B77 /* CoinbaseInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoinbaseInfoViewController.swift; sourceTree = ""; }; 4751137428DAF28800223B77 /* UIAssembly.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIAssembly.swift; sourceTree = ""; }; @@ -2298,7 +2283,6 @@ 4789D26F29825F5400BAFEFA /* CoinbaseAmountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoinbaseAmountViewController.swift; sourceTree = ""; }; 478A2C6E28DC457000AD1420 /* BaseNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseNavigationController.swift; sourceTree = ""; }; 478A2C7028DC554200AD1420 /* BuySellPortalModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuySellPortalModel.swift; sourceTree = ""; }; - 478A9296299242EC0008C43E /* CNCreateAccountTxDetailsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNCreateAccountTxDetailsModel.swift; sourceTree = ""; }; 478C98252942DC2700FAA0F0 /* BuyDashViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyDashViewController.swift; sourceTree = ""; }; 478C98282942DDB800FAA0F0 /* BuyDashModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyDashModel.swift; sourceTree = ""; }; 478C982B2942F03500FAA0F0 /* SendingToView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendingToView.swift; sourceTree = ""; }; @@ -2444,8 +2428,10 @@ 753FDBED2AECF52B0005EEC3 /* UsernameVoting.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = UsernameVoting.storyboard; sourceTree = ""; }; 754495DC2AE91B6300492817 /* GroupedRequestCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupedRequestCell.swift; sourceTree = ""; }; 754495DE2AE91D3500492817 /* UsernameRequestCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsernameRequestCell.swift; sourceTree = ""; }; + 754BEA112C0B6BD700E8C93C /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; 755A22BC2B1385FD001F170D /* IconAttributedText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconAttributedText.swift; sourceTree = ""; }; 755B4B212B0C903500B844F0 /* DWDateFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DWDateFormatter.swift; sourceTree = ""; }; + 755C32372C358FBD007DA721 /* BackupSeedPhraseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupSeedPhraseViewController.swift; sourceTree = ""; }; 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 = ""; }; @@ -2461,6 +2447,7 @@ 757514DF2B15D8DE0026AD8E /* VotingConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VotingConstants.swift; sourceTree = ""; }; 757514E12B15DB510026AD8E /* ShadowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowView.swift; sourceTree = ""; }; 757514E42B1735370026AD8E /* DPWelcomeMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DPWelcomeMenuView.swift; sourceTree = ""; }; + 757B937C2BFF4F93002046A5 /* CrowdNodeGroupedTransactionsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrowdNodeGroupedTransactionsScreen.swift; sourceTree = ""; }; 757E09981ADB8EEB006FD352 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 75889B752AD296E700C17F5D /* CoinJoinInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoinJoinInfoViewController.swift; sourceTree = ""; }; 75889B802AD2D7F800C17F5D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CoinJoin.storyboard; sourceTree = ""; }; @@ -2485,6 +2472,9 @@ 75C1F09D2AFF675400FE675E /* EnterVotingKeyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterVotingKeyViewController.swift; sourceTree = ""; }; 75C72CDE2B19FB0C00129504 /* DPWelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DPWelcomeView.swift; sourceTree = ""; }; 75C83B512B11B62400C33660 /* ConfirmRequestViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfirmRequestViewController.swift; sourceTree = ""; }; + 75CDD77F2C0898E400F433D2 /* Shape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shape.swift; sourceTree = ""; }; + 75CDD7822C0898FA00F433D2 /* Wrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wrapper.swift; sourceTree = ""; }; + 75CDD7852C08D61300F433D2 /* DashAmount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashAmount.swift; sourceTree = ""; }; 75CE194E1B9642EB000778E4 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = ""; }; 75CE50B51B5216F100DBC18C /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = DashWalletTests/Info.plist; sourceTree = SOURCE_ROOT; }; 75CED09D2ACFD0ED0095F10C /* CoinbaseDepositRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoinbaseDepositRequest.swift; sourceTree = ""; }; @@ -2503,6 +2493,7 @@ 75DE02511B0EB8030027FF08 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; lineEnding = 0; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; 75E2F3C72AA4CF1900C3B458 /* Topper-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Topper-Info.plist"; sourceTree = ""; }; 75E2F3C92AA4D1B900C3B458 /* Topper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Topper.swift; sourceTree = ""; }; + 75E7CA072C076D8900C77368 /* CNCreateAccountTxDetailsModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CNCreateAccountTxDetailsModel.swift; sourceTree = ""; }; 75E83CF51B5F997A0038FB70 /* coinflip.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = coinflip.aiff; sourceTree = ""; }; 75EAFBB02B04C057005ABC6A /* CustomHUDView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomHUDView.swift; sourceTree = ""; }; 75EBAA082BB9791B004488E3 /* Icon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; @@ -3033,7 +3024,6 @@ C9F451F82A0CB08900825057 /* ProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressView.swift; sourceTree = ""; }; C9F451FC2A0CC4A300825057 /* BadgeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeView.swift; sourceTree = ""; }; C9F452002A0CE6C900825057 /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; - C9F452022A0CEB5800825057 /* TxListEmptyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TxListEmptyTableViewCell.swift; sourceTree = ""; }; C9F452072A11F28600825057 /* SyncModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncModel.swift; sourceTree = ""; }; C9F4520A2A1209D100825057 /* HomeHeaderModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeHeaderModel.swift; sourceTree = ""; }; C9FAABB42AB793CE00878224 /* BuySellPortal.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = BuySellPortal.storyboard; sourceTree = ""; }; @@ -3743,6 +3733,7 @@ 2A2CD70B22F97A9D008C7BC9 /* Shortcuts */, 2A4E533C22F025ED00E5168A /* Cells */, C9F452002A0CE6C900825057 /* HomeView.swift */, + 754BEA112C0B6BD700E8C93C /* HomeViewModel.swift */, ); path = Views; sourceTree = ""; @@ -4002,8 +3993,7 @@ 2A4431D922D675CD009BAF7F /* DWPreviewSeedPhraseViewController.h */, 2A4431DA22D675CD009BAF7F /* DWPreviewSeedPhraseViewController.m */, 2A36A88C2350A18A0014DC60 /* DWPreviewSeedPhraseViewController+DWProtected.h */, - 2A36A8892350A05B0014DC60 /* DWBackupSeedPhraseViewController.h */, - 2A36A88A2350A05B0014DC60 /* DWBackupSeedPhraseViewController.m */, + 755C32372C358FBD007DA721 /* BackupSeedPhraseViewController.swift */, ); path = Seed; sourceTree = ""; @@ -4036,11 +4026,7 @@ 2A4E533C22F025ED00E5168A /* Cells */ = { isa = PBXGroup; children = ( - 2A4E535322F1D0D900E5168A /* TxListTableViewCell.xib */, C9F451F22A0C933700825057 /* SyncingHeaderView.swift */, - C9F452022A0CEB5800825057 /* TxListEmptyTableViewCell.swift */, - 2A4E533F22F025FE00E5168A /* TxListEmptyTableViewCell.xib */, - 474C7219298A803200475CA6 /* TxListTableViewCell.swift */, ); path = Cells; sourceTree = ""; @@ -5112,27 +5098,16 @@ 47083B3329893E260010AF71 /* Views */ = { isa = PBXGroup; children = ( - 47083B3429893E2C0010AF71 /* Tx Cell */, 759C8F9E2B593589004B1305 /* CrowdNodeAPYView.swift */, ); path = Views; sourceTree = ""; }; - 47083B3429893E2C0010AF71 /* Tx Cell */ = { - isa = PBXGroup; - children = ( - 47083B3529893E700010AF71 /* CNCreateAccountCell.swift */, - 47083B3729893F4B0010AF71 /* CNCreateAccountCell.xib */, - ); - path = "Tx Cell"; - sourceTree = ""; - }; 47083B392989488D0010AF71 /* Tx Details */ = { isa = PBXGroup; children = ( - 478A9295299242CD0008C43E /* Model */, - 474C721B298B659D00475CA6 /* Views */, - 47083B3A298948B70010AF71 /* CNCreateAccountTxDetailsViewController.swift */, + 75E7CA082C076D8900C77368 /* Model */, + 757B937C2BFF4F93002046A5 /* CrowdNodeGroupedTransactionsScreen.swift */, ); path = "Tx Details"; sourceTree = ""; @@ -5218,14 +5193,6 @@ path = Item; sourceTree = ""; }; - 474C721B298B659D00475CA6 /* Views */ = { - isa = PBXGroup; - children = ( - 474C721C298B65C100475CA6 /* Cells.swift */, - ); - path = Views; - sourceTree = ""; - }; 4751136A28D9A3BE00223B77 /* Buy Sell */ = { isa = PBXGroup; children = ( @@ -5454,14 +5421,6 @@ path = Model; sourceTree = ""; }; - 478A9295299242CD0008C43E /* Model */ = { - isa = PBXGroup; - children = ( - 478A9296299242EC0008C43E /* CNCreateAccountTxDetailsModel.swift */, - ); - path = Model; - sourceTree = ""; - }; 478C98242942DBF200FAA0F0 /* Buy Dash */ = { isa = PBXGroup; children = ( @@ -6068,6 +6027,9 @@ 75AA33D12BF9E18E00F12465 /* Color+DWStyle.swift */, 75AA33D42BF9E1D400F12465 /* Font+DWStyle.swift */, 75AA33D72BFB4A5A00F12465 /* Extensions.swift */, + 75CDD77F2C0898E400F433D2 /* Shape.swift */, + 75CDD7822C0898FA00F433D2 /* Wrapper.swift */, + 75CDD7852C08D61300F433D2 /* DashAmount.swift */, ); path = "SwiftUI Components"; sourceTree = ""; @@ -6246,6 +6208,14 @@ path = Usernames; sourceTree = ""; }; + 75E7CA082C076D8900C77368 /* Model */ = { + isa = PBXGroup; + children = ( + 75E7CA072C076D8900C77368 /* CNCreateAccountTxDetailsModel.swift */, + ); + path = Model; + sourceTree = ""; + }; 75EBAA1B2BBA71CD004488E3 /* ZenLedger */ = { isa = PBXGroup; children = ( @@ -7864,7 +7834,6 @@ 2A1AF6DF23C7681B00442AF5 /* DWShortcutCollectionViewCell~iphone.xib in Resources */, 2A4431D622D52F67009BAF7F /* DWInfoTextCell.xib in Resources */, 2A44314922CF82EF009BAF7F /* BiometricAuth.storyboard in Resources */, - 2A4E534122F025FE00E5168A /* TxListEmptyTableViewCell.xib in Resources */, 2A8B9E3D22FD71E100FF8653 /* Payments.storyboard in Resources */, 2A4E534D22F03AAC00E5168A /* DWFilterHeaderView.xib in Resources */, 757E09991ADB8EEB006FD352 /* Localizable.strings in Resources */, @@ -7885,7 +7854,6 @@ 2ADF83FF23633116008459A7 /* SharedAssets.xcassets in Resources */, 2A4431C522D4CAFA009BAF7F /* BackupInfo.storyboard in Resources */, 2A4E531A22EA382B00E5168A /* SyncView.xib in Resources */, - 2A4E535522F1D0D900E5168A /* TxListTableViewCell.xib in Resources */, C9F42FB629DD8702001BC549 /* BackupInfoItemView.xib in Resources */, 47AE8BB028BFF28700490F5E /* explore.db in Resources */, 0F36937F2919A70B007F4E91 /* Coinbase.storyboard in Resources */, @@ -7914,7 +7882,6 @@ 2A811559269CE09300215F81 /* uphold-logout.jpg in Resources */, 2ACCD865231959CD00A96B62 /* AmountPreviewView.xib in Resources */, 474C7215298A1FCF00475CA6 /* TxDetailActionCell.xib in Resources */, - 47083B3829893F4B0010AF71 /* CNCreateAccountCell.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7971,7 +7938,6 @@ C9D2C9122A320AA000D15901 /* DWInfoTextCell.xib in Resources */, C9D2C9132A320AA000D15901 /* BiometricAuth.storyboard in Resources */, 75EBAA232BBA9D3C004488E3 /* ZenLedger-Info.plist in Resources */, - C9D2C9142A320AA000D15901 /* TxListEmptyTableViewCell.xib in Resources */, C9D2C9152A320AA000D15901 /* Payments.storyboard in Resources */, C9D2C9172A320AA000D15901 /* Localizable.strings in Resources */, C9D2C9182A320AA000D15901 /* LockScreen.storyboard in Resources */, @@ -7992,7 +7958,6 @@ C9D2C9252A320AA000D15901 /* SharedAssets.xcassets in Resources */, C9D2C9262A320AA000D15901 /* BackupInfo.storyboard in Resources */, C9D2C9272A320AA000D15901 /* SyncView.xib in Resources */, - C9D2C9282A320AA000D15901 /* TxListTableViewCell.xib in Resources */, C9D2C9292A320AA000D15901 /* BackupInfoItemView.xib in Resources */, C9D2C92A2A320AA000D15901 /* explore.db in Resources */, C9D2C92B2A320AA000D15901 /* (null) in Resources */, @@ -8025,7 +7990,6 @@ 75303FE62AE7B70500870D8B /* CrowdNode.storyboard in Resources */, C9D2C9452A320AA000D15901 /* AmountPreviewView.xib in Resources */, C9D2C9462A320AA000D15901 /* TxDetailActionCell.xib in Resources */, - C9D2C9472A320AA000D15901 /* CNCreateAccountCell.xib in Resources */, C943B50F2A40A54600AF23C5 /* DWConfirmInvitationContentView.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -8310,13 +8274,23 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-dashpay/Pods-dashpay-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/DashSync/DashSync.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/gRPC/gRPCCertificates.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Alamofire.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/DashSync.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Protobuf_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", ); @@ -8368,12 +8342,22 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-dashwallet/Pods-dashwallet-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/DashSync/DashSync.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/gRPC/gRPCCertificates.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Alamofire.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/DashSync.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Protobuf_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", ); runOnlyForDeploymentPostprocessing = 0; @@ -8499,7 +8483,6 @@ 4789D22F2981067C00BAFEFA /* UpholdAmountModel.swift in Sources */, 2A0C69BD23140779001B8C90 /* DWModalInteractiveTransition.m in Sources */, BAA4843C1B3EFFAF0075C749 /* UIImage+Utils.m in Sources */, - 47083B3629893E700010AF71 /* CNCreateAccountCell.swift in Sources */, 2A4430EE22CBBAC9009BAF7F /* DWSetupViewController.m in Sources */, 47AE8BAB28BFAE5800490F5E /* ExploreDatabaseConnection.swift in Sources */, 111C3C4C296C51B500788E18 /* WithdrawalLimitsController.swift in Sources */, @@ -8622,6 +8605,7 @@ C9FAABB72AB799AE00878224 /* UpholdPortalModel.swift in Sources */, C3DAD268246AA6F10001624F /* DWScreenshotWarningViewController.m in Sources */, 4751CACD297021EE00F63AC4 /* ConvertCryptoOrderPreviewController.swift in Sources */, + 755C32382C358FC0007DA721 /* BackupSeedPhraseViewController.swift in Sources */, 4708119F2990F56F003FCA3D /* TransactionDataItem.swift in Sources */, 2A44314322CF80D9009BAF7F /* DWSetPinModel.m in Sources */, 2AD1CE8D22DCB3B600C99324 /* DWVerifySeedPhraseModel.m in Sources */, @@ -8652,7 +8636,6 @@ 114D16B829828BCC009A124C /* OnlineAccountConfirmationController.swift in Sources */, 47838B8C29068F110003E8AB /* BaseResponse.swift in Sources */, 2AB3417723A92978004E37A7 /* DWDemoAdvancedSecurityViewController.m in Sources */, - 474C721A298A803200475CA6 /* TxListTableViewCell.swift in Sources */, C9829CDE2A562822007132E4 /* TappableLabel.swift in Sources */, 111C3C50296D5A4700788E18 /* TxWithinTimePeriod.swift in Sources */, 0F6EDFC528C896BD000427E7 /* CoinbaseSwapeTradeRequest.swift in Sources */, @@ -8674,7 +8657,7 @@ 0F6EDFC628C896BD000427E7 /* CoinbaseBaseIDForCurrencyResponse.swift in Sources */, 47AC8413297822E000BD1B49 /* SpecifyAmountViewController.swift in Sources */, 2AFCB9C423BE76EC00FF59A6 /* DWUpholdTransactionObject+DWView.m in Sources */, - 2A36A88B2350A05B0014DC60 /* DWBackupSeedPhraseViewController.m in Sources */, + 75CDD7862C08D61300F433D2 /* DashAmount.swift in Sources */, 114CFED0296469D9005F421B /* CrowdNodeDepositTx.swift in Sources */, 2A9FFF192233E56E00956D5F /* DWIntrinsicTableView.m in Sources */, 2A913E6623A11DFE006A2A59 /* DWURLActions.m in Sources */, @@ -8724,6 +8707,7 @@ 47AE8BA628BFADD900490F5E /* AtmDAO.swift in Sources */, 475AE2B92974348F009A1055 /* App.swift in Sources */, 2A0C69A3231048DA001B8C90 /* DWPaymentProcessor.m in Sources */, + 75CDD7832C0898FA00F433D2 /* Wrapper.swift in Sources */, C9F451F32A0C933700825057 /* SyncingHeaderView.swift in Sources */, 114CFED2296489CD005F421B /* MinimumDepositBanner.swift in Sources */, 47838B8F2906D7340003E8AB /* BalanceView.swift in Sources */, @@ -8737,7 +8721,6 @@ 47FA3B0229364991008D58DC /* HTTPClient.swift in Sources */, 2A8B9E6F2302A9C200FF8653 /* DWPasteboardAddressExtractor.m in Sources */, 477F501529531C07003C7508 /* ViewModel+Coinbase.swift in Sources */, - 478A9297299242EC0008C43E /* CNCreateAccountTxDetailsModel.swift in Sources */, 47A2A2EC293E618600938DB7 /* CBUser.swift in Sources */, 47A2A2EE293E622700938DB7 /* CBSecureTokenService.swift in Sources */, C9F42FA129DA95F5001BC549 /* PayTableViewCell.swift in Sources */, @@ -8765,6 +8748,7 @@ C94946E12A25F037008A678D /* DemoMainTabbarViewController.swift in Sources */, 11AE3DD62997AA36000856EE /* MessageStatus.swift in Sources */, 2AD1CEAB22E18F1800C99324 /* DWGlobalOptions.m in Sources */, + 754BEA122C0B6BD700E8C93C /* HomeViewModel.swift in Sources */, 2A4430E722CBB6EC009BAF7F /* AppDelegate.m in Sources */, C917023F29D44E0B008C034D /* SendReceivePageController.swift in Sources */, 2A7A7BD92348CB7300451078 /* DWSettingsMenuModel.m in Sources */, @@ -8825,6 +8809,7 @@ 472CEE012924AA6D00656B48 /* PointOfUseListEmptyResultsView.swift in Sources */, C94F5E8C29D3FEC10034FD57 /* ShortcutsModel.swift in Sources */, 2A6300452328D07500827825 /* DWLockPinInputView.m in Sources */, + 75E7CA092C076D8900C77368 /* CNCreateAccountTxDetailsModel.swift in Sources */, 2A0C69AC23125074001B8C90 /* UIView+DWHUD.m in Sources */, 75EBAA122BB99B6B004488E3 /* BottomSheet.swift in Sources */, 75CED09E2ACFD0ED0095F10C /* CoinbaseDepositRequest.swift in Sources */, @@ -8845,6 +8830,7 @@ 471DD1B6290A901200E030C8 /* AmountObject.swift in Sources */, C909615129F158D700002D82 /* DerivationPathKeysViewController.swift in Sources */, 4709C31E2880247C00B4BD48 /* DSTransaction+DashWallet.m in Sources */, + 75CDD7802C0898E400F433D2 /* Shape.swift in Sources */, 2A7A7C1D234B771400451078 /* DWLocalCurrencyModel.m in Sources */, 2A7A7BC3234797FC00451078 /* DWMainMenuModel.m in Sources */, FB8ACEB622E0502200EE5035 /* DWUpholdMainnetConstants.m in Sources */, @@ -8865,6 +8851,7 @@ 75AA33D82BFB4A5A00F12465 /* Extensions.swift in Sources */, 2A9FFE852230FF4700956D5F /* DWBaseFormCellModel.m in Sources */, 47AE8BFB28C1306000490F5E /* ExploreMapAnnotationView.swift in Sources */, + 757B937D2BFF4F93002046A5 /* CrowdNodeGroupedTransactionsScreen.swift in Sources */, 2A4E533822F023AB00E5168A /* DWHomeModel.m in Sources */, 1186092129758B2F00279FCC /* IsAddressInUse.swift in Sources */, 2A8B9E4022FD75C000FF8653 /* DWSegmentedControl.m in Sources */, @@ -8878,7 +8865,6 @@ 7566F48A2BB6CAF2005238D2 /* MenuItem.swift in Sources */, 0F6EDFD128C896BD000427E7 /* CoinbaseCreateAddressesRequest.swift in Sources */, 2A10EB352358996700C38B61 /* DWImportWalletInfoViewController.m in Sources */, - C9F452032A0CEB5800825057 /* TxListEmptyTableViewCell.swift in Sources */, C9F451EE2A0BF1F500825057 /* SyncingAlertContentView.swift in Sources */, 471A2605289ACD5C0056B7B2 /* AddressUserInfo.swift in Sources */, 47AE8C0C28C53E4A00490F5E /* MerchantInfoViewController.swift in Sources */, @@ -8943,7 +8929,6 @@ 2AD1CE8422DC9B5D00C99324 /* DWVerifySeedPhraseViewController.m in Sources */, C909615529F297DD00002D82 /* DerivationPathKeysCell.swift in Sources */, 753130972B4944130069C9B7 /* UpholdError.swift in Sources */, - 474C721D298B65C100475CA6 /* Cells.swift in Sources */, 2A913E9823A400D3006A2A59 /* DWContainerViewController.m in Sources */, 75BDE7AC2BF3287400556791 /* Toast.swift in Sources */, 47B30D7A290D035B0080C326 /* DashTextAttachment.swift in Sources */, @@ -8952,7 +8937,6 @@ 4751CAD92970509600F63AC4 /* ConvertCryptoOrderPreviewViews.swift in Sources */, 75E2F3CA2AA4D1B900C3B458 /* Topper.swift in Sources */, 2A8F422021BEFEEA00858B91 /* DWAboutModel.m in Sources */, - 47083B3B298948B70010AF71 /* CNCreateAccountTxDetailsViewController.swift in Sources */, 1141E4C5291FDC7A00ACDA9E /* WelcomeToCrowdNodeViewController.swift in Sources */, 47C6E6E329196D48003FEDF2 /* TerritoriesListCell.swift in Sources */, 2A4E531D22EA49FE00E5168A /* DWProgressView.m in Sources */, @@ -9131,7 +9115,6 @@ C9D2C6EC2A320AA000D15901 /* DWModalInteractiveTransition.m in Sources */, C943B31D2A408CED00AF23C5 /* DWUserProfileContainerView.m in Sources */, C9D2C6F02A320AA000D15901 /* UIImage+Utils.m in Sources */, - C9D2C6F12A320AA000D15901 /* CNCreateAccountCell.swift in Sources */, C943B4BE2A40A54600AF23C5 /* DWGlobalMatchFailedHeaderView.m in Sources */, C943B4C22A40A54600AF23C5 /* BaseCollectionReusableView.m in Sources */, C9D2C6F22A320AA000D15901 /* DWSetupViewController.m in Sources */, @@ -9243,6 +9226,7 @@ C943B4E22A40A54600AF23C5 /* DWPassthroughView.m in Sources */, C943B5332A40A54600AF23C5 /* DWNotificationsModel.m in Sources */, C9D2C73F2A320AA000D15901 /* BuyDashModel.swift in Sources */, + 75E7CA0A2C076D8900C77368 /* CNCreateAccountTxDetailsModel.swift in Sources */, C9D2C7402A320AA000D15901 /* MerchantListViewController.swift in Sources */, C9D2C7412A320AA000D15901 /* DWUpholdCardObject.m in Sources */, C9D2C7422A320AA000D15901 /* DWIntrinsicCollectionView.m in Sources */, @@ -9256,6 +9240,7 @@ C956AF182A5C3306002FAB75 /* DWPressableButton.m in Sources */, C943B50A2A40A54600AF23C5 /* DWDPContactsItemsFactory.m in Sources */, C93078492A6AD4FC00906E4B /* UpholdConfirmViewController.swift in Sources */, + 75CDD7842C0898FA00F433D2 /* Wrapper.swift in Sources */, C9D2C7492A320AA000D15901 /* DWCurrencyObject.m in Sources */, C943B52B2A40A54600AF23C5 /* DWDashPayContactsActions.m in Sources */, C956AF102A5B592E002FAB75 /* UIView+Dash.swift in Sources */, @@ -9341,6 +9326,7 @@ C9D2C7862A320AA000D15901 /* TxReclassifyTransactionsInfoViewController.swift in Sources */, C9D2C7872A320AA000D15901 /* DWTransactionListDataProvider.m in Sources */, 753130922B47EE920069C9B7 /* UpholdCapability.swift in Sources */, + 754BEA132C0B6BD700E8C93C /* HomeViewModel.swift in Sources */, C943B5902A40ED6F00AF23C5 /* DWFirstUsernameSymbolValidationRule.m in Sources */, C943B53E2A40A6BE00AF23C5 /* DPAlertViewController.m in Sources */, 75C1F09E2AFF675400FE675E /* EnterVotingKeyViewController.swift in Sources */, @@ -9366,7 +9352,6 @@ C9D2C7982A320AA000D15901 /* BaseResponse.swift in Sources */, C9D2C7992A320AA000D15901 /* DWDemoAdvancedSecurityViewController.m in Sources */, C943B3212A408CED00AF23C5 /* DWImgurItemView.m in Sources */, - C9D2C79A2A320AA000D15901 /* TxListTableViewCell.swift in Sources */, C9D2C79C2A320AA000D15901 /* TxWithinTimePeriod.swift in Sources */, C956AF1E2A5C3397002FAB75 /* DWBaseActionButton.m in Sources */, 75B2F45D2B0B1EC1004C071A /* RequestUsernameViewController.swift in Sources */, @@ -9402,7 +9387,6 @@ C943B5922A40ED7B00AF23C5 /* DWTextField.m in Sources */, 75EBAA0D2BB9792F004488E3 /* FeatureTopText.swift in Sources */, C9D2C7B42A320AA000D15901 /* DWUpholdTransactionObject+DWView.m in Sources */, - C9D2C7B52A320AA000D15901 /* DWBackupSeedPhraseViewController.m in Sources */, C943B54A2A40B52F00AF23C5 /* NSLayoutConstraint+DWAutolayout.m in Sources */, C943B5892A40ED5A00AF23C5 /* DWDashPaySetupFlowController.m in Sources */, C9D2C7B62A320AA000D15901 /* CrowdNodeDepositTx.swift in Sources */, @@ -9429,6 +9413,7 @@ C9D2C7C52A320AA000D15901 /* GiftCardInfoViewController.swift in Sources */, C9D2C7C62A320AA000D15901 /* Tools.swift in Sources */, C9D2C7C72A320AA000D15901 /* BuySellPortalModel.swift in Sources */, + 757B937E2BFF4F93002046A5 /* CrowdNodeGroupedTransactionsScreen.swift in Sources */, C9D2C7C92A320AA000D15901 /* BuyDashViewController.swift in Sources */, C956AF0D2A5B592E002FAB75 /* TappableLabel.swift in Sources */, C9D2C7CA2A320AA000D15901 /* DWModalDismissalAnimation.m in Sources */, @@ -9491,7 +9476,6 @@ C943B4F22A40A54600AF23C5 /* DWDPNewIncomingRequestObject.m in Sources */, C9D2C7FC2A320AA000D15901 /* ViewModel+Coinbase.swift in Sources */, C943B52C2A40A54600AF23C5 /* DSBlockchainIdentity+DWDisplayName.m in Sources */, - C9D2C7FD2A320AA000D15901 /* CNCreateAccountTxDetailsModel.swift in Sources */, C9D2C7FE2A320AA000D15901 /* CBUser.swift in Sources */, C9D2C7FF2A320AA000D15901 /* CBSecureTokenService.swift in Sources */, C9D2C8002A320AA000D15901 /* PayTableViewCell.swift in Sources */, @@ -9614,6 +9598,7 @@ C9D2C85D2A320AA000D15901 /* DWLockPinInputView.m in Sources */, C9D2C85E2A320AA000D15901 /* UIView+DWHUD.m in Sources */, C9D2C85F2A320AA000D15901 /* DWPayOptionModel.m in Sources */, + 755C32392C358FC0007DA721 /* BackupSeedPhraseViewController.swift in Sources */, C9D2C8612A320AA000D15901 /* CoinbaseTokenResponse.swift in Sources */, C9D2C8622A320AA000D15901 /* BackupInfoViewController.swift in Sources */, C9D2C8642A320AA000D15901 /* AppliedFiltersView.swift in Sources */, @@ -9623,6 +9608,7 @@ C9D2C86A2A320AA000D15901 /* (null) in Sources */, C943B51F2A40A54600AF23C5 /* DWSuccessInvitationView.m in Sources */, C9D2C86B2A320AA000D15901 /* AmountPreviewView.swift in Sources */, + 75CDD7812C0898E400F433D2 /* Shape.swift in Sources */, 75FFD6B92BF47BA20032879E /* HomeViewController.swift in Sources */, C943B5322A40A54600AF23C5 /* DWNotificationsInvitationCell.m in Sources */, C9D2C86C2A320AA000D15901 /* ModalNavigationController.swift in Sources */, @@ -9671,6 +9657,7 @@ 75FFD6BC2BF48DF80032879E /* HomeViewController+JailbreakCheck.swift in Sources */, C9D2C8942A320AA000D15901 /* DerivationPathKeysHeaderView.swift in Sources */, C9D2C8952A320AA000D15901 /* ConvertCryptoOrderPreviewModel.swift in Sources */, + 75CDD7872C08D61300F433D2 /* DashAmount.swift in Sources */, C9D2C8972A320AA000D15901 /* RatesProvider.swift in Sources */, C9D2C8982A320AA000D15901 /* CBAuth.swift in Sources */, C943B51C2A40A54600AF23C5 /* SuccessInvitationViewController.swift in Sources */, @@ -9679,7 +9666,6 @@ C943B3382A408CED00AF23C5 /* DWEditProfileAvatarView.m in Sources */, C943B5582A40DA3700AF23C5 /* DWFullScreenModalControllerViewController.m in Sources */, C9D2C89B2A320AA000D15901 /* DWImportWalletInfoViewController.m in Sources */, - C9D2C89C2A320AA000D15901 /* TxListEmptyTableViewCell.swift in Sources */, C9D2C89D2A320AA000D15901 /* SyncingAlertContentView.swift in Sources */, C9D2C89E2A320AA000D15901 /* AddressUserInfo.swift in Sources */, C9D2C89F2A320AA000D15901 /* MerchantInfoViewController.swift in Sources */, @@ -9765,7 +9751,6 @@ C943B31E2A408CED00AF23C5 /* DWUserProfileModalQRContentView.m in Sources */, C9D2C8E32A320AA000D15901 /* DWVerifySeedPhraseViewController.m in Sources */, C9D2C8E42A320AA000D15901 /* DerivationPathKeysCell.swift in Sources */, - C9D2C8E52A320AA000D15901 /* Cells.swift in Sources */, 751B61C92AE0EDD000D1C2EF /* CoinJoinLevelsViewController.swift in Sources */, C9D2C8E62A320AA000D15901 /* DWContainerViewController.m in Sources */, C9D2C8E72A320AA000D15901 /* DashTextAttachment.swift in Sources */, @@ -9778,7 +9763,6 @@ C9D2C8EA2A320AA000D15901 /* ConvertCryptoOrderPreviewViews.swift in Sources */, C9D2C8EB2A320AA000D15901 /* DWAboutModel.m in Sources */, C943B4B52A40A54600AF23C5 /* DWContactsFetchedDataSource.m in Sources */, - C9D2C8EC2A320AA000D15901 /* CNCreateAccountTxDetailsViewController.swift in Sources */, C9D2C8EE2A320AA000D15901 /* WelcomeToCrowdNodeViewController.swift in Sources */, C943B3282A408CED00AF23C5 /* DWAvatarEditSelectorContentView.m in Sources */, C943B4DD2A40A54600AF23C5 /* DWDPWelcomeViewController.m in Sources */, @@ -10195,7 +10179,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = dashwallet/dashwallet.entitlements; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; @@ -10224,7 +10208,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -10303,7 +10287,8 @@ "\"UIKit\"", "-weak_framework", "\"WebKit\"", - "-ld64", + "-ld_classic", + "-Wl,-no_compact_unwind", ); PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -10325,7 +10310,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = dashwallet/dashwallet.entitlements; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -10363,7 +10348,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -10442,7 +10427,8 @@ "\"UIKit\"", "-weak_framework", "\"WebKit\"", - "-ld64", + "-ld_classic", + "-Wl,-no_compact_unwind", ); PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -10531,12 +10517,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -10553,12 +10539,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -10573,7 +10559,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C98AA93FF5283EC6405BCE4B /* Pods-WatchApp Extension.debug.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; @@ -10583,7 +10569,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -10600,7 +10586,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = CE02413EF0C60B1D1EDE6457 /* Pods-WatchApp Extension.release.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; @@ -10610,7 +10596,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -10642,7 +10628,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -10671,7 +10657,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -11312,7 +11298,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = dashwallet/dashwallet.entitlements; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -11350,7 +11336,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -11429,7 +11415,8 @@ "\"UIKit\"", "-weak_framework", "\"WebKit\"", - "-ld64", + "-ld_classic", + "-Wl,-no_compact_unwind", ); PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -11462,7 +11449,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -11513,12 +11500,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -11533,7 +11520,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 556B5EBEBAEA571D74FF69A3 /* Pods-WatchApp Extension.testflight.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; @@ -11543,7 +11530,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -11632,7 +11619,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = dashwallet/dashwallet.entitlements; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -11660,7 +11647,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -11739,7 +11726,8 @@ "\"UIKit\"", "-weak_framework", "\"WebKit\"", - "-ld64", + "-ld_classic", + "-Wl,-no_compact_unwind", ); PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -11771,7 +11759,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.0.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -11821,12 +11809,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -11841,7 +11829,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 29B232FD70BA2EDF87F86A56 /* Pods-WatchApp Extension.testnet.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; @@ -11851,7 +11839,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.1.0; + MARKETING_VERSION = 8.2.0; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; diff --git a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Contents.json index 99d535788..c574b81b2 100644 --- a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Contents.json +++ b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "Group 1805.png", + "filename" : "cn-tx.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "Group 1805@2x.png", + "filename" : "cn-tx@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Group 1805@3x.png", + "filename" : "cn-tx@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Group 1805.png b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Group 1805.png deleted file mode 100644 index 575f17202..000000000 Binary files a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Group 1805.png and /dev/null differ diff --git a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Group 1805@2x.png b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Group 1805@2x.png deleted file mode 100644 index 1a4f756a1..000000000 Binary files a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Group 1805@2x.png and /dev/null differ diff --git a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Group 1805@3x.png b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Group 1805@3x.png deleted file mode 100644 index 3cd8adcf7..000000000 Binary files a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/Group 1805@3x.png and /dev/null differ diff --git a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/cn-tx.png b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/cn-tx.png new file mode 100644 index 000000000..697657798 Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/cn-tx.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/cn-tx@2x.png b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/cn-tx@2x.png new file mode 100644 index 000000000..6dedc3bcc Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/cn-tx@2x.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/cn-tx@3x.png b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/cn-tx@3x.png new file mode 100644 index 000000000..61eb4e750 Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/CrowdNode/tx.item.cn.icon.imageset/cn-tx@3x.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Contents.json index 3946785a3..103ad2ab2 100644 --- a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Contents.json +++ b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "transaction.prev.receive.png", + "filename" : "Transaction types - Primary.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "transaction.prev.receive@2x.png", + "filename" : "Transaction types - Primary@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "transaction.prev.receive@3x.png", + "filename" : "Transaction types - Primary@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Transaction types - Primary.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Transaction types - Primary.png new file mode 100644 index 000000000..0f0694dd1 Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Transaction types - Primary.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Transaction types - Primary@2x.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Transaction types - Primary@2x.png new file mode 100644 index 000000000..342f0eee3 Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Transaction types - Primary@2x.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Transaction types - Primary@3x.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Transaction types - Primary@3x.png new file mode 100644 index 000000000..e71901c03 Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/Transaction types - Primary@3x.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/transaction.prev.receive.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/transaction.prev.receive.png deleted file mode 100644 index 28c1d5e43..000000000 Binary files a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/transaction.prev.receive.png and /dev/null differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/transaction.prev.receive@2x.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/transaction.prev.receive@2x.png deleted file mode 100644 index d209d23f9..000000000 Binary files a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/transaction.prev.receive@2x.png and /dev/null differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/transaction.prev.receive@3x.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/transaction.prev.receive@3x.png deleted file mode 100644 index d169ed3b7..000000000 Binary files a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.internal.icon.imageset/transaction.prev.receive@3x.png and /dev/null differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Contents.json new file mode 100644 index 000000000..103ad2ab2 --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Transaction types - Primary.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Transaction types - Primary@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Transaction types - Primary@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Transaction types - Primary.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Transaction types - Primary.png new file mode 100644 index 000000000..47bfd6f6f Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Transaction types - Primary.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Transaction types - Primary@2x.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Transaction types - Primary@2x.png new file mode 100644 index 000000000..fe3bd199f Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Transaction types - Primary@2x.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Transaction types - Primary@3x.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Transaction types - Primary@3x.png new file mode 100644 index 000000000..9d89e409a Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.received.icon.imageset/Transaction types - Primary@3x.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Contents.json new file mode 100644 index 000000000..103ad2ab2 --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Transaction types - Primary.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Transaction types - Primary@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Transaction types - Primary@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Transaction types - Primary.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Transaction types - Primary.png new file mode 100644 index 000000000..57ab3093f Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Transaction types - Primary.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Transaction types - Primary@2x.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Transaction types - Primary@2x.png new file mode 100644 index 000000000..46213822c Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Transaction types - Primary@2x.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Transaction types - Primary@3x.png b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Transaction types - Primary@3x.png new file mode 100644 index 000000000..5fb5d2888 Binary files /dev/null and b/DashWallet/Resources/AppAssets.xcassets/Transactions/tx.item.sent.icon.imageset/Transaction types - Primary@3x.png differ diff --git a/DashWallet/Resources/AppAssets.xcassets/screenBackground.colorset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/screenBackground.colorset/Contents.json deleted file mode 100644 index f45af6029..000000000 --- a/DashWallet/Resources/AppAssets.xcassets/screenBackground.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "display-p3", - "components" : { - "alpha" : "1.000", - "blue" : "0.957", - "green" : "0.941", - "red" : "0.937" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "1.000", - "green" : "1.000", - "red" : "1.000" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/DashWallet/Sources/Application/Syncyng Activity Monitor/SyncingActivityMonitor.swift b/DashWallet/Sources/Application/Syncyng Activity Monitor/SyncingActivityMonitor.swift index 7b80c5f2a..c9f1eb9b6 100644 --- a/DashWallet/Sources/Application/Syncyng Activity Monitor/SyncingActivityMonitor.swift +++ b/DashWallet/Sources/Application/Syncyng Activity Monitor/SyncingActivityMonitor.swift @@ -18,6 +18,7 @@ import Foundation private let kChainManagerNotificationChainKey = "DSChainManagerNotificationChainKey" +private let kChainManagerNotificationSyncStateKey = "DSChainManagerNotificationSyncStateKey" private let kSyncingCompleteProgress = 1.0 private let kMaxProgressDelta = 0.1 // 10% @@ -53,6 +54,7 @@ class SyncingActivityMonitor: NSObject, NetworkReachabilityHandling { case noConnection case unknown } + public lazy var model: DSSyncState = DSSyncState(syncPhase: .offline) @objc public var progress: Double = 0 { @@ -122,14 +124,6 @@ class SyncingActivityMonitor: NSObject, NetworkReachabilityHandling { @objc func chainManagerSyncStartedNotification(notification: Notification) { guard shouldAcceptSyncNotification(notification) else { return } - - startSyncingActivity() - } - - @objc - func chainManagerParametersUpdatedNotification(notification: Notification) { - guard shouldAcceptSyncNotification(notification) else { return } - startSyncingActivity() } @@ -147,20 +141,20 @@ class SyncingActivityMonitor: NSObject, NetworkReachabilityHandling { stopSyncingActivity(failed: true) } - + @objc - func chainManagerChainBlocksDidChangeNotification(notification: Notification) { - guard !isSyncing, chainSyncProgress < kSyncingCompleteProgress else { return } - - startSyncingActivity() + func chainManagerSyncStateChangedNotification(notification: Notification) { + guard shouldAcceptSyncNotification(notification) else { return } + + if let model = notification.userInfo?[kChainManagerNotificationSyncStateKey] as? DSSyncState { + self.model = model + } } - + @objc func peerManagerConnectedPeersDidChangeNotification(notification: Notification) { - let isConnected = DWEnvironment.sharedInstance().currentChainManager.peerManager.connected - - if isConnected { - NotificationCenter.default.removeObserver(self, name: .peerManagerConnectedPeersDidChange, object: nil) + if model.peerManagerConnected { + removeChainObserver(.peerManagerConnectedPeersDidChange) startSyncingIfNeeded() } } @@ -173,14 +167,13 @@ class SyncingActivityMonitor: NSObject, NetworkReachabilityHandling { @objc public static let shared = SyncingActivityMonitor() } -// MARK: Suncing +// MARK: Syncing extension SyncingActivityMonitor { + private func startSyncingIfNeeded() { - guard DWEnvironment.sharedInstance().currentChainManager.peerManager.connected else { - NotificationCenter.default.addObserver(self, selector: #selector(peerManagerConnectedPeersDidChangeNotification(notification:)), - name: .peerManagerConnectedPeersDidChange, object: nil) - + guard model.peerManagerConnected else { + addChainObserver(.peerManagerConnectedPeersDidChange, #selector(peerManagerConnectedPeersDidChangeNotification(notification:))) return } @@ -190,7 +183,7 @@ extension SyncingActivityMonitor { private func startSyncingActivity() { guard !isSyncing else { return } - progress = chainSyncProgress + progress = model.combinedSyncProgress lastPeakDate = nil NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(syncLoop), object: nil) @@ -205,16 +198,18 @@ extension SyncingActivityMonitor { isSyncing = false state = failed ? .syncFailed : .syncDone } - + @objc private func syncLoop() { guard reachability.networkReachabilityStatus != .notReachable else { state = .noConnection return } + updateProgress() + } - let progress = chainSyncProgress - + private func updateProgress() { + let progress = model.combinedSyncProgress if progress < kSyncingCompleteProgress { isSyncing = true @@ -261,18 +256,18 @@ extension SyncingActivityMonitor { syncLoop() } + private func addChainObserver(_ aName: NSNotification.Name?, _ aSelector: Selector) { + NotificationCenter.default.addObserver(self, selector: aSelector, name: aName, object: nil) + } + private func removeChainObserver(_ aName: NSNotification.Name?) { + NotificationCenter.default.removeObserver(self, name: aName, object: nil) + } + private func configureObserver() { - let notificationCenter = NotificationCenter.default - notificationCenter.addObserver(self, selector: #selector(chainManagerSyncStartedNotification(notification:)), - name: .chainManagerSyncStarted, object: nil) - notificationCenter.addObserver(self, selector: #selector(chainManagerParametersUpdatedNotification(notification:)), - name: .chainManagerParametersUpdated, object: nil) - notificationCenter.addObserver(self, selector: #selector(chainManagerSyncFinishedNotification(notification:)), - name: .chainManagerSyncFinished, object: nil) - notificationCenter.addObserver(self, selector: #selector(chainManagerSyncFailedNotification(notification:)), - name: .chainManagerSyncFailed, object: nil) - notificationCenter.addObserver(self, selector: #selector(chainManagerChainBlocksDidChangeNotification(notification:)), - name: .chainManagerChainSyncBlocksDidChange, object: nil) + addChainObserver(.chainManagerSyncStarted, #selector(chainManagerSyncStartedNotification(notification:))) + addChainObserver(.chainManagerSyncFinished, #selector(chainManagerSyncFinishedNotification(notification:))) + addChainObserver(.chainManagerSyncFailed, #selector(chainManagerSyncFailedNotification(notification:))) + addChainObserver(.chainManagerSyncStateChanged, #selector(chainManagerSyncStateChangedNotification(notification:))) } } @@ -280,7 +275,7 @@ extension SyncingActivityMonitor { extension SyncingActivityMonitor { private var chainSyncProgress: Double { - DWEnvironment.sharedInstance().currentChainManager.combinedSyncProgress + model.combinedSyncProgress } private var shouldStopSyncing: Bool { @@ -305,16 +300,12 @@ extension SyncingActivityMonitor { } extension Notification.Name { + // TODO: unused? static let syncStateChangedNotification: Notification.Name = .init(rawValue: "DWSyncStateChangedNotification") static let chainManagerSyncStarted: Notification.Name = .init(rawValue: "DSChainManagerSyncWillStartNotification") - static let chainManagerParametersUpdated: Notification - .Name = .init(rawValue: "DSChainManagerSyncParametersUpdatedNotification") static let chainManagerSyncFinished: Notification.Name = .init(rawValue: "DSChainManagerSyncFinishedNotification") static let chainManagerSyncFailed: Notification.Name = .init(rawValue: "DSChainManagerSyncFailedNotification") - static let chainManagerChainSyncBlocksDidChange: Notification - .Name = .init(rawValue: "DSChainChainSyncBlocksDidChangeNotification") - static let peerManagerConnectedPeersDidChange: Notification - .Name = .init(rawValue: "DSPeerManagerConnectedPeersDidChangeNotification") - + static let peerManagerConnectedPeersDidChange: Notification.Name = .init(rawValue: "DSPeerManagerConnectedPeersDidChangeNotification") + static let chainManagerSyncStateChanged: Notification.Name = .init(rawValue: "DSChainManagerSyncStateDidChangeNotification") } diff --git a/DashWallet/Sources/Categories/DSTransaction+DashWallet.swift b/DashWallet/Sources/Categories/DSTransaction+DashWallet.swift index d2e89e29f..804a7edcc 100644 --- a/DashWallet/Sources/Categories/DSTransaction+DashWallet.swift +++ b/DashWallet/Sources/Categories/DSTransaction+DashWallet.swift @@ -40,8 +40,8 @@ extension DSTransaction { let direction = direction switch direction { - case .moved: - amount = account!.amountReceivedFromTransaction(onExternalAddresses: self) + case .notAccountFunds, .moved: + amount = 0 case .sent: let amountSent = chain.amountSent(by: self) let amountReceived = chain.amountReceived(from: self) @@ -54,9 +54,7 @@ extension DSTransaction { let fee = feeUsed == UInt64.max ? 0 : feeUsed amount = amountSent - amountReceived - fee case .received: - amount = account!.amountReceived(from: self) - case .notAccountFunds: - amount = 0 + amount = account?.amountReceived(from: self) ?? 0 @unknown default: fatalError() } @@ -85,10 +83,7 @@ extension DSTransaction { } var direction: DSTransactionDirection { - let currentAccount = DWEnvironment.sharedInstance().currentAccount - let account = accounts.contains(where: { ($0 as! DSAccount) == currentAccount }) ? currentAccount : nil - - return account != nil ? chain.direction(of: self) : .notAccountFunds + return chain.direction(of: self) } var outputReceiveAddresses: [String] { @@ -99,7 +94,7 @@ extension DSTransaction { switch direction { case .moved, .sent, .received: - outputReceiveAddresses = account!.externalAddresses(of: self) + outputReceiveAddresses = account?.externalAddresses(of: self) ?? [] default: break } @@ -129,7 +124,7 @@ extension DSTransaction { @objc extension DSTransaction { var formattedShortTxDate: String { - DWDateFormatter.sharedInstance.shortString(from: date) + DWDateFormatter.sharedInstance.dateOnly(from: date) } var formattedLongTxDate: String { @@ -139,6 +134,10 @@ extension DSTransaction { var formattedISO8601TxDate: String { DWDateFormatter.sharedInstance.iso8601String(from: date) } + + var formattedShortTxTime: String { + DWDateFormatter.sharedInstance.timeOnly(from: date) + } var formattedDashAmountWithDirectionalSymbol: String { let formatted = dashAmount.formattedDashAmount @@ -151,7 +150,7 @@ extension DSTransaction { } func attributedDashAmount(with font: UIFont, color: UIColor = .dw_label()) -> NSAttributedString { - var formatted = formattedDashAmountWithDirectionalSymbol + let formatted = formattedDashAmountWithDirectionalSymbol return formatted.attributedAmountStringWithDashSymbol(tintColor: color, dashSymbolColor: color, font: font) } } @@ -186,22 +185,26 @@ extension DSTransactionDirection { return .dw_label() } } - - var icon: UIImage { + + var iconName: String { switch self { case .moved: - return UIImage(named: "tx.item.internal.icon")! + return "tx.item.internal.icon" case .sent: - return systemImage("arrow.up.circle.fill") + return "tx.item.sent.icon" case .received: - return systemImage("arrow.down.circle.fill") + return "tx.item.received.icon" case .notAccountFunds: - return systemImage("arrow.down.circle.fill") + return "tx.item.received.icon" @unknown default: fatalError() } } + var icon: UIImage { + return UIImage(named: iconName)! + } + private func systemImage(_ name: String) -> UIImage { let iconConfig = UIImage.SymbolConfiguration(pointSize: 50, weight: .regular, scale: .large) return UIImage(systemName: name, withConfiguration: iconConfig)! @@ -209,8 +212,6 @@ extension DSTransactionDirection { var directionSymbol: String { switch self { - case .moved: - return "⟲" case .received: return "+"; case .sent: @@ -226,10 +227,10 @@ extension DSTransactionDirection { return .dw_quaternaryText() case .sent: return .dw_darkTitle() - case .received: - return .dw_dashBlue() - case .notAccountFunds: + case .received, .notAccountFunds: return .dw_dashBlue() + @unknown default: + fatalError() } } } diff --git a/DashWallet/Sources/Models/DWDateFormatter.swift b/DashWallet/Sources/Models/DWDateFormatter.swift index 32e17c5e0..89faf6522 100644 --- a/DashWallet/Sources/Models/DWDateFormatter.swift +++ b/DashWallet/Sources/Models/DWDateFormatter.swift @@ -23,16 +23,17 @@ class DWDateFormatter: NSObject { private let shortDateFormatter: DateFormatter private let longDateFormatter: DateFormatter private let iso8601DateFormatter: DateFormatter - private let dateOnlyFormatter: DateFormatter + private let timeOnlyFormatter: DateFormatter + private let dayOfWeekFormatter: DateFormatter private override init() { let locale = Locale.current shortDateFormatter = DateFormatter() - shortDateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "MMMdjmma", options: 0, locale: locale) + shortDateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "dd MMMM", options: 0, locale: locale) longDateFormatter = DateFormatter() - longDateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "yyyyMMMdjmma", options: 0, locale: locale) + longDateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "dd MMMM, yyyy", options: 0, locale: locale) iso8601DateFormatter = DateFormatter() let enUSPOSIXLocale = Locale(identifier: "en_US_POSIX") @@ -40,12 +41,28 @@ class DWDateFormatter: NSObject { iso8601DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'" iso8601DateFormatter.calendar = Calendar(identifier: .gregorian) - dateOnlyFormatter = DateFormatter() - shortDateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "MMMd", options: 0, locale: locale) + timeOnlyFormatter = DateFormatter() + timeOnlyFormatter.timeStyle = .short + timeOnlyFormatter.dateStyle = .none + timeOnlyFormatter.locale = Locale.current + + dayOfWeekFormatter = DateFormatter() + dayOfWeekFormatter.dateFormat = "EEEE" } - func shortString(from date: Date) -> String { + func dateOnly(from date: Date, useRelative: Bool = true) -> String { let calendar = Calendar.current + + if useRelative { + if calendar.isDateInToday(date) { + return NSLocalizedString("Today", comment: "") + } + + if calendar.isDateInYesterday(date) { + return NSLocalizedString("Yesterday", comment: "") + } + } + let nowYear = calendar.component(.year, from: Date()) let dateYear = calendar.component(.year, from: date) @@ -56,18 +73,22 @@ class DWDateFormatter: NSObject { func longString(from date: Date) -> String { return longDateFormatter.string(from: date) } - - func dateOnly(from date: Date) -> String { - return shortDateFormatter.string(from: date) - } func iso8601String(from date: Date) -> String { return iso8601DateFormatter.string(from: date) } + + func timeOnly(from dateTime: Date) -> String { + return timeOnlyFormatter.string(from: dateTime) + } + + func dayOfWeek(from date: Date) -> String { + return dayOfWeekFormatter.string(from: date).capitalized + } } @objc extension DWDateFormatter { @objc func shortStringFromDate(_ date: Date) -> String { - return shortString(from: date) + return dateOnly(from: date) } } diff --git a/DashWallet/Sources/Models/Taxes/Services/TaxReportGenerator.swift b/DashWallet/Sources/Models/Taxes/Services/TaxReportGenerator.swift index a8ac448f4..1a74f57bc 100644 --- a/DashWallet/Sources/Models/Taxes/Services/TaxReportGenerator.swift +++ b/DashWallet/Sources/Models/Taxes/Services/TaxReportGenerator.swift @@ -134,6 +134,7 @@ enum TaxReportGenerator { return taxCategoryString case .sentQuantity: let fee = transactionDirection == .sent ? transaction.feeUsed : 0 + guard transaction.dashAmount != UInt64.max else { return "" } let dashAmount = transaction.dashAmount + fee let formattedNumber = NumberFormatter.csvDashFormatter.string(from: dashAmount.dashAmount as NSDecimalNumber) ?? "" return isOutcoming ? formattedNumber : "" @@ -143,6 +144,7 @@ enum TaxReportGenerator { return isOutcoming ? kSource : "" case .receivedQuantity: let fee = transactionDirection == .sent ? transaction.feeUsed : 0 + guard transaction.dashAmount != UInt64.max else { return "" } let dashAmount = transaction.dashAmount + fee let formattedNumber = NumberFormatter.csvDashFormatter.string(from: dashAmount.dashAmount as NSDecimalNumber) ?? "" return isOutcoming ? "" : formattedNumber diff --git a/DashWallet/Sources/Models/Transactions/Model/Transaction.swift b/DashWallet/Sources/Models/Transactions/Model/Transaction.swift index 4485184b1..c3885496b 100644 --- a/DashWallet/Sources/Models/Transactions/Model/Transaction.swift +++ b/DashWallet/Sources/Models/Transactions/Model/Transaction.swift @@ -19,7 +19,7 @@ import Foundation // MARK: - Transaction -class Transaction: TransactionDataItem { +class Transaction: TransactionDataItem, Identifiable { enum State { case ok case invalid @@ -36,6 +36,10 @@ class Transaction: TransactionDataItem { case masternodeRevoke case blockchainIdentityRegistration } + + var id: String { + tx.txHashHexString + } let tx: DSTransaction var direction: DSTransactionDirection { _direction } @@ -56,14 +60,22 @@ class Transaction: TransactionDataItem { var specialInfoAddresses: [String: Int]? - var dashAmount: UInt64 { _dashAmount } private lazy var _dashAmount: UInt64 = tx.dashAmount + + var dashAmount: UInt64 { _dashAmount } + var signedDashAmount: Int64 { + if dashAmount == UInt64.max { + return Int64.max + } + + return direction == .sent ? -Int64(dashAmount) : Int64(dashAmount) + } var fiatAmount: String { storedFiatAmount } - lazy var storedFiatAmount = userInfo?.fiatAmountString(from: _dashAmount) ?? NSLocalizedString("Not available", comment: ""); + private lazy var storedFiatAmount = userInfo?.fiatAmountString(from: _dashAmount) ?? NSLocalizedString("Not available", comment: ""); lazy var userInfo: TxUserInfo? = TxUserInfoDAOImpl.shared.get(by: tx.txHashData) @@ -72,10 +84,16 @@ class Transaction: TransactionDataItem { var state: State! { _state } private lazy var _state: State! = { + if tx is DWTransactionStub { + return .ok + } + let chain = DWEnvironment.sharedInstance().currentChain let currentAccount = DWEnvironment.sharedInstance().currentAccount; let account = tx.accounts.contains(where: { ($0 as! DSAccount) == currentAccount }) ? currentAccount : nil - + if account == nil { + return .invalid + } let blockHeight = chain.lastTerminalBlockHeight let instantSendReceived = tx.instantSendReceived let processingInstantSend = tx.hasUnverifiedInstantSendLock @@ -116,13 +134,17 @@ class Transaction: TransactionDataItem { return .ok }() + private lazy var _shortDateString: String = tx.formattedShortTxDate var date: Date var shortDateString: String { _shortDateString } - - private lazy var _shortDateString: String = tx.formattedShortTxDate - + + private lazy var _shortTimeString: String = tx.formattedShortTxTime + var shortTimeString: String { + _shortTimeString + } + var stateTitle: String { switch transactionType { case .classic: @@ -153,7 +175,7 @@ class Transaction: TransactionDataItem { return NSLocalizedString("DashPay Upgrade Fee", comment: "") } } - + init(transaction: DSTransaction) { tx = transaction date = transaction.date @@ -187,3 +209,18 @@ extension Transaction { tx is DSCoinbaseTransaction } } + +extension Transaction: Hashable { + // MARK: - Equatable + static func == (lhs: Transaction, rhs: Transaction) -> Bool { + return lhs.tx.txHashData == rhs.tx.txHashData + } + + // MARK: - Hashable + func hash(into hasher: inout Hasher) { + hasher.combine(dashAmount) + hasher.combine(direction) + hasher.combine(transactionType) + hasher.combine(date) + } +} diff --git a/DashWallet/Sources/UI/CrowdNode/Tx Details/CNCreateAccountTxDetailsViewController.swift b/DashWallet/Sources/UI/CrowdNode/Tx Details/CNCreateAccountTxDetailsViewController.swift deleted file mode 100644 index 6f2608f10..000000000 --- a/DashWallet/Sources/UI/CrowdNode/Tx Details/CNCreateAccountTxDetailsViewController.swift +++ /dev/null @@ -1,117 +0,0 @@ -// -// Created by tkhp -// Copyright © 2023 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 - - -// MARK: - CNCreateAccountTxDetailsViewController - -final class CNCreateAccountTxDetailsViewController: BaseTxDetailsViewController { - enum Section: Int, CaseIterable { - case header - case details - case txs - } - - private let model: CNCreateAccountTxDetailsModel - private var sections: [Section] = Section.allCases - - @objc - convenience init(transactions: [DSTransaction]) { - self.init(transactions: transactions.map { Transaction(transaction: $0) }) - } - - init(transactions: [Transaction]) { - model = CNCreateAccountTxDetailsModel(transactions: transactions) - - super.init(nibName: nil, bundle: nil) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func configureHierarchy() { - super.configureHierarchy() - - let item = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(closeAction)) - navigationItem.rightBarButtonItem = item - - tableView.registerClass(for: CNCreateAccountTxDetailsInfoCell.self) - tableView.registerClass(for: CNCreateAccountTxDetailsTxItemCell.self) - tableView.delegate = self - tableView.dataSource = self - } -} - -// MARK: UITableViewDataSource - -extension CNCreateAccountTxDetailsViewController: UITableViewDataSource { - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let section = sections[indexPath.section] - - switch section { - case .header: - let cell = tableView.dequeueReusableCell(withIdentifier: TxDetailHeaderCell.reuseIdentifier, - for: indexPath) as! TxDetailHeaderCell - cell.updateView(with: model) - cell.selectionStyle = .none - cell.backgroundColor = .clear - cell.backgroundView?.backgroundColor = .clear - - return cell - case .details: - let cell = tableView.dequeueReusableCell(withIdentifier: CNCreateAccountTxDetailsInfoCell.reuseIdentifier, for: indexPath) - cell.selectionStyle = .none - return cell - case .txs: - let tx = model.transactions[indexPath.row] - let cell = tableView.dequeueReusableCell(withIdentifier: CNCreateAccountTxDetailsTxItemCell.reuseIdentifier, for: indexPath) as! CNCreateAccountTxDetailsTxItemCell - cell.update(with: tx) - cell.selectionStyle = .none - return cell - } - } - - func numberOfSections(in tableView: UITableView) -> Int { - sections.count - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - let section = sections[section] - - switch section { - case .header, .details: - return 1 - case .txs: - return model.transactions.count - } - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let section = sections[indexPath.section] - - switch section { - case .txs: - let tx = model.transactions[indexPath.row] - let vc = TXDetailViewController(model: .init(transaction: tx)) - navigationController?.pushViewController(vc, animated: true) - default: - break - } - } -} diff --git a/DashWallet/Sources/UI/CrowdNode/Tx Details/CrowdNodeGroupedTransactionsScreen.swift b/DashWallet/Sources/UI/CrowdNode/Tx Details/CrowdNodeGroupedTransactionsScreen.swift new file mode 100644 index 000000000..9aeeed20e --- /dev/null +++ b/DashWallet/Sources/UI/CrowdNode/Tx Details/CrowdNodeGroupedTransactionsScreen.swift @@ -0,0 +1,123 @@ +// +// 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. +// + +import SwiftUI + +struct CrowdNodeGroupedTransactionsScreen: View { + @State private var currentTag: String? + + let model: CNCreateAccountTxDetailsModel! + @Binding var backNavigationRequested: Bool + var onShowBackButton: (Bool) -> Void + + var body: some View { + ScrollView { + LazyVStack(spacing: 0) { + Section { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text(model.title) + .font(.subheadline) + .frame(maxWidth: .infinity, alignment: .leading) + + DashAmount(amount: model.netAmount, font: .largeTitle, dashSymbolFactor: 0.7) + .frame(maxWidth: .infinity, alignment: .leading) + + Text(model.fiatAmount) + .frame(maxWidth: .infinity, alignment: .leading) + .font(.caption) + .foregroundColor(.tertiaryText) + } + .frame(maxWidth: .infinity) + + Spacer() + + Icon(name: .custom(model.iconName)) + .padding(10) + .frame(width: 50, height: 50) + .background(Color.secondaryBackground) + .clipShape(.circle) + } + .padding(.horizontal, 25) + .padding(.bottom, 5) + } + + Section { + VStack(alignment: .leading, spacing: 6) { + Text(NSLocalizedString("Why do I see all these transactions?", comment: "Crowdnode")) + .font(.footnote) + .fontWeight(.medium) + .foregroundStyle(Color.tertiaryText) + .frame(maxWidth: .infinity, alignment: .leading) + + Text(NSLocalizedString("Your CrowdNode account was created using these transactions. ", comment: "Crowdnode")) + .font(.subheadline) + .foregroundColor(Color.primaryText) + .frame(maxWidth: .infinity, alignment: .leading) + } + .padding(15) + .frame(maxWidth: .infinity) + .background(Color.secondaryBackground) + .cornerRadius(10) + .padding() + } + + + Section { + VStack(spacing: 0) { + ForEach(model.transactions, id: \.self) { txItem in + ZStack { + NavigationLink( + destination: TXDetailVCWrapper( + tx: txItem, + navigateBack: $backNavigationRequested, + onDismissed: { + onShowBackButton(false) + } + ).navigationBarHidden(true), + tag: txItem.txHashHexString, + selection: self.$currentTag + ) { + SwiftUI.EmptyView() + }.opacity(0) + + TransactionPreview( + title: txItem.stateTitle, + subtitle: txItem.shortDateString, + icon: .custom(txItem.direction.iconName), + dashAmount: txItem.signedDashAmount, + overrideFiatAmount: txItem.fiatAmount + ) { + self.currentTag = txItem.txHashHexString + onShowBackButton(true) + } + } + } + } + .padding(5) + .background(Color.secondaryBackground) + .cornerRadius(10) + .padding(.horizontal, 15) + .shadow(color: .shadow, radius: 10, x: 0, y: 5) + } + } + } + .frame(maxHeight: .infinity) + .background(Color.primaryBackground) + } +} + diff --git a/DashWallet/Sources/UI/CrowdNode/Tx Details/Model/CNCreateAccountTxDetailsModel.swift b/DashWallet/Sources/UI/CrowdNode/Tx Details/Model/CNCreateAccountTxDetailsModel.swift index ca45607c4..7120bebbb 100644 --- a/DashWallet/Sources/UI/CrowdNode/Tx Details/Model/CNCreateAccountTxDetailsModel.swift +++ b/DashWallet/Sources/UI/CrowdNode/Tx Details/Model/CNCreateAccountTxDetailsModel.swift @@ -17,25 +17,22 @@ import Foundation -final class CNCreateAccountTxDetailsModel: TxDetailHeaderCellDataProvider { - var title: String { NSLocalizedString("CrowdNode Account", comment: "") } - var icon: UIImage { UIImage(named: "tx.item.cn.icon")! } - var tintColor: UIColor { .dw_label() } - +final class CNCreateAccountTxDetailsModel { + var title: String { NSLocalizedString("CrowdNode · Account", comment: "") } + var iconName = "tx.item.cn.icon" + var fiatAmount: String { (try? CurrencyExchanger.shared.convertDash(amount: dashAmount.dashAmount, to: App.fiatCurrency).formattedFiatAmount) ?? NSLocalizedString("Updating Price", comment: "Updating Price") } func dashAmountString(with font: UIFont) -> NSAttributedString { - let sign: String = netAmount < 0 ? "-" : "+" - return (sign + dashAmount.formattedDashAmount).attributedAmountStringWithDashSymbol(tintColor: .dw_label(), font: .dw_font(forTextStyle: .largeTitle)) + return NSAttributedString("") } var transactions: [Transaction] - - private var dashAmount: UInt64 - private var netAmount: Int64 + private(set) var dashAmount: UInt64 + private(set) var netAmount: Int64 init(transactions: [Transaction]) { self.transactions = transactions diff --git a/DashWallet/Sources/UI/CrowdNode/Tx Details/Views/Cells.swift b/DashWallet/Sources/UI/CrowdNode/Tx Details/Views/Cells.swift deleted file mode 100644 index c1844cffa..000000000 --- a/DashWallet/Sources/UI/CrowdNode/Tx Details/Views/Cells.swift +++ /dev/null @@ -1,107 +0,0 @@ -// -// Created by tkhp -// Copyright © 2023 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 - -// MARK: - CNCreateAccountTxDetailsTxItemCell - -final class CNCreateAccountTxDetailsTxItemCell: UITableViewCell { - private let txItemView: TransactionItemView - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - txItemView = TransactionItemView() - - super.init(style: style, reuseIdentifier: reuseIdentifier) - - configureHierarchy() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func update(with transaction: TransactionDataItem) { - txItemView.update(with: transaction) - } - - private func configureHierarchy() { - txItemView.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(txItemView) - - contentView.backgroundColor = .dw_background() - - NSLayoutConstraint.activate([ - txItemView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 11), - txItemView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 15), - txItemView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -15), - txItemView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -11), - ]) - } -} - -// MARK: - CNCreateAccountTxDetailsInfoCell - -final class CNCreateAccountTxDetailsInfoCell: UITableViewCell { - private let topLabel: UILabel - private let infoLabel: UILabel - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - topLabel = UILabel() - infoLabel = UILabel() - - super.init(style: style, reuseIdentifier: reuseIdentifier) - - configureHierarchy() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func configureHierarchy() { - contentView.backgroundColor = .dw_background() - - let stackView = UIStackView() - stackView.translatesAutoresizingMaskIntoConstraints = false - stackView.axis = .vertical - stackView.alignment = .fill - stackView.distribution = .fill - stackView.spacing = 5 - contentView.addSubview(stackView) - - topLabel.translatesAutoresizingMaskIntoConstraints = false - topLabel.textColor = .dw_secondaryText() - topLabel.font = .dw_font(forTextStyle: .subheadline) - topLabel.text = NSLocalizedString("Why do I see all these transactions?", comment: "Crowdnode") - stackView.addArrangedSubview(topLabel) - - infoLabel.translatesAutoresizingMaskIntoConstraints = false - infoLabel.textColor = .dw_label() - infoLabel.font = .dw_font(forTextStyle: .caption1) - infoLabel.text = NSLocalizedString("Your CrowdNode account was created using these transactions. ", comment: "Crowdnode") - infoLabel.numberOfLines = 0 - infoLabel.lineBreakMode = .byWordWrapping - stackView.addArrangedSubview(infoLabel) - - NSLayoutConstraint.activate([ - stackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10), - stackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 15), - stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -15), - stackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10), - ]) - } -} diff --git a/DashWallet/Sources/UI/CrowdNode/Views/Tx Cell/CNCreateAccountCell.swift b/DashWallet/Sources/UI/CrowdNode/Views/Tx Cell/CNCreateAccountCell.swift deleted file mode 100644 index 1a6ccc98f..000000000 --- a/DashWallet/Sources/UI/CrowdNode/Views/Tx Cell/CNCreateAccountCell.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// Created by tkhp -// Copyright © 2023 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 -final class CNCreateAccountCell: UITableViewCell { - @IBOutlet var txCountLabel: UILabel! - @IBOutlet var amountLabel: UILabel! - @IBOutlet var fiatAmountLabel: UILabel! - @IBOutlet var txTitleLabel: UILabel! - @IBOutlet var dateLabel: UILabel! - - func update(with transactions: [Transaction]) { - txTitleLabel.text = NSLocalizedString("CrowdNode Account", comment: "Crowdnode") - txCountLabel.text = String(format: NSLocalizedString("%d transaction(s)", comment: "#bc-ignore!"), transactions.count) - dateLabel.text = transactions.last?.shortDateString - - let amount: Int64 = transactions.reduce(0) { partialResult, tx in - var r = partialResult - let direction = tx.direction - - switch direction { - case .sent: - r -= Int64(tx.dashAmount) - case .received: - r += Int64(tx.dashAmount) - default: - break - } - - return r - } - - let sign: String = amount < 0 ? "-" : "+" - let dashAmount = UInt64(abs(amount)) - - amountLabel.attributedText = (sign + abs(amount).formattedDashAmount) - .attributedAmountStringWithDashSymbol(tintColor: .dw_label(), font: .dw_font(forTextStyle: .subheadline)) - - fiatAmountLabel - .text = (try? CurrencyExchanger.shared.convertDash(amount: dashAmount.dashAmount, to: App.fiatCurrency).formattedFiatAmount) ?? - NSLocalizedString("Updating Price", comment: "Updating Price") - } -} diff --git a/DashWallet/Sources/UI/CrowdNode/Views/Tx Cell/CNCreateAccountCell.xib b/DashWallet/Sources/UI/CrowdNode/Views/Tx Cell/CNCreateAccountCell.xib deleted file mode 100644 index e8bc0e4c0..000000000 --- a/DashWallet/Sources/UI/CrowdNode/Views/Tx Cell/CNCreateAccountCell.xib +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DashWallet/Sources/UI/Home/HomeViewController.swift b/DashWallet/Sources/UI/Home/HomeViewController.swift index 80a221566..525ed1913 100644 --- a/DashWallet/Sources/UI/Home/HomeViewController.swift +++ b/DashWallet/Sources/UI/Home/HomeViewController.swift @@ -16,6 +16,7 @@ // import UIKit +import SwiftUI class HomeViewController: DWBasePayViewController { var model: DWHomeProtocol! @@ -231,16 +232,16 @@ class HomeViewController: DWBasePayViewController { extension HomeViewController: DWRootEditProfileViewControllerDelegate { func editProfileViewController(_ controller: DWRootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) { model.dashPayModel.userProfile.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) - controller.dismiss(animated: true, completion: nil) + controller.navigateBack(animated: true, completion: nil) } func editProfileViewControllerDidCancel(_ controller: DWRootEditProfileViewController) { - controller.dismiss(animated: true, completion: nil) + controller.navigateBack(animated: true, completion: nil) } } #endif -// MARK: - DWHomeViewDelegate +// MARK: - HomeViewDelegate extension HomeViewController: HomeViewDelegate { func homeView(_ homeView: HomeView, showTxFilter sender: UIView) { @@ -251,17 +252,7 @@ extension HomeViewController: HomeViewDelegate { let controller = SyncingAlertViewController() present(controller, animated: true, completion: nil) } - - func homeView(_ homeView: HomeView, didSelectTransaction transaction: DSTransaction) { - presentTransactionDetails(transaction) - } - - func homeView(_ homeView: HomeView, showCrowdNodeTxs transactions: [DSTransaction]) { - let controller = CNCreateAccountTxDetailsViewController(transactions: transactions) - let nvc = BaseNavigationController(rootViewController: controller) - present(nvc, animated: true, completion: nil) - } - + func homeViewShowDashPayRegistrationFlow(_ homeView: HomeView) { let action = ShortcutAction(type: .createUsername) performAction(for: action, sender: homeView) diff --git a/DashWallet/Sources/UI/Home/Models/TransactionListDataSource.swift b/DashWallet/Sources/UI/Home/Models/TransactionListDataSource.swift index 26242c82d..5ddd7acb1 100644 --- a/DashWallet/Sources/UI/Home/Models/TransactionListDataSource.swift +++ b/DashWallet/Sources/UI/Home/Models/TransactionListDataSource.swift @@ -17,170 +17,25 @@ import UIKit -// MARK: - TransactionListDataItem - -enum TransactionListDataItem { - case tx(Transaction) - case crowdnode([Transaction]) -} - -extension TransactionListDataItem { - var date: Date { - switch self { - case .crowdnode(let txs): - return txs.last!.date - case .tx(let tx): - return tx.date - } - } -} - // MARK: - TransactionListDataSource @objc(DWTransactionListDataSource) -final class TransactionListDataSource: NSObject, UITableViewDataSource { +final class TransactionListDataSource: NSObject { @objc var items: [DSTransaction] - - var _items: [TransactionListDataItem] = [] - + var registrationStatus: DWDPRegistrationStatus? - + @objc var retryDelegate: DWDPRegistrationErrorRetryDelegate? - - @objc - var isEmpty: Bool { - _items.isEmpty - } - + var showsRegistrationStatus: Bool { registrationStatus != nil } - - private let crowdNodeTxSet: FullCrowdNodeSignUpTxSet - + @objc init(transactions: [DSTransaction], registrationStatus: DWDPRegistrationStatus?) { - items = transactions - - let crowdNodeTxSet = FullCrowdNodeSignUpTxSet() - var items: [TransactionListDataItem] = transactions.compactMap { - if crowdNodeTxSet.isComplete { return .tx(Transaction(transaction: $0)) } - - return crowdNodeTxSet.tryInclude(tx: $0) ? nil : .tx(Transaction(transaction: $0)) - } - - if !crowdNodeTxSet.transactions.isEmpty { - let crowdNodeTxs: [Transaction] = crowdNodeTxSet.transactions.values - .sorted(by: { $0.date > $1.date }) - .map { Transaction(transaction: $0) } - - items.insert(.crowdnode(crowdNodeTxs), at: 0) - items.sort(by: { $0.date > $1.date }) - } - - _items = items.sorted(by: { $0.date > $1.date }) - - self.crowdNodeTxSet = crowdNodeTxSet + self.items = transactions self.registrationStatus = registrationStatus } - - @objc - @available(*, deprecated, message: "We try to don't use DSTransaction in UI") - func transactionForIndexPath(_ indexPath: IndexPath) -> DSTransaction? { - let index: Int - if showsRegistrationStatus { - if indexPath.row == 0 { - return nil - } - index = indexPath.row - 1 - } else { - index = indexPath.row - } - - let item = _items[index] - - switch item { - case .tx(let tx): - return tx.tx - default: - return nil - } - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - let itemsCount = _items.count - if showsRegistrationStatus { - return 1 + itemsCount - } else { - return itemsCount - } - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - if showsRegistrationStatus && indexPath.row == 0 { - if registrationStatus!.failed { - let cellID = DWDPRegistrationErrorTableViewCell.dw_reuseIdentifier - let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! DWDPRegistrationErrorTableViewCell - cell.status = registrationStatus - cell.delegate = retryDelegate - return cell - } - if registrationStatus!.state == .done { - let cellID = DWDPRegistrationDoneTableViewCell.dw_reuseIdentifier - let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! DWDPRegistrationDoneTableViewCell - cell.status = registrationStatus - return cell - } else { - let cellID = DWDPRegistrationStatusTableViewCell.dw_reuseIdentifier - let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! DWDPRegistrationStatusTableViewCell - cell.status = registrationStatus - return cell - } - } else { - let tx = _items[indexPath.row] - switch tx { - case .crowdnode(let txs): - let cellId = "CNCreateAccountCell" - let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! CNCreateAccountCell - cell.update(with: txs) - return cell - case .tx(let tx): - let cell = tableView.dequeueReusableCell(type: TxListTableViewCell.self, for: indexPath) - cell.update(with: tx) - return cell - } - } - } -} - -// MARK: - TransactionListDataItemType - -@objc(DWTransactionListDataItemType) -enum TransactionListDataItemType: Int { - case tx - case crowdnode -} - -extension TransactionListDataSource { - @objc - func itemType(by indexPath: IndexPath) -> TransactionListDataItemType { - if case TransactionListDataItem.tx = _items[indexPath.row] { - return .tx - } - - return .crowdnode - } - - @objc - func crowdnodeTxs() -> [DSTransaction] { - crowdNodeTxSet.transactions.values.sorted(by: { $0.date > $1.date }) - } -} - -extension FullCrowdNodeSignUpTxSet { - var isComplete: Bool { - transactions.count == 5 - } } diff --git a/DashWallet/Sources/UI/Home/Syncing Views/Alert/SyncingAlertContentView.swift b/DashWallet/Sources/UI/Home/Syncing Views/Alert/SyncingAlertContentView.swift index eae517abe..4380ec856 100644 --- a/DashWallet/Sources/UI/Home/Syncing Views/Alert/SyncingAlertContentView.swift +++ b/DashWallet/Sources/UI/Home/Syncing Views/Alert/SyncingAlertContentView.swift @@ -17,6 +17,9 @@ import UIKit +private let kChainManagerNotificationChainKey = "DSChainManagerNotificationChainKey" +private let kChainManagerNotificationSyncStateKey = "DSChainManagerNotificationSyncStateKey" + // MARK: - SyncingAlertContentViewDelegate protocol SyncingAlertContentViewDelegate: AnyObject { @@ -95,6 +98,10 @@ final class SyncingAlertContentView: UIView { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + deinit { + NotificationCenter.default.removeObserver(self) + } @objc func okButtonAction(sender: UIButton) { @@ -104,30 +111,25 @@ final class SyncingAlertContentView: UIView { func update(with syncState: SyncingActivityMonitor.State) { switch syncState { case .syncing, .syncDone: - let environment = DWEnvironment.sharedInstance() - let chain = environment.currentChain - let chainManager = environment.currentChainManager - // We give a 6 block window, just in case a new block comes in - let atTheEndOfInitialTerminalBlocksAndSyncingMasternodeList = chain.lastTerminalBlockHeight >= chain.estimatedBlockHeight - 6 && chainManager.masternodeManager - .masternodeListRetrievalQueueCount > 0 && chainManager.syncPhase == .initialTerminalBlocks - let atTheEndOfSyncBlocksAndSyncingMasternodeList = chain.lastSyncBlockHeight >= chain.estimatedBlockHeight - 6 && chainManager.masternodeManager - .masternodeListRetrievalQueueCount > 0 && chainManager.syncPhase == .synced - if atTheEndOfInitialTerminalBlocksAndSyncingMasternodeList || atTheEndOfSyncBlocksAndSyncingMasternodeList { - var remaining: UInt = 0 - - if chainManager.masternodeManager.masternodeListRetrievalQueueCount > chainManager.masternodeManager.masternodeListRetrievalQueueMaxAmount { - remaining = 0 - } else { - remaining = chainManager.masternodeManager.masternodeListRetrievalQueueMaxAmount - chainManager.masternodeManager.masternodeListRetrievalQueueCount - } - - subtitleLabel.text = String(format: NSLocalizedString("masternode list #%d of %d", comment: ""), remaining, chainManager.masternodeManager.masternodeListRetrievalQueueMaxAmount) + let model = SyncingActivityMonitor.shared.model; + let kind = model.kind; + if kind == .headers { + subtitleLabel.text = localized( + template: "header #%d of %d", + model.lastTerminalBlockHeight, + model.estimatedBlockHeight) + } else if kind == .masternodes { + let masternodeListsReceived = model.masternodeListSyncInfo.retrievalQueueCount + let masternodeListsTotal = model.masternodeListSyncInfo.retrievalQueueMaxAmount + subtitleLabel.text = localized( + template: "masternode list #%d of %d", + masternodeListsReceived > masternodeListsTotal ? 0 : masternodeListsTotal - masternodeListsTotal, + masternodeListsTotal) } else { - if chainManager.syncPhase == .initialTerminalBlocks { - subtitleLabel.text = String(format: NSLocalizedString("header #%d of %d", comment: ""), chain.lastTerminalBlockHeight, chain.estimatedBlockHeight) - } else { - subtitleLabel.text = String(format: NSLocalizedString("block #%d of %d", comment: ""), chain.lastSyncBlockHeight, chain.estimatedBlockHeight) - } + subtitleLabel.text = localized( + template: "block #%d of %d", + model.lastSyncBlockHeight, + model.estimatedBlockHeight) } case .syncFailed: @@ -166,5 +168,32 @@ final class SyncingAlertContentView: UIView { func hideAnimation() { syncingImageView.layer.removeAllAnimations() } -} + + private func localized( + template: String, + _ arguments: any CVarArg... + ) -> String { + String( + format: NSLocalizedString( + template, + comment: ""), + arguments) + } + + private func addChainObserver(_ aName: NSNotification.Name?, _ aSelector: Selector) { + NotificationCenter.default.addObserver(self, selector: aSelector, name: aName, object: nil) + } + + private func configureObserver() { + addChainObserver(.chainManagerSyncStateChanged, #selector(chainManagerSyncStateChangedNotification(notification:))) + } + @objc + func chainManagerSyncStateChangedNotification(notification: Notification) { + guard let chain = notification.userInfo?[kChainManagerNotificationChainKey], DWEnvironment.sharedInstance().currentChain.isEqual(chain), + let model = notification.userInfo?[kChainManagerNotificationSyncStateKey] as? DSSyncState else { + return + } + self.update(with: model.combinedSyncProgress) + } +} diff --git a/DashWallet/Sources/UI/Home/Syncing Views/Sync View/SyncView.swift b/DashWallet/Sources/UI/Home/Syncing Views/Sync View/SyncView.swift index 271431bba..d6c44eba3 100644 --- a/DashWallet/Sources/UI/Home/Syncing Views/Sync View/SyncView.swift +++ b/DashWallet/Sources/UI/Home/Syncing Views/Sync View/SyncView.swift @@ -92,26 +92,22 @@ final class SyncView: UIView { // TODO: Don't access DashSync directly if syncState == .syncing || syncState == .syncDone { if viewStateSeeingBlocks { - let environment = DWEnvironment.sharedInstance() - let chain = environment.currentChain - let chainManager = environment.currentChainManager - if chainManager.syncPhase == .initialTerminalBlocks { - if chain.lastTerminalBlockHeight >= chain.estimatedBlockHeight && chainManager.masternodeManager.masternodeListRetrievalQueueCount != 0 { - descriptionLabel.text = String(format: NSLocalizedString("masternode list #%d of %d", comment: ""), - chainManager.masternodeManager.masternodeListRetrievalQueueMaxAmount - chainManager.masternodeManager - .masternodeListRetrievalQueueCount, - chainManager.masternodeManager.masternodeListRetrievalQueueMaxAmount) - } - else { - descriptionLabel.text = String(format: NSLocalizedString("header #%d of %d", comment: ""), - chain.lastTerminalBlockHeight, - chain.estimatedBlockHeight) - } - } - else { + let model = SyncingActivityMonitor.shared.model; + let kind = model.kind; + if kind == .headers { + descriptionLabel.text = String(format: NSLocalizedString("header #%d of %d", comment: ""), + model.lastTerminalBlockHeight, + model.estimatedBlockHeight) + } else if kind == .masternodes { + let masternodeListsReceived = model.masternodeListSyncInfo.retrievalQueueCount + let masternodeListsTotal = model.masternodeListSyncInfo.retrievalQueueMaxAmount + descriptionLabel.text = String(format: NSLocalizedString("masternode list #%d of %d", comment: ""), + masternodeListsReceived > masternodeListsTotal ? 0 : masternodeListsTotal - masternodeListsTotal, + masternodeListsTotal) + } else { descriptionLabel.text = String(format: NSLocalizedString("block #%d of %d", comment: ""), - chain.lastSyncBlockHeight, - chain.estimatedBlockHeight) + model.lastSyncBlockHeight, + model.estimatedBlockHeight) } } else { diff --git a/DashWallet/Sources/UI/Home/Views/Cells/SyncingHeaderView.swift b/DashWallet/Sources/UI/Home/Views/Cells/SyncingHeaderView.swift index c76d18acc..52ce3edda 100644 --- a/DashWallet/Sources/UI/Home/Views/Cells/SyncingHeaderView.swift +++ b/DashWallet/Sources/UI/Home/Views/Cells/SyncingHeaderView.swift @@ -19,7 +19,6 @@ import UIKit // MARK: - SyncingHeaderViewDelegate -@objc(DWSyncingHeaderViewDelegate) protocol SyncingHeaderViewDelegate: AnyObject { func syncingHeaderView(_ view: SyncingHeaderView, filterButtonAction sender: UIButton) func syncingHeaderView(_ view: SyncingHeaderView, syncingButtonAction sender: UIButton) @@ -27,10 +26,8 @@ protocol SyncingHeaderViewDelegate: AnyObject { // MARK: - SyncingHeaderView -@objc(DWSyncingHeaderView) final class SyncingHeaderView: UITableViewHeaderFooterView { - @objc weak var delegate: SyncingHeaderViewDelegate? @objc diff --git a/DashWallet/Sources/UI/Home/Views/Cells/TxListEmptyTableViewCell.xib b/DashWallet/Sources/UI/Home/Views/Cells/TxListEmptyTableViewCell.xib deleted file mode 100644 index 25b7ebdb7..000000000 --- a/DashWallet/Sources/UI/Home/Views/Cells/TxListEmptyTableViewCell.xib +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DashWallet/Sources/UI/Home/Views/Cells/TxListTableViewCell.swift b/DashWallet/Sources/UI/Home/Views/Cells/TxListTableViewCell.swift deleted file mode 100644 index f6fe9f3ec..000000000 --- a/DashWallet/Sources/UI/Home/Views/Cells/TxListTableViewCell.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// Created by tkhp -// Copyright © 2023 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 - -final class TxListTableViewCell: UITableViewCell { - @IBOutlet var txItemView: TransactionItemView! - - func update(with transaction: TransactionDataItem) { - txItemView.update(with: transaction) - } - - override func setHighlighted(_ highlighted: Bool, animated: Bool) { - super.setHighlighted(highlighted, animated: animated) - - dw_pressedAnimation(.light, pressed: highlighted) - } -} diff --git a/DashWallet/Sources/UI/Home/Views/Cells/TxListTableViewCell.xib b/DashWallet/Sources/UI/Home/Views/Cells/TxListTableViewCell.xib deleted file mode 100644 index 678502423..000000000 --- a/DashWallet/Sources/UI/Home/Views/Cells/TxListTableViewCell.xib +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DashWallet/Sources/UI/Home/Views/Home Header View/HomeHeaderView.swift b/DashWallet/Sources/UI/Home/Views/Home Header View/HomeHeaderView.swift index a88af9768..3b74592f3 100644 --- a/DashWallet/Sources/UI/Home/Views/Home Header View/HomeHeaderView.swift +++ b/DashWallet/Sources/UI/Home/Views/Home Header View/HomeHeaderView.swift @@ -32,7 +32,6 @@ protocol HomeHeaderViewDelegate: AnyObject { // MARK: - HomeHeaderView -@objc(DWHomeHeaderView) final class HomeHeaderView: UIView { public weak var delegate: HomeHeaderViewDelegate? diff --git a/DashWallet/Sources/UI/Home/Views/HomeView.swift b/DashWallet/Sources/UI/Home/Views/HomeView.swift index 3c574a7fd..95b028243 100644 --- a/DashWallet/Sources/UI/Home/Views/HomeView.swift +++ b/DashWallet/Sources/UI/Home/Views/HomeView.swift @@ -16,17 +16,15 @@ // import UIKit +import SwiftUI // MARK: - HomeViewDelegate -@objc(DWHomeViewDelegate) protocol HomeViewDelegate: AnyObject { func homeView(_ homeView: HomeView, showTxFilter sender: UIView) func homeView(_ homeView: HomeView, showSyncingStatus sender: UIView) - func homeView(_ homeView: HomeView, didSelectTransaction transaction: DSTransaction) func homeViewShowDashPayRegistrationFlow(_ homeView: HomeView) func homeView(_ homeView: HomeView, showReclassifyYourTransactionsFlowWithTransaction transaction: DSTransaction) - func homeView(_ homeView: HomeView, showCrowdNodeTxs transactions: [DSTransaction]) #if DASHPAY func homeView(_ homeView: HomeView, didUpdateProfile identity: DSBlockchainIdentity?, unreadNotifications: UInt) @@ -37,17 +35,14 @@ protocol HomeViewDelegate: AnyObject { final class HomeView: UIView, DWHomeModelUpdatesObserver, DWDPRegistrationErrorRetryDelegate { - @objc weak var delegate: HomeViewDelegate? private(set) var headerView: HomeHeaderView! - private(set) var topOverscrollView: UIView! - private(set) var tableView: UITableView! - - weak var syncingHeaderView: SyncingHeaderView? + private(set) var syncingHeaderView: SyncingHeaderView! // Strong ref to current dataSource to make sure it always exists while tableView uses it var currentDataSource: TransactionListDataSource? + var viewModel: HomeViewModel = HomeViewModel() @objc var model: DWHomeProtocol? { @@ -80,60 +75,35 @@ final class HomeView: UIView, DWHomeModelUpdatesObserver, DWDPRegistrationErrorR headerView?.balanceView.hideBalanceIfNeeded() } - override func layoutSubviews() { - super.layoutSubviews() - - let size = bounds.size - topOverscrollView.frame = CGRect(x: 0.0, y: -size.height, width: size.width, height: size.height) - - if let tableHeaderView = tableView.tableHeaderView { - let headerSize = tableHeaderView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize) - if tableHeaderView.frame.height != headerSize.height { - tableHeaderView.frame = CGRect(x: 0.0, y: 0.0, width: headerSize.width, height: headerSize.height) - tableView.tableHeaderView = tableHeaderView - } - } - } - private func setupView() { backgroundColor = UIColor.dw_secondaryBackground() headerView = HomeHeaderView(frame: CGRect.zero) headerView.delegate = self - - topOverscrollView = UIView(frame: CGRect.zero) - topOverscrollView.backgroundColor = UIColor.dw_dashNavigationBlue() - - tableView = UITableView(frame: bounds, style: .plain) - tableView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - tableView.tableHeaderView = headerView - tableView.backgroundColor = UIColor.dw_secondaryBackground() - tableView.dataSource = self - tableView.delegate = self - tableView.rowHeight = UITableView.automaticDimension - tableView.estimatedRowHeight = 74.0 - tableView.sectionHeaderHeight = UITableView.automaticDimension - tableView.estimatedSectionHeaderHeight = 64.0 - tableView.separatorStyle = .none - // NOTE: tableView.contentInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: DW_TABBAR_NOTCH, right: 0.0) - tableView.addSubview(topOverscrollView) - addSubview(tableView) - - let cellIds = [ - TxListEmptyTableViewCell.reuseIdentifier, - TxListTableViewCell.reuseIdentifier, - DWDPRegistrationStatusTableViewCell.dw_reuseIdentifier, - DWDPRegistrationErrorTableViewCell.dw_reuseIdentifier, - DWDPRegistrationDoneTableViewCell.dw_reuseIdentifier, - ] - for cellId in cellIds { - let nib = UINib(nibName: cellId, bundle: nil) - tableView.register(nib, forCellReuseIdentifier: cellId) - } - - let nib = UINib(nibName: "CNCreateAccountCell", bundle: nil) - tableView.register(nib, forCellReuseIdentifier: "CNCreateAccountCell") - tableView.registerClassforHeaderFooterView(for: SyncingHeaderView.self) + + syncingHeaderView = SyncingHeaderView(frame: CGRect.zero) + syncingHeaderView.delegate = self + + let content = TransactionList( + viewModel: self.viewModel, + balanceHeader: { UIViewWrapper(uiView: self.headerView) }, + syncingHeader: { UIViewWrapper(uiView: self.syncingHeaderView) } + ) + let swiftUIController = UIHostingController(rootView: content) + swiftUIController.view.backgroundColor = UIColor.dw_secondaryBackground() + + self.addSubview(swiftUIController.view) + swiftUIController.view.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + swiftUIController.view.leadingAnchor.constraint(equalTo: self.leadingAnchor), + swiftUIController.view.trailingAnchor.constraint(equalTo: self.trailingAnchor), + swiftUIController.view.topAnchor.constraint(equalTo: self.topAnchor), + swiftUIController.view.bottomAnchor.constraint(equalTo: self.bottomAnchor) + ]) + + swiftUIController.didMove(toParent: nil) + NotificationCenter.default.addObserver(self, selector: #selector(setNeedsLayout), name: UIContentSizeCategory.didChangeNotification, @@ -157,13 +127,8 @@ final class HomeView: UIView, DWHomeModelUpdatesObserver, DWDPRegistrationErrorR func homeModel(_ model: DWHomeProtocol, didUpdate dataSource: TransactionListDataSource, shouldAnimate: Bool) { currentDataSource = dataSource dataSource.retryDelegate = self - - if dataSource.isEmpty { - tableView.dataSource = self - } else { - tableView.dataSource = dataSource - } - tableView.reloadData() + + self.viewModel.updateItems(transactions: dataSource.items) headerView.reloadBalance() reloadShortcuts() @@ -289,53 +254,182 @@ extension HomeView: SyncingHeaderViewDelegate { } } -// MARK: UITableViewDataSource, UITableViewDelegate +struct TxPreviewModel: Identifiable, Equatable { + var id: String + var title: String + var timeFormatted: String + var dateFormatted: String + var details: String? + var icon: IconName + var dashAmount: String + var fiatAmount: String + var date: Date + + static func == (lhs: TxPreviewModel, rhs: TxPreviewModel) -> Bool { + return lhs.id == rhs.id + } +} -extension HomeView: UITableViewDataSource, UITableViewDelegate { - // MARK: - UITableViewDataSource +struct TransactionList: View { + @State private var selectedTxDataItem: TransactionListDataItem? = nil + + @StateObject var viewModel: HomeViewModel + @ViewBuilder var balanceHeader: () -> Content + @ViewBuilder var syncingHeader: () -> Content + + private let topOverscrollSize: CGFloat = 1000 // Fixed value for top overscroll area - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - 1 + var body: some View { + ScrollView { + ZStack { Color.navigationBarColor } // Top overscroll area + .frame(height: topOverscrollSize) + .padding(EdgeInsets(top: -topOverscrollSize, leading: 0, bottom: 0, trailing: 0)) + + LazyVStack(pinnedViews: [.sectionHeaders]) { + balanceHeader() + .frame(height: viewModel.hasNetwork ? 250 : 335) + + syncingHeader() + .frame(height: 50) + + if viewModel.txItems.isEmpty { + Text(NSLocalizedString("There are no transactions to display", comment: "")) + .font(.caption) + .foregroundColor(Color.primary.opacity(0.5)) + .padding(.top, 20) + } else { + ForEach(viewModel.txItems, id: \.0.key) { key, value in + Section(header: SectionHeader(key) + .padding(.bottom, -24) + ) { + VStack(spacing: 0) { + ForEach(value, id: \.id) { txItem in + TransactionPreviewFrom(txItem: txItem) + .padding(.horizontal, 5) + } + } + .padding(.bottom, 4) + .background(Color.secondaryBackground) + .clipShape(RoundedShape(corners: [.bottomLeft, .bottomRight], radii: 10)) + .padding(15) + .shadow(color: .shadow, radius: 10, x: 0, y: 5) + } + } + } + } + .padding(EdgeInsets(top: -20, leading: 0, bottom: 0, trailing: 0)) + } + .sheet(item: $selectedTxDataItem) { item in + TransactionDetailsSheet(item: item) + } } - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cellId = TxListEmptyTableViewCell.reuseIdentifier - let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) - return cell + @ViewBuilder + private func SectionHeader(_ dateKey: DateKey) -> some View { + VStack { + Spacer() + + HStack { + Text(dateKey.key) + .font(.footnote) + .fontWeight(.medium) + .padding(.leading, 15) + + Spacer() + + Text(DWDateFormatter.sharedInstance.dayOfWeek(from: dateKey.date)) + .font(.footnote) + .foregroundStyle(Color.tertiaryText) + .padding(.trailing, 15) + } + .padding(.bottom, 6) + } + .frame(height: 38) + .frame(maxWidth: .infinity) + .background(Color.secondaryBackground) + .clipShape(RoundedShape(corners: [.topLeft, .topRight], radii: 10)) + .padding(.horizontal, 15) } - - // MARK: - UITableViewDelegate - - func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let headerView = tableView.dequeueReusableHeaderFooterView(type: SyncingHeaderView.self) - headerView.delegate = self - syncingHeaderView = headerView - return headerView + + @ViewBuilder + private func TransactionPreviewFrom( + txItem txDataItem: TransactionListDataItem + ) -> some View { + switch txDataItem { + case .crowdnode(let txItems): + TransactionPreview( + title: NSLocalizedString("CrowdNode · Account", comment: "Crowdnode"), + subtitle: txItems.last?.shortTimeString ?? "", + topText: String(format: NSLocalizedString("%d transaction(s)", comment: "#bc-ignore!"), txItems.count), + icon: .custom("tx.item.cn.icon"), + dashAmount: self.crowdNodeAmount(txItems) + ) { + self.selectedTxDataItem = txDataItem + } + .frame(height: 80) + + case .tx(let txItem): + TransactionPreview( + title: txItem.stateTitle, + subtitle: txItem.shortTimeString, + icon: .custom(txItem.direction.iconName), + dashAmount: txItem.signedDashAmount, + overrideFiatAmount: txItem.fiatAmount + ) { + self.selectedTxDataItem = txDataItem + } + } } + + private func crowdNodeAmount(_ transactions: [Transaction]) -> Int64 { + return transactions.reduce(0) { partialResult, tx in + var r = partialResult + let direction = tx.direction + + switch direction { + case .sent: + r -= Int64(tx.dashAmount) + case .received: + r += Int64(tx.dashAmount) + default: + break + } - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - - guard let currentDataSource, - !currentDataSource.isEmpty else { return } - - let type = currentDataSource.itemType(by: indexPath) - - if type == .crowdnode { - delegate?.homeView(self, showCrowdNodeTxs: currentDataSource.crowdnodeTxs()) - return + return r } + } +} - if let transaction = currentDataSource.transactionForIndexPath(indexPath) { - delegate?.homeView(self, didSelectTransaction: transaction) - } else { // registration status cell - delegate?.homeViewShowDashPayRegistrationFlow(self) +struct TransactionDetailsSheet: View { + @State private var showBackButton: Bool = false + @State private var backNavigationRequested: Bool = false + + var item: TransactionListDataItem + + var body: some View { + BottomSheet(showBackButton: $showBackButton, onBackButtonPressed: { + backNavigationRequested = true + }) { + TxDetailsDestination(from: item) } + .background(Color.primaryBackground) } - - // MARK: - UIScrollViewDelegate - - func scrollViewDidScroll(_ scrollView: UIScrollView) { - headerView.parentScrollViewDidScroll(scrollView) + + @ViewBuilder + private func TxDetailsDestination( + from txDataItem: TransactionListDataItem + ) -> some View { + switch txDataItem { + case .crowdnode(let txItems): + CrowdNodeGroupedTransactionsScreen( + model: CNCreateAccountTxDetailsModel(transactions: txItems), + backNavigationRequested: $backNavigationRequested, + onShowBackButton: { show in + showBackButton = show + } + ) + case .tx(let txItem): + TXDetailVCWrapper(tx: txItem, navigateBack: $backNavigationRequested) + } } } diff --git a/DashWallet/Sources/UI/Home/Views/HomeViewModel.swift b/DashWallet/Sources/UI/Home/Views/HomeViewModel.swift new file mode 100644 index 000000000..f6b3df166 --- /dev/null +++ b/DashWallet/Sources/UI/Home/Views/HomeViewModel.swift @@ -0,0 +1,118 @@ +// +// 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. +// + +import Foundation + +class HomeViewModel: ObservableObject { + @Published var txItems: Array<(DateKey, [TransactionListDataItem])> = [] + @Published var hasNetwork: Bool = true + private var model: SyncModel = SyncModelImpl() + + init() { + model.networkStatusDidChange = { status in + self.hasNetwork = status == .online + } + self.hasNetwork = model.networkStatus == .online + } + + func updateItems(transactions: [DSTransaction]) { + Task.detached { + let crowdNodeTxSet = FullCrowdNodeSignUpTxSet() + var items: [TransactionListDataItem] = transactions.compactMap { + if crowdNodeTxSet.isComplete { return .tx(Transaction(transaction: $0)) } + + return crowdNodeTxSet.tryInclude(tx: $0) ? nil : .tx(Transaction(transaction: $0)) + } + + if !crowdNodeTxSet.transactions.isEmpty { + let crowdNodeTxs: [Transaction] = crowdNodeTxSet.transactions.values + .sorted { $0.date > $1.date } + .map { Transaction(transaction: $0) } + + items.insert(.crowdnode(crowdNodeTxs), at: 0) + } + + let groupedItems = Dictionary( + grouping: items.sorted(by: { $0.date > $1.date }), + by: { DateKey(key: DWDateFormatter.sharedInstance.dateOnly(from: $0.date), date: $0.date) } + ) + + let arary = groupedItems.sorted(by: { kv1, kv2 in + kv1.key.date > kv2.key.date + }) + + DispatchQueue.main.async { + self.txItems = arary + } + } + } +} + +// MARK: - TransactionListDataItem + +enum TransactionListDataItem { + case tx(Transaction) + case crowdnode([Transaction]) +} + +extension TransactionListDataItem: Identifiable { + var tx: Transaction { + switch self { + case .crowdnode(let txs): + return txs.first! + case .tx(let tx): + return tx + } + } + + var id: String { + switch self { + case .crowdnode(let txs): + return txs.first!.txHashHexString + case .tx(let tx): + return tx.txHashHexString + } + } + + var date: Date { + switch self { + case .crowdnode(let txs): + return txs.last!.date + case .tx(let tx): + return tx.date + } + } +} + +struct DateKey: Hashable { + let key: String + let date: Date + + static func == (lhs: DateKey, rhs: DateKey) -> Bool { + return lhs.key == rhs.key + } + + func hash(into hasher: inout Hasher) { + hasher.combine(key) + } +} + +extension FullCrowdNodeSignUpTxSet { + var isComplete: Bool { + transactions.count == 5 + } +} diff --git a/DashWallet/Sources/UI/Menu/Settings/About/DWAboutViewController.m b/DashWallet/Sources/UI/Menu/Settings/About/DWAboutViewController.m index fa8994630..1191e0c7b 100644 --- a/DashWallet/Sources/UI/Menu/Settings/About/DWAboutViewController.m +++ b/DashWallet/Sources/UI/Menu/Settings/About/DWAboutViewController.m @@ -98,7 +98,7 @@ - (void)viewDidLoad { object:nil]; [notificationCenter addObserver:self selector:@selector(updateStatusNotification:) - name:DSChainNewChainTipBlockNotification + name:DSChainManagerSyncStateDidChangeNotification object:nil]; [notificationCenter addObserver:self selector:@selector(updateStatusNotification:) diff --git a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift index bed3b61f5..a0fc3e770 100644 --- a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift @@ -209,6 +209,9 @@ struct ToolsMenuContent: View { } } ) + .background(Color.secondaryBackground) + .cornerRadius(8) + .shadow(color: .shadow, radius: 10, x: 0, y: 5) .listRowSeparator(.hidden) .listRowBackground(Color.clear) } @@ -222,7 +225,7 @@ struct ToolsMenuContent: View { }) { if #available(iOS 16.0, *) { ZenLedgerInfoSheet(safariLink: $safariLink) - .presentationDetents([.height(440)]) + .presentationDetents([.height(450)]) } else { ZenLedgerInfoSheet(safariLink: $safariLink) } diff --git a/DashWallet/Sources/UI/Menu/Tools/ZenLedger/ZenLedgerInfoSheet.swift b/DashWallet/Sources/UI/Menu/Tools/ZenLedger/ZenLedgerInfoSheet.swift index a6776a7df..c3a48be1d 100644 --- a/DashWallet/Sources/UI/Menu/Tools/ZenLedger/ZenLedgerInfoSheet.swift +++ b/DashWallet/Sources/UI/Menu/Tools/ZenLedger/ZenLedgerInfoSheet.swift @@ -28,7 +28,7 @@ struct ZenLedgerInfoSheet: View { @Binding var safariLink: String? var body: some View { - BottomSheet { + BottomSheet(showBackButton: Binding.constant(false)) { TextIntro( icon: .custom("zenledger_large"), buttonLabel: NSLocalizedString("Export all transactions", comment: "ZenLedger"), diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfoViewController.swift b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfoViewController.swift index fd312554d..983de99d8 100644 --- a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfoViewController.swift +++ b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfoViewController.swift @@ -123,25 +123,29 @@ final class BackupInfoViewController: BaseViewController { @IBAction func backupButtonAction() { - if type == .setup { + let authManager = DSAuthenticationManager.sharedInstance() + + if type == .setup && authManager.didAuthenticate { showSeedPhraseViewController() } else { - DSAuthenticationManager.sharedInstance() - .authenticate(withPrompt: nil, - usingBiometricAuthentication: false, - alertIfLockout: true) { [weak self] authenticated, _, _ in - guard authenticated else { - return - } - - guard let self else { - return - } + authManager.authenticate(withPrompt: nil, + usingBiometricAuthentication: false, + alertIfLockout: true) { [weak self] authenticated, _, _ in + guard authenticated else { + return + } + guard let self else { + return + } + + if type != .setup { self.seedPhraseModel = DWPreviewSeedPhraseModel() self.seedPhraseModel.getOrCreateNewWallet() - self.showSeedPhraseViewController() } + + self.showSeedPhraseViewController() + } } } @@ -194,7 +198,7 @@ extension BackupInfoViewController { } private func showSeedPhraseViewController() { - let controller = DWBackupSeedPhraseViewController(model: seedPhraseModel) + let controller = BackupSeedPhraseViewController(model: seedPhraseModel) controller.shouldCreateNewWalletOnScreenshot = shouldCreateNewWalletOnScreenshot controller.delegate = delegate navigationController?.pushViewController(controller, animated: true) diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/Seed/BackupSeedPhraseViewController.swift b/DashWallet/Sources/UI/Setup/SecureWallet/Seed/BackupSeedPhraseViewController.swift new file mode 100644 index 000000000..60b700898 --- /dev/null +++ b/DashWallet/Sources/UI/Setup/SecureWallet/Seed/BackupSeedPhraseViewController.swift @@ -0,0 +1,66 @@ +// +// Created by Andrew Podkovyrin +// Copyright © 2019 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 Foundation + +import UIKit + +class BackupSeedPhraseViewController: DWPreviewSeedPhraseViewController { + + var shouldCreateNewWalletOnScreenshot: Bool = false + + override func viewDidLoad() { + super.viewDidLoad() + + self.title = NSLocalizedString("Backup Wallet", comment: "A noun. Used as a title.") + self.actionButton?.isEnabled = false + + self.contentView.displayType = DWSeedPhraseDisplayType.backup + + #if SNAPSHOT + self.actionButton.accessibilityIdentifier = "seedphrase_continue_button" + #endif + } + + var actionButtonTitle: String { + return NSLocalizedString("Continue", comment: "") + } + + @objc override func actionButtonAction(_ sender: Any) { + let seedPhrase = self.contentView.model + + let controller = DWVerifySeedPhraseViewController(seedPhrase: seedPhrase!) + controller.delegate = self.delegate + self.navigationController?.pushViewController(controller, animated: true) + } + + override func screenshotAlertOKAction() { + if !self.shouldCreateNewWalletOnScreenshot { + return + } + + self.model.clearAllWallets() + + self.feedbackGenerator.notificationOccurred(.error) + + let seedPhrase = self.model.getOrCreateNewWallet() + self.contentView.updateSeedPhraseModelAnimated(seedPhrase) + self.contentView.showScreenshotDetectedErrorMessage() + + self.actionButton?.isEnabled = false + } +} diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWBackupSeedPhraseViewController.m b/DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWBackupSeedPhraseViewController.m deleted file mode 100644 index e656d152b..000000000 --- a/DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWBackupSeedPhraseViewController.m +++ /dev/null @@ -1,73 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 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 "DWBackupSeedPhraseViewController.h" - -#import "DWPreviewSeedPhraseModel.h" -#import "DWPreviewSeedPhraseViewController+DWProtected.h" -#import "DWSeedPhraseModel.h" -#import "DWVerifySeedPhraseViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@implementation DWBackupSeedPhraseViewController - -- (NSString *)actionButtonTitle { - return NSLocalizedString(@"Continue", nil); -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.title = NSLocalizedString(@"Backup Wallet", @"A noun. Used as a title."); - self.actionButton.enabled = NO; - - self.contentView.displayType = DWSeedPhraseDisplayType_Backup; - -#if SNAPSHOT - [(UIBarButtonItem *)self.actionButton setAccessibilityIdentifier:@"seedphrase_continue_button"]; -#endif /* SNAPSHOT */ -} - -- (void)actionButtonAction:(id)sender { - DWSeedPhraseModel *seedPhrase = self.contentView.model; - - DWVerifySeedPhraseViewController *controller = [DWVerifySeedPhraseViewController - controllerWithSeedPhrase:seedPhrase]; - controller.delegate = self.delegate; - [self.navigationController pushViewController:controller animated:YES]; -} - -- (void)screenshotAlertOKAction { - if (self.shouldCreateNewWalletOnScreenshot == NO) { - return; - } - - [self.model clearAllWallets]; - - [self.feedbackGenerator notificationOccurred:UINotificationFeedbackTypeError]; - - DWSeedPhraseModel *seedPhrase = [self.model getOrCreateNewWallet]; - [self.contentView updateSeedPhraseModelAnimated:seedPhrase]; - [self.contentView showScreenshotDetectedErrorMessage]; - - self.actionButton.enabled = NO; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/SwiftUI Components/BottomSheet.swift b/DashWallet/Sources/UI/SwiftUI Components/BottomSheet.swift index edb28624e..8a1c1ec91 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/BottomSheet.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/BottomSheet.swift @@ -19,12 +19,25 @@ import SwiftUI struct BottomSheet: View { @Environment(\.presentationMode) private var presentationMode + + @Binding var showBackButton: Bool + var onBackButtonPressed: (() -> Void)? = nil @ViewBuilder var content: () -> Content var body: some View { VStack { HStack(alignment: .top) { - ZStack { }.frame(maxWidth: 50) + if showBackButton { + Button { + onBackButtonPressed?() + } label: { + Image("backarrow") + .offset(x: -5, y: 5) + } + .frame(maxWidth: 50, maxHeight: .infinity) + } else { + ZStack { }.frame(maxWidth: 50) + } Spacer() @@ -49,7 +62,11 @@ struct BottomSheet: View { .frame(height: 50) .padding(.horizontal, 10) - content().padding(.top, 4) + NavigationView { + content() + .navigationBarHidden(true) + } + .padding(.top, 4) } } } diff --git a/DashWallet/Sources/UI/SwiftUI Components/Color+DWStyle.swift b/DashWallet/Sources/UI/SwiftUI Components/Color+DWStyle.swift index 49ebc8687..1ac7c567b 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/Color+DWStyle.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/Color+DWStyle.swift @@ -34,6 +34,10 @@ extension Color { Color("DashBlueColor") } + static var navigationBarColor: Color { + Color("DashNavigationBarBlueColor") + } + static var buttonRed: Color { Color("ButtonRedColor") } @@ -50,12 +54,16 @@ extension Color { Color("Gray300") } - static var background: Color { - Color("BackgroundColor") + // Background and secondary background are mismatched in the assests. + // The correct values per the design: + // Primary background: #F7F7F7 + // Secondary background: #FFFFFF + static var primaryBackground: Color { + Color("SecondaryBackgroundColor") } static var secondaryBackground: Color { - Color("SecondaryBackgroundColor") + Color("BackgroundColor") } static var shadow: Color { diff --git a/DashWallet/Sources/UI/SwiftUI Components/DashAmount.swift b/DashWallet/Sources/UI/SwiftUI Components/DashAmount.swift new file mode 100644 index 000000000..1139d9121 --- /dev/null +++ b/DashWallet/Sources/UI/SwiftUI Components/DashAmount.swift @@ -0,0 +1,87 @@ +// +// 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. +// + +import SwiftUI + +struct DashAmount: View { + var amount: Int64 + var font: Font = .footnote + var dashSymbolFactor: CGFloat = 1 + + var body: some View { + if amount == Int64.max || amount == Int64.min { + Text(NSLocalizedString("Not available", comment: "")) + .font(.footnote) + .fontWeight(.medium) + .foregroundColor(.primaryText) + } else { + let formattedAbsAmount = abs(amount).formattedDashAmount + let dashSymbolLast = formattedAbsAmount.first!.isNumber + let directionSymbol = directionSymbol(of: amount) + let cleanedAbsAmount = cleanAmount(formattedAbsAmount) + + HStack(spacing: 0) { + Text(directionSymbol) + .fontWeight(.medium) + + if !dashSymbolLast { + DashSymbol() + .padding(.leading, 2) + } + + Text(cleanedAbsAmount) + .fontWeight(.medium) + .lineLimit(1) + .padding(.leading, 2) + + if dashSymbolLast { + DashSymbol() + } + } + .font(font) + .foregroundColor(.primaryText) + } + } + + @ViewBuilder + private func DashSymbol() -> some View { + Image("icon_dash_currency") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: font.pointSize * dashSymbolFactor, height: font.pointSize * dashSymbolFactor) + } + + private func directionSymbol(of dashAmount: Int64) -> String { + if dashAmount > 0 { + return "+" + } else if dashAmount < 0 { + return "-" + } else { + return "" + } + } + + private func cleanAmount(_ amount: String) -> String { + var result = amount + + if let dashSymbolRange = result.range(of: DASH) { + result.removeSubrange(dashSymbolRange) + } + + return result + } +} diff --git a/DashWallet/Sources/UI/SwiftUI Components/Extensions.swift b/DashWallet/Sources/UI/SwiftUI Components/Extensions.swift index 43aa7b026..5f131e461 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/Extensions.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/Extensions.swift @@ -28,3 +28,38 @@ extension View { } } } + +extension Font { + var pointSize: CGFloat { + return self.uiFont.pointSize + } + + var uiFont: UIFont { + switch self { + case .largeTitle: + return UIFont.preferredFont(forTextStyle: .largeTitle) + case .title: + return UIFont.preferredFont(forTextStyle: .title1) + case .title2: + return UIFont.preferredFont(forTextStyle: .title2) + case .title3: + return UIFont.preferredFont(forTextStyle: .title3) + case .headline: + return UIFont.preferredFont(forTextStyle: .headline) + case .subheadline: + return UIFont.preferredFont(forTextStyle: .subheadline) + case .body: + return UIFont.preferredFont(forTextStyle: .body) + case .callout: + return UIFont.preferredFont(forTextStyle: .callout) + case .footnote: + return UIFont.preferredFont(forTextStyle: .footnote) + case .caption: + return UIFont.preferredFont(forTextStyle: .caption1) + case .caption2: + return UIFont.preferredFont(forTextStyle: .caption2) + default: + return UIFont.systemFont(ofSize: UIFont.systemFontSize) + } + } +} diff --git a/DashWallet/Sources/UI/SwiftUI Components/Icon.swift b/DashWallet/Sources/UI/SwiftUI Components/Icon.swift index b1c8a1fae..bb3e884bf 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/Icon.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/Icon.swift @@ -40,7 +40,6 @@ struct Icon: View { Image(name) .resizable() .scaledToFit() - .imageScale(.medium) } } } diff --git a/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift b/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift index 87132d64b..4060f0a0d 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift @@ -17,27 +17,62 @@ import SwiftUI +typealias TransactionPreview = MenuItem + struct MenuItem: View { var title: String var subtitle: String? = nil var details: String? = nil + var topText: String? = nil var icon: IconName? = nil + var secondaryIcon: IconName? = nil var showInfo: Bool = false var showChevron: Bool = false + var dashAmount: Int64? = nil + var overrideFiatAmount: String? = nil var isToggled: Binding? = nil var action: (() -> Void)? = nil var body: some View { HStack(spacing: 4) { if let icon = icon { - Icon(name: icon) - .frame(width: 36, height: 36) + ZStack(alignment: .leading) { + Icon(name: icon) + .frame(width: 28, height: 28) + .padding(0) + + if let secondaryIcon = secondaryIcon { + VStack { + Spacer() + HStack { + Spacer() + Icon(name: secondaryIcon) + .padding(2) + .frame(width: 18, height: 18) + .background(Color.secondaryBackground) + .clipShape(.circle) + .offset(x: 2, y: 2) + } + } + } + } + .frame(width: 36, height: 36) } VStack(alignment: .leading, spacing: 0) { + if let topText = topText { + Text(topText) + .font(.caption) + .lineSpacing(3) + .foregroundColor(.tertiaryText) + .padding(.leading, 4) + .padding(.bottom, 2) + } + HStack(spacing: 6) { Text(title) - .font(Font.system(size: 14).weight(.medium)) + .font(.subheadline) + .fontWeight(.medium) .lineSpacing(3) .foregroundColor(.primaryText) @@ -45,27 +80,27 @@ struct MenuItem: View { Image(systemName: "info.circle.fill") .foregroundColor(.gray300) .imageScale(.small) + } } - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.leading, 8) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.leading, 4) - if let subtitle = subtitle { - Text(subtitle) - .font(Font.system(size: 12)) - .lineSpacing(3) - .foregroundColor(.tertiaryText) - .padding(.leading, 8) - .padding(.top, 2) - } + if let subtitle = subtitle { + Text(subtitle) + .font(.caption) + .lineSpacing(3) + .foregroundColor(.tertiaryText) + .padding(.leading, 4) + .padding(.top, 2) + } - if let details = details { - Text(details) - .font(Font.system(size: 12)) - .lineSpacing(3) - .foregroundColor(.tertiaryText) - .padding(.leading, 8) - .padding(.top, 2) + if let details = details { + Text(details) + .font(.caption) + .lineSpacing(3) + .foregroundColor(.tertiaryText) + .padding(.leading, 4) + .padding(.top, 2) } } .frame(maxWidth: .infinity) @@ -80,20 +115,42 @@ struct MenuItem: View { .imageScale(.small) .foregroundColor(Color.gray) .padding(.trailing, 10) + } else { + VStack(alignment: .trailing) { + if let dashAmount = dashAmount { + DashAmount(amount: dashAmount) + + if dashAmount != 0 && dashAmount != Int64.max && dashAmount != Int64.min { + if let overriden = overrideFiatAmount { + Text(overriden) + .font(.caption) + .foregroundColor(.secondaryText) + } else { + FormattedFiatText(from: dashAmount) + } + } + } + } } } + .contentShape(Rectangle()) .padding(10) .frame(maxWidth: .infinity, minHeight: 66) - .background(Color.background) - .cornerRadius(8) - .shadow(color: .shadow, radius: 10, x: 0, y: 5) .onTapGesture { action?() } } + + @ViewBuilder + private func FormattedFiatText(from dashAmount: Int64) -> some View { + let text = (try? CurrencyExchanger.shared.convertDash(amount: abs(dashAmount.dashAmount), to: App.fiatCurrency).formattedFiatAmount) ?? NSLocalizedString("Not available", comment: "") + + Text(text) + .font(.caption) + .foregroundColor(.secondaryText) + } } - #Preview { MenuItem( title: "Title", diff --git a/DashWallet/Sources/UI/SwiftUI Components/ModalDialog.swift b/DashWallet/Sources/UI/SwiftUI Components/ModalDialog.swift index aff92ee62..2b3ff7788 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/ModalDialog.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/ModalDialog.swift @@ -108,7 +108,7 @@ struct ModalDialog: View { .padding(.top, 24) } .padding(20) - .background(Color.background) + .background(Color.secondaryBackground) .cornerRadius(16) .shadow(radius: 10) .frame(maxWidth: 340) diff --git a/DashWallet/Sources/UI/Home/Views/Cells/TxListEmptyTableViewCell.swift b/DashWallet/Sources/UI/SwiftUI Components/Shape.swift similarity index 55% rename from DashWallet/Sources/UI/Home/Views/Cells/TxListEmptyTableViewCell.swift rename to DashWallet/Sources/UI/SwiftUI Components/Shape.swift index e9daf1e57..b07c5e9ef 100644 --- a/DashWallet/Sources/UI/Home/Views/Cells/TxListEmptyTableViewCell.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/Shape.swift @@ -1,6 +1,6 @@ -// -// Created by PT -// Copyright © 2023 Dash Core Group. All rights reserved. +// +// 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. @@ -15,16 +15,18 @@ // limitations under the License. // -import UIKit - -class TxListEmptyTableViewCell: UITableViewCell { - - @IBOutlet var placeholderLabel: UILabel! +import SwiftUI - override func awakeFromNib() { - super.awakeFromNib() +struct RoundedShape: Shape { + let corners: UIRectCorner + let radii: CGFloat - placeholderLabel?.font = UIFont.preferredFont(forTextStyle: .footnote) - placeholderLabel?.text = NSLocalizedString("There are no transactions to display", comment: "") + func path(in rect: CGRect) -> Path { + let path = UIBezierPath( + roundedRect: rect, + byRoundingCorners: corners, + cornerRadii: CGSize(width: radii, height: radii) + ) + return Path(path.cgPath) } } diff --git a/DashWallet/Sources/UI/SwiftUI Components/Toast.swift b/DashWallet/Sources/UI/SwiftUI Components/Toast.swift index f1ce6f8aa..1eb0fff47 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/Toast.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/Toast.swift @@ -47,16 +47,16 @@ struct ToastView: View { if let text = actionText, let action = action { DashButton(text: text, style: .plain, size: .extraSmall, stretch: false, action: action) - .overrideForegroundColor(Color.background) + .overrideForegroundColor(Color.primaryBackground) } if let icon = closeButtonIcon, let action = closeAction { DashButton(leadingIcon: icon, style: .plain, size: .small, stretch: false, action: action) - .overrideForegroundColor(Color.background) + .overrideForegroundColor(Color.primaryBackground) } } .padding(.horizontal, 8) - .foregroundColor(Color.background) + .foregroundColor(Color.primaryBackground) .background(Color.primaryText.opacity(0.9)) .cornerRadius(10) } diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWBackupSeedPhraseViewController.h b/DashWallet/Sources/UI/SwiftUI Components/Wrapper.swift similarity index 61% rename from DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWBackupSeedPhraseViewController.h rename to DashWallet/Sources/UI/SwiftUI Components/Wrapper.swift index e25b7ef19..d7c86915b 100644 --- a/DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWBackupSeedPhraseViewController.h +++ b/DashWallet/Sources/UI/SwiftUI Components/Wrapper.swift @@ -1,6 +1,6 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. +// +// 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. @@ -15,14 +15,14 @@ // limitations under the License. // -#import "DWPreviewSeedPhraseViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWBackupSeedPhraseViewController : DWPreviewSeedPhraseViewController - -@property (nonatomic, assign) BOOL shouldCreateNewWalletOnScreenshot; +import SwiftUI -@end +struct UIViewWrapper: UIViewRepresentable { + let uiView: UIView! + + func makeUIView(context: Context) -> UIView { + return uiView + } -NS_ASSUME_NONNULL_END + func updateUIView(_ uiView: UIView, context: Context) { } +} diff --git a/DashWallet/Sources/UI/Tx/Details/TxDetailViewController.swift b/DashWallet/Sources/UI/Tx/Details/TxDetailViewController.swift index f16db7cab..0deea7dd4 100644 --- a/DashWallet/Sources/UI/Tx/Details/TxDetailViewController.swift +++ b/DashWallet/Sources/UI/Tx/Details/TxDetailViewController.swift @@ -16,6 +16,7 @@ // import UIKit +import SwiftUI // MARK: - TxDetailDisplayType @@ -355,3 +356,43 @@ class SuccessTxDetailViewController: TXDetailViewController, NavigationBarDispla ]) } } + +// MARK: - SwiftUI wrapper +struct TXDetailVCWrapper: UIViewControllerRepresentable { + @Environment(\.presentationMode) private var presentationMode + + let tx: Transaction + @Binding var navigateBack: Bool + var onDismissed: (() -> Void)? = nil + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeUIViewController(context: Context) -> some UIViewController { + let vc = TXDetailViewController(model: .init(transaction: tx)) + return vc + } + + func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { + if navigateBack { + context.coordinator.dismissView() + navigateBack = false + onDismissed?() + } + } + + class Coordinator: NSObject { + var parent: TXDetailVCWrapper + + init(_ parent: TXDetailVCWrapper) { + self.parent = parent + } + + func dismissView() { + DispatchQueue.main.async { + self.parent.presentationMode.wrappedValue.dismiss() + } + } + } +} diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index d202ef190..4449c8b33 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "بطاقة إئتمان"; -/* Crowdnode */ -"CrowdNode Account" = "حساب CrowdNode "; - /* CrowdNode */ "CrowdNode benefits" = "فوائد CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "حدود السحب CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "إلى عنوان Dash المخصص لحساب CrowdNode الخاص بك في Dash Wallet على هذا الجهاز"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "ادوات"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index b860cc930..245d300fe 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Инструменти"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index 0debfab25..fa68a5449 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index f819af7d2..a0f43d547 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Kreditní karta"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Účet"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Nástroje"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Přijal si žádost o přidání mezi kontakty od %@"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index d72147e5c..8099423f1 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index 92bf619d4..d6dafd86d 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -55,8 +55,11 @@ static const bool _SNAPSHOT = 0; #import "DWCenteredTableView.h" //MARK: Backup Wallet -#import "DWBackupSeedPhraseViewController.h" +#import "DWPreviewSeedPhraseViewController.h" #import "DWSecureWalletDelegate.h" +#import "DWPreviewSeedPhraseContentView.h" +#import "DWPreviewSeedPhraseViewController+DWProtected.h" +#import "DWVerifySeedPhraseViewController.h" //MARK: Payment flow #import "DWQRScanModel.h" @@ -150,3 +153,6 @@ static const bool _SNAPSHOT = 0; //MARK: Tools menu #import "UIViewController+DWDisplayError.h" + +//MARK: Onboarding +#import "DWTransactionStub.h" diff --git a/DashWallet/dashwallet.entitlements b/DashWallet/dashwallet.entitlements index 120550dd4..26eff9d3e 100644 --- a/DashWallet/dashwallet.entitlements +++ b/DashWallet/dashwallet.entitlements @@ -22,7 +22,7 @@ com.apple.security.application-groups - group.org.dashfoundation.dash + group.M62AAKG43G.org.dashfoundation.dash diff --git a/DashWallet/dashwalletTodayExtension.entitlements b/DashWallet/dashwalletTodayExtension.entitlements index 44fb864e4..b1a7f9394 100644 --- a/DashWallet/dashwalletTodayExtension.entitlements +++ b/DashWallet/dashwalletTodayExtension.entitlements @@ -6,7 +6,7 @@ development com.apple.security.application-groups - group.org.dashfoundation.dash + group.M62AAKG43G.org.dashfoundation.dash diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index 241314d26..16914187a 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Kreditkarte"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode-Konto"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode Leistungen"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode Auszahlungslimits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "zu der vorgesehenen Dash Adresse für dein CrowdNode Konto in der Dash Wallet dieses Gerätes"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Werkzeuge"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Ja"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Du hast die Kontaktanfrage von %@ angenommen"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index 0d934da0a..7c7749b8d 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Πιστωτική Κάρτα"; -/* Crowdnode */ -"CrowdNode Account" = "Λογαριασμός CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Πλεονεκτήματα του CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Όρια ανάληψης στην CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "στη διεύθυνση Dash που έχει οριστεί για το λογαριασμό σας CrowdNode στο Dash Wallet σε αυτή τη συσκευή"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Εργαλεία"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Ναι"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Αποδεχθήκατε το αίτημα επαφής από %@"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index 4ad1002e3..e0c8a635c 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index da30b5686..ff0ac27ad 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index a981e3239..15987bca5 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Tarjeta de crédito"; -/* Crowdnode */ -"CrowdNode Account" = "Cuenta de CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Beneficios de CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Límites de retiro de CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ Billetera de Dash"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "a la dirección de Dash designada para tu cuenta de CrowdNode en la billetera de Dash en este dispositivo"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Herramientas"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Si"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Aceptaste la solicitud de contacto de %@"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index b7aaaa09c..3a1e99316 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index 3c60fd968..e45076c90 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "کارت اعتباری"; -/* Crowdnode */ -"CrowdNode Account" = "حساب کراودنود"; - /* CrowdNode */ "CrowdNode benefits" = "مزایای کراودنود"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "سقف برداشت کراودنود"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "دش‌والت ➝ کراودنود"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "به نشانی دشی که برای حساب کراودنود در دش والت روی این دستگاه در نظر گرفته‌اید"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "ابزارها"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index 95c6816b5..04143e6bd 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index e63b0c398..8649591f9 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "Mga benepisyo ng CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Mga limitasyon sa pag-withdraw sa CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "Para sa Dash address na itinalaga para sa iyong CrowdNode account sa Dash Wallet sa device na ito"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Kagamitan"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Oo"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Tinanggap mo ang kahilingan sa pakikipag-ugnay mula sa %@"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index 0adad137b..c018073fe 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Carte bancaire"; -/* Crowdnode */ -"CrowdNode Account" = "Compte CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Bénéfices CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Limites de retrait CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "vers l'adresse Dash associée à votre compte CrowdNode dans le Dash Wallet de cet appareil"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Outils"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Oui"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Vous avez accepté la demande de contact de %@"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index 2e1064d6d..759710db2 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index abd7899a4..a12dda41e 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 172db5c38..1972f7613 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Kartu Kredit"; -/* Crowdnode */ -"CrowdNode Account" = "Akun CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Manfaat CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Batas penarikan CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "ke alamat Dash yang ditunjuk untuk akun CrowdNode Anda di Dash Wallet pada perangkat ini"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Alat"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Ya"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Anda menerima permintaan kontak dari %@"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index fbb8f1786..0d0fbc558 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Carta di Credito"; -/* Crowdnode */ -"CrowdNode Account" = "Account CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Vantaggi di CrowNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Limiti di prelievo CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "all'indirizzo Dash designato per il tuo account CrowdNode nel Dash Wallet su questo dispositivo"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Strumenti"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Si"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Hai accettato la richiesta di contatto di %@"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index 63bfd419a..750270fac 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "クレジットカード"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNodeアカウント"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNodeの特典"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNodeの出金限度額"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNodeからDashWalletへ"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "このデバイスのDashウォレットでCrowdNodeのアカウントに指定したDashアドレスに送金します"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "ツール"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "はい"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "%@からの連絡先リクエストを承認しました。"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index 51596c9e5..d8c365098 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "신용카드"; -/* Crowdnode */ -"CrowdNode Account" = "크라우드노드 계정"; - /* CrowdNode */ "CrowdNode benefits" = "크라우드노드의 이점"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "크라우드노드 출금 한도"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "크라우드노드 ➝ 대시지갑"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "이 기기의 대시 지갑 내 크라우드노드 계정에 지정한 대시 주소로 송금합니다."; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "도구"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "예"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "%@ 님으로부터의 연락처 요청을 수락하였습니다"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index 3c6d90954..1942c0119 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index 4f6bf3a8b..40fd7c0c5 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index 7f3b9f8bd..869653c0f 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index b95695b3b..e33b66a88 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credticard"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode account "; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode voordelen"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode opname limiet"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "naar het Dash adres dat is toegewezen aan je CrowdNode account in de Dash portemonnee op dit apparaat"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Gereedschap"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Ja"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "U heeft het contactverzoek van %@ geaccepteerd"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index ef1505418..2231f042b 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Karta Kredytowa"; -/* Crowdnode */ -"CrowdNode Account" = "Konto CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Korzyści CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Limit wypłat na CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ Portfel Dash"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "na adres z portfela na tym urządzania, który jest podłączony do twojego konta CrowdNode."; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Narzędzia"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Tak"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Zaproszenie do kontaktów od %@ zostało zaakceptowane"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index afcda39e7..34453029c 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Cartão de crédito"; -/* Crowdnode */ -"CrowdNode Account" = "Conta CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Benefícios CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Limites de retirada do CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ Carteira Dash"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "para o endereço Dash designado para sua conta CrowdNode na Carteira Dash neste dispositivo"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Ferramentas"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Sim"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Você aceitou a solicitação de contato de %@"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index d5f95cb22..b7c13b1c2 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index 483918f4f..e6ef12263 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Кредитная карта"; -/* Crowdnode */ -"CrowdNode Account" = "Аккаунт CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Как присоединиться к пулу"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Лимит CrowdNode на вывод"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "на адрес Dash, созданный для вашего CrowdNode аккаунта в Dash Wallet на этом устройстве"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Инструменты"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Да"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Вы приняли запрос на добавление в контакты от %@"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index 20692c15b..81b267d11 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Kreditná karta"; -/* Crowdnode */ -"CrowdNode Account" = "Účet CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Výhody CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Limity výberu CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "na Dash adresu určenú pre váš účet CrowdNode v Dash peňaženke na tomto zariadení"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Nástroje"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Áno"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Prijali ste kontaktnú žiadosť od %@"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index 5fff2c4a8..983d03682 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index c5bb910f4..fb179312f 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index ef9dcfcec..162110e3b 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index 3e50e3359..5bedc7acf 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index 2d2ec94f7..022373f2b 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index 1c70a3bf4..2b487815e 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "บัตรเครดิต"; -/* Crowdnode */ -"CrowdNode Account" = "บัญชี CrowdNode "; - /* CrowdNode */ "CrowdNode benefits" = "ผลประโยชน์ของ CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "ข้อจำกัดการถอน CrowdNode "; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "ไปยังที่อยู่ Dash ที่กำหนดไว้สำหรับบัญชี CrowdNode ของคุณในกระเป๋าเงิน Dash บนอุปกรณ์นี้"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "เครื่องมือ"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "ใช่"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "คุณได้รับการยอมรับคำขอการติดต่อจาก %@"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index 3059f20b9..256dd3bff 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Kredi Kartı"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Hesabı"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode avantajları"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode para çekme limitleri"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "bu cihazdaki Dash Cüzdanından CrowdNode hesabınız için belirlenen Dash adresine"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Araçlar"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Evet"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "%@'den gelen kişi talebini kabul ettiniz."; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index e956453ed..1801295f2 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Кредитна картка"; -/* Crowdnode */ -"CrowdNode Account" = "Акаунт CrowdNode"; - /* CrowdNode */ "CrowdNode benefits" = "Переваги CrowdNode"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "Ліміти виведення з CrowdNode"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "на адресу Dash, призначену для вашого облікового запису CrowdNode у Dash Wallet на цьому пристрої"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Інструменти"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Так"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Ви прийняли запит на додавання в контакти від %@"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index 92e9760f7..96bb0f0de 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Công cụ"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "Bạn đã chấp nhận yêu cầu liên hệ từ %@"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index c10866e26..03fd67077 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index 187737c53..6930c6df1 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "Credit Card"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode benefits"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode withdrawal limits"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ DashWallet"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "Tools"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "Yes"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "You accepted the contact request from %@"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index 97676e74c..99013d46c 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "信用卡"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode 账户"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode 的福利"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode 提款限额"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ Dash钱包"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "在此设备上的Dash钱包上为您CrowdNode账户指定的Dash地址"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "工具"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "是的"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "您通过了来自 %@ 的朋友申请"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index 191f58467..6f3c24804 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -542,9 +542,6 @@ /* Coinbase/Payment Methods */ "Credit Card" = "信用卡"; -/* Crowdnode */ -"CrowdNode Account" = "CrowdNode 帳戶"; - /* CrowdNode */ "CrowdNode benefits" = "CrowdNode 的好處"; @@ -557,6 +554,9 @@ /* CrowdNode */ "CrowdNode withdrawal limits" = "CrowdNode 提款限額"; +/* No comment provided by engineer. */ +"CrowdNode · Account" = "CrowdNode · Account"; + /* CrowdNode Portal */ "CrowdNode ➝ DashWallet" = "CrowdNode ➝ 達世幣錢包"; @@ -2217,6 +2217,9 @@ /* CrowdNode */ "to the Dash address designated for your CrowdNode account in the Dash Wallet on this device" = "到此設備上達世幣錢包中為您的 CrowdNode 帳戶指定的達世幣位址"; +/* No comment provided by engineer. */ +"Today" = "Today"; + /* No comment provided by engineer. */ "Tools" = "工具"; @@ -2580,6 +2583,9 @@ /* No comment provided by engineer. */ "Yes" = "是的"; +/* No comment provided by engineer. */ +"Yesterday" = "Yesterday"; + /* No comment provided by engineer. */ "You accepted the contact request from %@" = "您接受了來自 %@ 的聯繫請求"; diff --git a/Podfile.lock b/Podfile.lock index cf61c83e4..1cd160baa 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.8.1) + - Alamofire (5.9.1) - BlueCryptor (1.0.32) - BlueECC (1.2.5) - BlueRSA (1.0.200) @@ -620,14 +620,17 @@ PODS: - FirebaseStorage (8.15.0): - FirebaseCore (~> 8.0) - GTMSessionFetcher/Core (~> 1.5) - - GoogleDataTransport (9.3.0): + - GoogleDataTransport (9.4.1): - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30910.0, >= 2.30908.0) + - nanopb (< 2.30911.0, >= 2.30908.0) - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Environment (7.12.0): + - GoogleUtilities/Environment (7.13.3): + - GoogleUtilities/Privacy - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.12.0): + - GoogleUtilities/Logger (7.13.3): - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (7.13.3) - gRPC-Core (1.49.0): - gRPC-Core/Implementation (= 1.49.0) - gRPC-Core/Interface (= 1.49.0) @@ -706,8 +709,8 @@ PODS: - nanopb/encode (= 2.30908.0) - nanopb/decode (2.30908.0) - nanopb/encode (2.30908.0) - - PromisesObjC (2.3.1) - - Protobuf (3.25.1) + - PromisesObjC (2.4.0) + - Protobuf (3.27.2) - SDWebImage (5.13.2): - SDWebImage/Core (= 5.13.2) - SDWebImage/Core (5.13.2) @@ -819,7 +822,7 @@ SPEC CHECKSUMS: "!ProtoCompiler": e9c09244955a8565817aa59a4787b6bb849a63c6 "!ProtoCompiler-gRPCPlugin": 755f0ee414a0d5f0028e0dcfe98c23bdbc3e6fa3 abseil: 926fb7a82dc6d2b8e1f2ed7f3a718bce691d1e46 - Alamofire: 3ca42e259043ee0dc5c0cdd76c4bc568b8e42af7 + Alamofire: f36a35757af4587d8e4f4bfa223ad10be2422b8c BlueCryptor: b0aee3d9b8f367b49b30de11cda90e1735571c24 BlueECC: 0d18e93347d3ec6d41416de21c1ffa4d4cd3c2cc BlueRSA: dfeef51db96bcc4edec654956c1581adbda4e6a3 @@ -837,8 +840,8 @@ SPEC CHECKSUMS: FirebaseCoreDiagnostics: 92e07a649aeb66352b319d43bdd2ee3942af84cb FirebaseDynamicLinks: 1dc816ef789c5adac6fede0b46d11478175c70e4 FirebaseStorage: 8019af461599b2c3bc61c6a5dbdfa3d2de66a4d9 - GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe - GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a + GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 gRPC: 64f36d689b2ecd99c4351f74e6f91347cdc65d9f gRPC-Core: 3a9fdb5967d42211e875826f3f6fc163ea02c2a1 gRPC-ProtoRPC: 1c223e0f1732bb8d0b9e9e0ea60cc0fe995b8e2d @@ -852,8 +855,8 @@ SPEC CHECKSUMS: MMSegmentSlider: db7ee0d6eb2eefbd511179195bf288ff2cebac0a Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 - PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - Protobuf: d94761c33f1239c0a43a0817ca1a5f7f7c900241 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + Protobuf: fb2c13674723f76ff6eede14f78847a776455fa2 SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866 SQLite.swift: 903bfa3bc9ab06345fdfbb578e34f47cfcf417da SQLiteMigrationManager.swift: 5383578f5bc8955c06695e8bf04835ee0e6673a8