diff --git a/modules/Package.swift b/modules/Package.swift index 1645b57..cdce5a9 100644 --- a/modules/Package.swift +++ b/modules/Package.swift @@ -19,12 +19,22 @@ let package = Package( .library(name: "DiskSpaceCheckerClient", targets: ["DiskSpaceCheckerClient"]), .library(name: "FeedbackGeneratorClient", targets: ["FeedbackGeneratorClient"]), .library(name: "FileManager", targets: ["FileManager"]), + .library(name: "Generated", targets: ["Generated"]), .library(name: "LocalAuthenticationClient", targets: ["LocalAuthenticationClient"]), .library(name: "LogsHandlerClient", targets: ["LogsHandlerClient"]), .library(name: "MnemonicClient", targets: ["MnemonicClient"]), + .library(name: "Models", targets: ["Models"]), .library(name: "NumberFormatterClient", targets: ["NumberFormatterClient"]), .library(name: "PasteboardClient", targets: ["PasteboardClient"]), - .library(name: "Utils", targets: ["Utils"]) + .library(name: "RecoveryPhraseValidationFlow", targets: ["RecoveryPhraseValidationFlow"]), + .library(name: "ReviewRequestClient", targets: ["ReviewRequestClient"]), + .library(name: "SDKSynchronizerClient", targets: ["SDKSynchronizerClient"]), + .library(name: "SecItem", targets: ["SecItem"]), + .library(name: "SupportDataGeneratorClient", targets: ["SupportDataGeneratorClient"]), + .library(name: "UIComponents", targets: ["UIComponents"]), + .library(name: "Utils", targets: ["Utils"]), + .library(name: "UserDefaultsClient", targets: ["UserDefaultsClient"]), + .library(name: "ZcashSDKEnvironment", targets: ["ZcashSDKEnvironment"]) ], dependencies: [ .package(url: "https://github.com/pointfreeco/swift-composable-architecture", from: "0.50.3"), @@ -101,9 +111,14 @@ let package = Package( .product(name: "ComposableArchitecture", package: "swift-composable-architecture") ] ), + .target( + name: "Generated", + resources: [.process("Resources")] + ), .target( name: "LocalAuthenticationClient", dependencies: [ + "Generated", .product(name: "ComposableArchitecture", package: "swift-composable-architecture") ] ), @@ -121,6 +136,13 @@ let package = Package( .product(name: "ComposableArchitecture", package: "swift-composable-architecture") ] ), + .target( + name: "Models", + dependencies: [ + "Utils", + "UIComponents" + ] + ), .target( name: "NumberFormatterClient", dependencies: [ @@ -135,11 +157,77 @@ let package = Package( .product(name: "ComposableArchitecture", package: "swift-composable-architecture") ] ), + .target( + name: "RecoveryPhraseValidationFlow", + dependencies: [ + "FeedbackGeneratorClient", + "Generated", + "Models", + "PasteboardClient", + "UIComponents", + "Utils", + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "ZcashLightClientKit", package: "ZcashLightClientKit") + ] + ), + .target( + name: "ReviewRequestClient", + dependencies: [ + "AppVersionClient", + "DateClient", + "UserDefaultsClient", + .product(name: "ComposableArchitecture", package: "swift-composable-architecture") + ] + ), + .target( + name: "SDKSynchronizerClient", + dependencies: [ + "DatabaseFilesClient", + "Models", + "ZcashSDKEnvironment", + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "ZcashLightClientKit", package: "ZcashLightClientKit") + ] + ), + .target( + name: "SecItem", + dependencies: [ + .product(name: "ComposableArchitecture", package: "swift-composable-architecture") + ] + ), + .target( + name: "SupportDataGeneratorClient", + dependencies: [ + "Generated", + "Utils", + .product(name: "ComposableArchitecture", package: "swift-composable-architecture") + ] + ), + .target( + name: "UIComponents", + dependencies: [ + "Generated", + "Utils" + ] + ), .target( name: "Utils", dependencies: [ .product(name: "ZcashLightClientKit", package: "ZcashLightClientKit") ] + ), + .target( + name: "UserDefaultsClient", + dependencies: [ + .product(name: "ComposableArchitecture", package: "swift-composable-architecture") + ] + ), + .target( + name: "ZcashSDKEnvironment", + dependencies: [ + .product(name: "ZcashLightClientKit", package: "ZcashLightClientKit"), + .product(name: "ComposableArchitecture", package: "swift-composable-architecture") + ] ) ] ) diff --git a/modules/Sources/Generated/Fonts+Generated.swift b/modules/Sources/Generated/Fonts+Generated.swift new file mode 100644 index 0000000..ac09d48 --- /dev/null +++ b/modules/Sources/Generated/Fonts+Generated.swift @@ -0,0 +1,165 @@ +// swiftlint:disable all +// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen + +import SwiftUI +#if os(OSX) + import AppKit.NSFont +#elseif os(iOS) || os(tvOS) || os(watchOS) + import UIKit.UIFont +#endif + +// Deprecated typealiases +@available(*, deprecated, renamed: "FontConvertible.Font", message: "This typealias will be removed in SwiftGen 7.0") +public typealias SystemFont = FontConvertible.SystemFont + +// swiftlint:disable superfluous_disable_command +// swiftlint:disable file_length + +// MARK: - Fonts + +// swiftlint:disable identifier_name line_length type_body_length +public enum FontFamily { + public enum Roboto { + public static let black = FontConvertible(name: "Roboto-Black", family: "Roboto", path: "Roboto-Black.ttf") + public static let blackItalic = FontConvertible(name: "Roboto-BlackItalic", family: "Roboto", path: "Roboto-BlackItalic.ttf") + public static let bold = FontConvertible(name: "Roboto-Bold", family: "Roboto", path: "Roboto-Bold.ttf") + public static let boldItalic = FontConvertible(name: "Roboto-BoldItalic", family: "Roboto", path: "Roboto-BoldItalic.ttf") + public static let italic = FontConvertible(name: "Roboto-Italic", family: "Roboto", path: "Roboto-Italic.ttf") + public static let light = FontConvertible(name: "Roboto-Light", family: "Roboto", path: "Roboto-Light.ttf") + public static let lightItalic = FontConvertible(name: "Roboto-LightItalic", family: "Roboto", path: "Roboto-LightItalic.ttf") + public static let medium = FontConvertible(name: "Roboto-Medium", family: "Roboto", path: "Roboto-Medium.ttf") + public static let mediumItalic = FontConvertible(name: "Roboto-MediumItalic", family: "Roboto", path: "Roboto-MediumItalic.ttf") + public static let regular = FontConvertible(name: "Roboto-Regular", family: "Roboto", path: "Roboto-Regular.ttf") + public static let thin = FontConvertible(name: "Roboto-Thin", family: "Roboto", path: "Roboto-Thin.ttf") + public static let thinItalic = FontConvertible(name: "Roboto-ThinItalic", family: "Roboto", path: "Roboto-ThinItalic.ttf") + public static let all: [FontConvertible] = [black, blackItalic, bold, boldItalic, italic, light, lightItalic, medium, mediumItalic, regular, thin, thinItalic] + } + public enum Rubik { + public static let light = FontConvertible(name: "Rubik-Light", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") + public static let lightItalic = FontConvertible(name: "Rubik-LightItalic", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") + public static let blackItalic = FontConvertible(name: "RubikItalic-Black", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") + public static let boldItalic = FontConvertible(name: "RubikItalic-Bold", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") + public static let extraBoldItalic = FontConvertible(name: "RubikItalic-ExtraBold", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") + public static let mediumItalic = FontConvertible(name: "RubikItalic-Medium", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") + public static let italic = FontConvertible(name: "RubikItalic-Regular", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") + public static let semiBoldItalic = FontConvertible(name: "RubikItalic-SemiBold", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") + public static let black = FontConvertible(name: "RubikRoman-Black", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") + public static let bold = FontConvertible(name: "RubikRoman-Bold", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") + public static let extraBold = FontConvertible(name: "RubikRoman-ExtraBold", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") + public static let medium = FontConvertible(name: "RubikRoman-Medium", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") + public static let regular = FontConvertible(name: "RubikRoman-Regular", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") + public static let semiBold = FontConvertible(name: "RubikRoman-SemiBold", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") + public static let all: [FontConvertible] = [light, lightItalic, blackItalic, boldItalic, extraBoldItalic, mediumItalic, italic, semiBoldItalic, black, bold, extraBold, medium, regular, semiBold] + } + public enum Zboto { + public static let regular = FontConvertible(name: "ZbotoRegular", family: "Zboto", path: "Zboto.otf") + public static let all: [FontConvertible] = [regular] + } + public static let allCustomFonts: [FontConvertible] = [Roboto.all, Rubik.all, Zboto.all].flatMap { $0 } + public static func registerAllCustomFonts() { + allCustomFonts.forEach { $0.register() } + } +} +// swiftlint:enable identifier_name line_length type_body_length + +// MARK: - Implementation Details + +public struct FontConvertible { + public let name: String + public let family: String + public let path: String + + #if os(OSX) + public typealias SystemFont = NSFont + #elseif os(iOS) || os(tvOS) || os(watchOS) + public typealias SystemFont = UIFont + #endif + + public func font(size: CGFloat) -> SystemFont { + guard let font = SystemFont(font: self, size: size) else { + fatalError("Unable to initialize font '\(name)' (\(family))") + } + return font + } + + public func textStyle(_ textStyle: Font.TextStyle) -> Font { + Font.mappedFont(name, textStyle: textStyle) + } + + public func register() { + // swiftlint:disable:next conditional_returns_on_newline + guard let url = url else { return } + CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) + } + + fileprivate var url: URL? { + // swiftlint:disable:next implicit_return + return BundleToken.bundle.url(forResource: path, withExtension: nil) + } +} + +public extension FontConvertible.SystemFont { + convenience init?(font: FontConvertible, size: CGFloat) { + #if os(iOS) || os(tvOS) || os(watchOS) + if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) { + font.register() + } + #elseif os(OSX) + if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none { + font.register() + } + #endif + + self.init(name: font.name, size: size) + } +} + +// swiftlint:disable convenience_type +private final class BundleToken { + static let bundle: Bundle = { + #if SWIFT_PACKAGE + return Bundle.module + #else + return Bundle(for: BundleToken.self) + #endif + }() +} + +fileprivate extension Font { + static func mappedFont(_ name: String, textStyle: TextStyle) -> Font { + let fontSize = UIFont.preferredFont(forTextStyle: self.mapToUIFontTextStyle(textStyle)).pointSize + return Font.custom(name, size: fontSize, relativeTo: textStyle) + } + + // swiftlint:disable:next cyclomatic_complexity + static func mapToUIFontTextStyle(_ textStyle: SwiftUI.Font.TextStyle) -> UIFont.TextStyle { + switch textStyle { + case .largeTitle: + return .largeTitle + case .title: + return .title1 + case .title2: + return .title2 + case .title3: + return .title3 + case .headline: + return .headline + case .subheadline: + return .subheadline + case .callout: + return .callout + case .body: + return .body + case .caption: + return .caption1 + case .caption2: + return .caption2 + case .footnote: + return .footnote + @unknown default: + fatalError("Missing a TextStyle mapping") + } + } +} + +// swiftlint:enable convenience_type diff --git a/modules/Sources/Generated/L10n.swift b/modules/Sources/Generated/L10n.swift new file mode 100644 index 0000000..0f59efc --- /dev/null +++ b/modules/Sources/Generated/L10n.swift @@ -0,0 +1,727 @@ +// swiftlint:disable all +// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen + +import Foundation + +// swiftlint:disable superfluous_disable_command file_length implicit_return prefer_self_in_static_references + +// MARK: - Strings + +// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length +// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces +public enum L10n { + /// %@ %@ + public static func balance(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "balance", String(describing: p1), String(describing: p2), fallback: "%@ %@") + } + /// QR Code for %@ + public static func qrCodeFor(_ p1: Any) -> String { + return L10n.tr("Localizable", "qrCodeFor", String(describing: p1), fallback: "QR Code for %@") + } + public enum AddressDetails { + /// Sapling Address + public static let sa = L10n.tr("Localizable", "addressDetails.sa", fallback: "Sapling Address") + /// Transparent Address + public static let ta = L10n.tr("Localizable", "addressDetails.ta", fallback: "Transparent Address") + /// Unified Address + public static let ua = L10n.tr("Localizable", "addressDetails.ua", fallback: "Unified Address") + public enum Error { + /// could not extract sapling receiver from UA + public static let cantExtractSaplingAddress = L10n.tr("Localizable", "addressDetails.error.cantExtractSaplingAddress", fallback: "could not extract sapling receiver from UA") + /// could not extract transparent receiver from UA + public static let cantExtractTransparentAddress = L10n.tr("Localizable", "addressDetails.error.cantExtractTransparentAddress", fallback: "could not extract transparent receiver from UA") + /// could not extract UA + public static let cantExtractUnifiedAddress = L10n.tr("Localizable", "addressDetails.error.cantExtractUnifiedAddress", fallback: "could not extract UA") + } + } + public enum Balance { + /// %@ %@ Available + public static func available(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "balance.available", String(describing: p1), String(describing: p2), fallback: "%@ %@ Available") + } + } + public enum BalanceBreakdown { + /// Shielding Threshold: %@ %@ + public static func autoShieldingThreshold(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "balanceBreakdown.autoShieldingThreshold", String(describing: p1), String(describing: p2), fallback: "Shielding Threshold: %@ %@") + } + /// Block: %@ + public static func blockId(_ p1: Any) -> String { + return L10n.tr("Localizable", "balanceBreakdown.blockId", String(describing: p1), fallback: "Block: %@") + } + /// SHIELDED %@ (SPENDABLE) + public static func shieldedZec(_ p1: Any) -> String { + return L10n.tr("Localizable", "balanceBreakdown.shieldedZec", String(describing: p1), fallback: "SHIELDED %@ (SPENDABLE)") + } + /// Shield funds + public static let shieldFunds = L10n.tr("Localizable", "balanceBreakdown.shieldFunds", fallback: "Shield funds") + /// Shielding funds + public static let shieldingFunds = L10n.tr("Localizable", "balanceBreakdown.shieldingFunds", fallback: "Shielding funds") + /// TOTAL BALANCE + public static let totalSpendableBalance = L10n.tr("Localizable", "balanceBreakdown.totalSpendableBalance", fallback: "TOTAL BALANCE") + /// TRANSPARENT BALANCE + public static let transparentBalance = L10n.tr("Localizable", "balanceBreakdown.transparentBalance", fallback: "TRANSPARENT BALANCE") + public enum Alert { + public enum ShieldFunds { + public enum Failure { + /// Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "balanceBreakdown.alert.shieldFunds.failure.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") + } + /// Failed to shield funds + public static let title = L10n.tr("Localizable", "balanceBreakdown.alert.shieldFunds.failure.title", fallback: "Failed to shield funds") + } + public enum Success { + /// Shielding transaction created + public static let message = L10n.tr("Localizable", "balanceBreakdown.alert.shieldFunds.success.message", fallback: "Shielding transaction created") + /// Done + public static let title = L10n.tr("Localizable", "balanceBreakdown.alert.shieldFunds.success.title", fallback: "Done") + } + } + } + } + public enum Error { + /// possible roll back + public static let rollBack = L10n.tr("Localizable", "error.rollBack", fallback: "possible roll back") + } + public enum ExportLogs { + public enum Alert { + public enum Failed { + /// Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "exportLogs.alert.failed.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") + } + /// Error when exporting logs + public static let title = L10n.tr("Localizable", "exportLogs.alert.failed.title", fallback: "Error when exporting logs") + } + } + } + public enum Field { + public enum Multiline { + /// char limit exceeded + public static let charLimitExceeded = L10n.tr("Localizable", "field.multiline.charLimitExceeded", fallback: "char limit exceeded") + } + public enum TransactionAddress { + /// To: + public static let to = L10n.tr("Localizable", "field.transactionAddress.to", fallback: "To:") + /// Valid Zcash Address + public static let validZcashAddress = L10n.tr("Localizable", "field.transactionAddress.validZcashAddress", fallback: "Valid Zcash Address") + } + public enum TransactionAmount { + /// Amount: + public static let amount = L10n.tr("Localizable", "field.transactionAmount.amount", fallback: "Amount:") + /// %@ Amount + public static func zecAmount(_ p1: Any) -> String { + return L10n.tr("Localizable", "field.transactionAmount.zecAmount", String(describing: p1), fallback: "%@ Amount") + } + } + } + public enum General { + /// Back + public static let back = L10n.tr("Localizable", "general.back", fallback: "Back") + /// Cancel + public static let cancel = L10n.tr("Localizable", "general.cancel", fallback: "Cancel") + /// Clear + public static let clear = L10n.tr("Localizable", "general.clear", fallback: "Clear") + /// Close + public static let close = L10n.tr("Localizable", "general.close", fallback: "Close") + /// date not available + public static let dateNotAvailable = L10n.tr("Localizable", "general.dateNotAvailable", fallback: "date not available") + /// Max + public static let max = L10n.tr("Localizable", "general.max", fallback: "Max") + /// Next + public static let next = L10n.tr("Localizable", "general.next", fallback: "Next") + /// No + public static let no = L10n.tr("Localizable", "general.no", fallback: "No") + /// Ok + public static let ok = L10n.tr("Localizable", "general.ok", fallback: "Ok") + /// Send + public static let send = L10n.tr("Localizable", "general.send", fallback: "Send") + /// Skip + public static let skip = L10n.tr("Localizable", "general.skip", fallback: "Skip") + /// Success + public static let success = L10n.tr("Localizable", "general.success", fallback: "Success") + /// Unknown + public static let unknown = L10n.tr("Localizable", "general.unknown", fallback: "Unknown") + /// Yes + public static let yes = L10n.tr("Localizable", "general.yes", fallback: "Yes") + } + public enum Home { + /// Receive %@ + public static func receiveZec(_ p1: Any) -> String { + return L10n.tr("Localizable", "home.receiveZec", String(describing: p1), fallback: "Receive %@") + } + /// Send %@ + public static func sendZec(_ p1: Any) -> String { + return L10n.tr("Localizable", "home.sendZec", String(describing: p1), fallback: "Send %@") + } + /// Secant Wallet + public static let title = L10n.tr("Localizable", "home.title", fallback: "Secant Wallet") + /// See transaction history + public static let transactionHistory = L10n.tr("Localizable", "home.transactionHistory", fallback: "See transaction history") + public enum SyncFailed { + /// Dismiss + public static let dismiss = L10n.tr("Localizable", "home.syncFailed.dismiss", fallback: "Dismiss") + /// Retry + public static let retry = L10n.tr("Localizable", "home.syncFailed.retry", fallback: "Retry") + /// Sync failed! + public static let title = L10n.tr("Localizable", "home.syncFailed.title", fallback: "Sync failed!") + } + } + public enum ImportWallet { + /// Enter your secret backup seed phrase. + public static let description = L10n.tr("Localizable", "importWallet.description", fallback: "Enter your secret backup seed phrase.") + /// Wallet Import + public static let title = L10n.tr("Localizable", "importWallet.title", fallback: "Wallet Import") + public enum Alert { + public enum Failed { + /// Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "importWallet.alert.failed.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") + } + /// Failed to restore wallet + public static let title = L10n.tr("Localizable", "importWallet.alert.failed.title", fallback: "Failed to restore wallet") + } + public enum Success { + /// The wallet has been successfully recovered. + public static let message = L10n.tr("Localizable", "importWallet.alert.success.message", fallback: "The wallet has been successfully recovered.") + /// Success + public static let title = L10n.tr("Localizable", "importWallet.alert.success.title", fallback: "Success") + } + } + public enum Birthday { + /// Do you know the wallet's creation date? This will allow a faster sync. If you don't know the wallet's birthday, don't worry! + public static let description = L10n.tr("Localizable", "importWallet.birthday.description", fallback: "Do you know the wallet's creation date? This will allow a faster sync. If you don't know the wallet's birthday, don't worry!") + /// Enter birthday height + public static let placeholder = L10n.tr("Localizable", "importWallet.birthday.placeholder", fallback: "Enter birthday height") + } + public enum Button { + /// Import a private or viewing key + public static let importPrivateKey = L10n.tr("Localizable", "importWallet.button.importPrivateKey", fallback: "Import a private or viewing key") + /// Restore wallet + public static let restoreWallet = L10n.tr("Localizable", "importWallet.button.restoreWallet", fallback: "Restore wallet") + } + public enum Seed { + /// VALID SEED PHRASE + public static let valid = L10n.tr("Localizable", "importWallet.seed.valid", fallback: "VALID SEED PHRASE") + } + } + public enum LocalAuthentication { + /// The Following content requires authentication. + public static let reason = L10n.tr("Localizable", "localAuthentication.reason", fallback: "The Following content requires authentication.") + } + public enum Nefs { + /// Not enough space on disk to do synchronisation! + public static let message = L10n.tr("Localizable", "nefs.message", fallback: "Not enough space on disk to do synchronisation!") + } + public enum Onboarding { + public enum Button { + /// Import an Existing Wallet + public static let importWallet = L10n.tr("Localizable", "onboarding.button.importWallet", fallback: "Import an Existing Wallet") + /// Create New Wallet + public static let newWallet = L10n.tr("Localizable", "onboarding.button.newWallet", fallback: "Create New Wallet") + } + public enum Step1 { + /// As a privacy focused wallet, we shield by default. Your wallet uses the shielded address for sending and moves transparent funds to that address automatically. + /// + /// In other words, the 'privacy-please' sign is on the knob. + public static let description = L10n.tr("Localizable", "onboarding.step1.description", fallback: "As a privacy focused wallet, we shield by default. Your wallet uses the shielded address for sending and moves transparent funds to that address automatically.\n\nIn other words, the 'privacy-please' sign is on the knob.") + /// Welcome! + public static let title = L10n.tr("Localizable", "onboarding.step1.title", fallback: "Welcome!") + } + public enum Step2 { + /// You now have a unified address that includes and up-to-date shielded address for legacy systems. + /// + /// This makes your wallet friendlier, and gives you and address that you won't have to upgrade again. + public static let description = L10n.tr("Localizable", "onboarding.step2.description", fallback: "You now have a unified address that includes and up-to-date shielded address for legacy systems.\n\nThis makes your wallet friendlier, and gives you and address that you won't have to upgrade again.") + /// Unified Addresses + public static let title = L10n.tr("Localizable", "onboarding.step2.title", fallback: "Unified Addresses") + } + public enum Step3 { + /// Due to Zcash's increased popularity, we are optimizing our syncing schemes to be faster and more efficient! + /// + /// The future is fast! + public static let description = L10n.tr("Localizable", "onboarding.step3.description", fallback: "Due to Zcash's increased popularity, we are optimizing our syncing schemes to be faster and more efficient!\n\nThe future is fast!") + /// And so much more... + public static let title = L10n.tr("Localizable", "onboarding.step3.title", fallback: "And so much more...") + } + public enum Step4 { + /// Choose between creating a new wallet and importing and existing Secret Recovery Phrase + public static let description = L10n.tr("Localizable", "onboarding.step4.description", fallback: "Choose between creating a new wallet and importing and existing Secret Recovery Phrase") + /// Let's get started + public static let title = L10n.tr("Localizable", "onboarding.step4.title", fallback: "Let's get started") + } + } + public enum PlainOnboarding { + /// We need to create a new wallet or restore an existing one. Select your path: + public static let caption = L10n.tr("Localizable", "plainOnboarding.caption", fallback: "We need to create a new wallet or restore an existing one. Select your path:") + /// It's time to setup your Secant, powered by Zcash, no-frills wallet. + public static let title = L10n.tr("Localizable", "plainOnboarding.title", fallback: "It's time to setup your Secant, powered by Zcash, no-frills wallet.") + public enum Button { + /// Create a new Wallet + public static let createNewWallet = L10n.tr("Localizable", "plainOnboarding.button.createNewWallet", fallback: "Create a new Wallet") + /// Restore an existing wallet + public static let restoreWallet = L10n.tr("Localizable", "plainOnboarding.button.restoreWallet", fallback: "Restore an existing wallet") + } + } + public enum ReceiveZec { + /// Your Address + public static let yourAddress = L10n.tr("Localizable", "receiveZec.yourAddress", fallback: "Your Address") + public enum Error { + /// could not extract UA + public static let cantExtractUnifiedAddress = L10n.tr("Localizable", "receiveZec.error.cantExtractUnifiedAddress", fallback: "could not extract UA") + } + } + public enum RecoveryPhraseBackupValidation { + /// Drag the words below to match your backed-up copy. + public static let description = L10n.tr("Localizable", "recoveryPhraseBackupValidation.description", fallback: "Drag the words below to match your backed-up copy.") + /// Your placed words did not match your secret recovery phrase + public static let failedResult = L10n.tr("Localizable", "recoveryPhraseBackupValidation.failedResult", fallback: "Your placed words did not match your secret recovery phrase") + /// Congratulations! You validated your secret recovery phrase. + public static let successResult = L10n.tr("Localizable", "recoveryPhraseBackupValidation.successResult", fallback: "Congratulations! You validated your secret recovery phrase.") + /// Verify Your Backup + public static let title = L10n.tr("Localizable", "recoveryPhraseBackupValidation.title", fallback: "Verify Your Backup") + } + public enum RecoveryPhraseDisplay { + /// The following 24 words represent your funds and the security used to protect them. Back them up now! + public static let description = L10n.tr("Localizable", "recoveryPhraseDisplay.description", fallback: "The following 24 words represent your funds and the security used to protect them. Back them up now!") + /// Oops no words + public static let noWords = L10n.tr("Localizable", "recoveryPhraseDisplay.noWords", fallback: "Oops no words") + /// Your Secret Recovery Phrase + public static let title = L10n.tr("Localizable", "recoveryPhraseDisplay.title", fallback: "Your Secret Recovery Phrase") + public enum Button { + /// Copy To Buffer + public static let copyToBuffer = L10n.tr("Localizable", "recoveryPhraseDisplay.button.copyToBuffer", fallback: "Copy To Buffer") + /// I wrote it down! + public static let wroteItDown = L10n.tr("Localizable", "recoveryPhraseDisplay.button.wroteItDown", fallback: "I wrote it down!") + } + } + public enum RecoveryPhraseTestPreamble { + /// It is important to understand that you are in charge here. Great, right? YOU get to be the bank! + public static let paragraph1 = L10n.tr("Localizable", "recoveryPhraseTestPreamble.paragraph1", fallback: "It is important to understand that you are in charge here. Great, right? YOU get to be the bank!") + /// But it also means that YOU are the customer, and you need to be self-reliant. + public static let paragraph2 = L10n.tr("Localizable", "recoveryPhraseTestPreamble.paragraph2", fallback: "But it also means that YOU are the customer, and you need to be self-reliant.") + /// So how do you recover funds that you've hidden on a completely decentralized and private block-chain? + public static let paragraph3 = L10n.tr("Localizable", "recoveryPhraseTestPreamble.paragraph3", fallback: "So how do you recover funds that you've hidden on a completely decentralized and private block-chain?") + /// First things first + public static let title = L10n.tr("Localizable", "recoveryPhraseTestPreamble.title", fallback: "First things first") + public enum Button { + /// By understanding and preparing + public static let goNext = L10n.tr("Localizable", "recoveryPhraseTestPreamble.button.goNext", fallback: "By understanding and preparing") + } + } + public enum Root { + public enum Debug { + /// Feature flags + public static let featureFlags = L10n.tr("Localizable", "root.debug.featureFlags", fallback: "Feature flags") + /// Startup + public static let navigationTitle = L10n.tr("Localizable", "root.debug.navigationTitle", fallback: "Startup") + /// Debug options + public static let title = L10n.tr("Localizable", "root.debug.title", fallback: "Debug options") + public enum Alert { + public enum Rewind { + public enum CantStartSync { + /// Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "root.debug.alert.rewind.cantStartSync.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") + } + /// Can't start sync process after rewind + public static let title = L10n.tr("Localizable", "root.debug.alert.rewind.cantStartSync.title", fallback: "Can't start sync process after rewind") + } + public enum Failed { + /// Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "root.debug.alert.rewind.failed.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") + } + /// Rewind failed + public static let title = L10n.tr("Localizable", "root.debug.alert.rewind.failed.title", fallback: "Rewind failed") + } + } + } + public enum Dialog { + public enum Rescan { + /// Select the rescan you want + public static let message = L10n.tr("Localizable", "root.debug.dialog.rescan.message", fallback: "Select the rescan you want") + /// Rescan + public static let title = L10n.tr("Localizable", "root.debug.dialog.rescan.title", fallback: "Rescan") + public enum Option { + /// Full rescan + public static let full = L10n.tr("Localizable", "root.debug.dialog.rescan.option.full", fallback: "Full rescan") + /// Quick rescan + public static let quick = L10n.tr("Localizable", "root.debug.dialog.rescan.option.quick", fallback: "Quick rescan") + } + } + } + public enum Option { + /// Rate the app + public static let appReview = L10n.tr("Localizable", "root.debug.option.appReview", fallback: "Rate the app") + /// Export logs + public static let exportLogs = L10n.tr("Localizable", "root.debug.option.exportLogs", fallback: "Export logs") + /// Go To Onboarding + public static let gotoOnboarding = L10n.tr("Localizable", "root.debug.option.gotoOnboarding", fallback: "Go To Onboarding") + /// Go To Phrase Validation Demo + public static let gotoPhraseValidationDemo = L10n.tr("Localizable", "root.debug.option.gotoPhraseValidationDemo", fallback: "Go To Phrase Validation Demo") + /// Go To Sandbox (navigation proof) + public static let gotoSandbox = L10n.tr("Localizable", "root.debug.option.gotoSandbox", fallback: "Go To Sandbox (navigation proof)") + /// [Be careful] Nuke Wallet + public static let nukeWallet = L10n.tr("Localizable", "root.debug.option.nukeWallet", fallback: "[Be careful] Nuke Wallet") + /// Rescan Blockchain + public static let rescanBlockchain = L10n.tr("Localizable", "root.debug.option.rescanBlockchain", fallback: "Rescan Blockchain") + /// Restart the app + public static let restartApp = L10n.tr("Localizable", "root.debug.option.restartApp", fallback: "Restart the app") + /// Test Crash Reporter + public static let testCrashReporter = L10n.tr("Localizable", "root.debug.option.testCrashReporter", fallback: "Test Crash Reporter") + } + } + public enum Destination { + public enum Alert { + public enum FailedToProcessDeeplink { + /// Deeplink: (%@)) + /// Error: (%@) (code: %@) + public static func message(_ p1: Any, _ p2: Any, _ p3: Any) -> String { + return L10n.tr("Localizable", "root.destination.alert.failedToProcessDeeplink.message", String(describing: p1), String(describing: p2), String(describing: p3), fallback: "Deeplink: (%@))\nError: (%@) (code: %@)") + } + /// Failed to process deeplink. + public static let title = L10n.tr("Localizable", "root.destination.alert.failedToProcessDeeplink.title", fallback: "Failed to process deeplink.") + } + } + } + public enum Initialization { + public enum Alert { + public enum CantCreateNewWallet { + /// Can't create new wallet. Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "root.initialization.alert.cantCreateNewWallet.message", String(describing: p1), String(describing: p2), fallback: "Can't create new wallet. Error: %@ (code: %@)") + } + } + public enum CantLoadSeedPhrase { + /// Can't load seed phrase from local storage. + public static let message = L10n.tr("Localizable", "root.initialization.alert.cantLoadSeedPhrase.message", fallback: "Can't load seed phrase from local storage.") + } + public enum CantStoreThatUserPassedPhraseBackupTest { + /// Can't store information that user passed phrase backup test. Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "root.initialization.alert.cantStoreThatUserPassedPhraseBackupTest.message", String(describing: p1), String(describing: p2), fallback: "Can't store information that user passed phrase backup test. Error: %@ (code: %@)") + } + } + public enum Error { + /// Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "root.initialization.alert.error.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") + } + } + public enum Failed { + /// Wallet initialisation failed. + public static let title = L10n.tr("Localizable", "root.initialization.alert.failed.title", fallback: "Wallet initialisation failed.") + } + public enum SdkInitFailed { + /// Failed to initialize the SDK + public static let title = L10n.tr("Localizable", "root.initialization.alert.sdkInitFailed.title", fallback: "Failed to initialize the SDK") + } + public enum WalletStateFailed { + /// App initialisation state: %@. + public static func message(_ p1: Any) -> String { + return L10n.tr("Localizable", "root.initialization.alert.walletStateFailed.message", String(describing: p1), fallback: "App initialisation state: %@.") + } + } + public enum Wipe { + /// Are you sure? + public static let message = L10n.tr("Localizable", "root.initialization.alert.wipe.message", fallback: "Are you sure?") + /// Wipe of the wallet + public static let title = L10n.tr("Localizable", "root.initialization.alert.wipe.title", fallback: "Wipe of the wallet") + } + public enum WipeFailed { + /// Nuke of the wallet failed + public static let title = L10n.tr("Localizable", "root.initialization.alert.wipeFailed.title", fallback: "Nuke of the wallet failed") + } + } + } + } + public enum Scan { + /// We will validate any Zcash URI and take you to the appropriate action. + public static let info = L10n.tr("Localizable", "scan.info", fallback: "We will validate any Zcash URI and take you to the appropriate action.") + /// Scanning... + public static let scanning = L10n.tr("Localizable", "scan.scanning", fallback: "Scanning...") + public enum Alert { + public enum CantInitializeCamera { + /// Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "scan.alert.cantInitializeCamera.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") + } + /// Can't initialize the camera + public static let title = L10n.tr("Localizable", "scan.alert.cantInitializeCamera.title", fallback: "Can't initialize the camera") + } + } + } + public enum Send { + /// address: %@ + public static func address(_ p1: Any) -> String { + return L10n.tr("Localizable", "send.address", String(describing: p1), fallback: " address: %@") + } + /// amount: %@ + public static func amount(_ p1: Any) -> String { + return L10n.tr("Localizable", "send.amount", String(describing: p1), fallback: "amount: %@") + } + /// Memo included. Tap to edit. + public static let editMemo = L10n.tr("Localizable", "send.editMemo", fallback: "Memo included. Tap to edit.") + /// Sending transaction failed + public static let failed = L10n.tr("Localizable", "send.failed", fallback: "Sending transaction failed") + /// Aditional funds may be in transit + public static let fundsInfo = L10n.tr("Localizable", "send.fundsInfo", fallback: "Aditional funds may be in transit") + /// Want to include memo? Tap here. + public static let includeMemo = L10n.tr("Localizable", "send.includeMemo", fallback: "Want to include memo? Tap here.") + /// memo: %@ + public static func memo(_ p1: Any) -> String { + return L10n.tr("Localizable", "send.memo", String(describing: p1), fallback: " memo: %@") + } + /// Write a private message here + public static let memoPlaceholder = L10n.tr("Localizable", "send.memoPlaceholder", fallback: "Write a private message here") + /// Sending %@ %@ to + public static func sendingTo(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "send.sendingTo", String(describing: p1), String(describing: p2), fallback: "Sending %@ %@ to") + } + /// Sending transaction succeeded + public static let succeeded = L10n.tr("Localizable", "send.succeeded", fallback: "Sending transaction succeeded") + /// Send Zcash + public static let title = L10n.tr("Localizable", "send.title", fallback: "Send Zcash") + } + public enum Settings { + /// About + public static let about = L10n.tr("Localizable", "settings.about", fallback: "About") + /// Backup Wallet + public static let backupWallet = L10n.tr("Localizable", "settings.backupWallet", fallback: "Backup Wallet") + /// Enable Crash Reporting + public static let crashReporting = L10n.tr("Localizable", "settings.crashReporting", fallback: "Enable Crash Reporting") + /// Exporting... + public static let exporting = L10n.tr("Localizable", "settings.exporting", fallback: "Exporting...") + /// Export & share logs + public static let exportLogs = L10n.tr("Localizable", "settings.exportLogs", fallback: "Export & share logs") + /// Send us feedback! + public static let feedback = L10n.tr("Localizable", "settings.feedback", fallback: "Send us feedback!") + /// Settings + public static let title = L10n.tr("Localizable", "settings.title", fallback: "Settings") + /// Version %@ (%@) + public static func version(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "settings.version", String(describing: p1), String(describing: p2), fallback: "Version %@ (%@)") + } + public enum Alert { + public enum CantBackupWallet { + /// Error: %@ (code: %@) + public static func message(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "settings.alert.cantBackupWallet.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") + } + /// Can't backup wallet + public static let title = L10n.tr("Localizable", "settings.alert.cantBackupWallet.title", fallback: "Can't backup wallet") + } + public enum CantSendEmail { + /// It looks like that you don't have any email account configured on your device. Therefore it's not possible to send a support email. + public static let message = L10n.tr("Localizable", "settings.alert.cantSendEmail.message", fallback: "It looks like that you don't have any email account configured on your device. Therefore it's not possible to send a support email.") + /// Can't send email + public static let title = L10n.tr("Localizable", "settings.alert.cantSendEmail.title", fallback: "Can't send email") + } + } + } + public enum SupportData { + public enum AppVersionItem { + /// App identifier + public static let bundleIdentifier = L10n.tr("Localizable", "supportData.appVersionItem.bundleIdentifier", fallback: "App identifier") + /// App version + public static let version = L10n.tr("Localizable", "supportData.appVersionItem.version", fallback: "App version") + } + public enum DeviceModelItem { + /// Device + public static let device = L10n.tr("Localizable", "supportData.deviceModelItem.device", fallback: "Device") + } + public enum FreeDiskSpaceItem { + /// Usable storage + public static let freeDiskSpace = L10n.tr("Localizable", "supportData.freeDiskSpaceItem.freeDiskSpace", fallback: "Usable storage") + } + public enum LocaleItem { + /// Currency decimal separator + public static let decimalSeparator = L10n.tr("Localizable", "supportData.localeItem.decimalSeparator", fallback: "Currency decimal separator") + /// Currency grouping separator + public static let groupingSeparator = L10n.tr("Localizable", "supportData.localeItem.groupingSeparator", fallback: "Currency grouping separator") + /// Locale + public static let locale = L10n.tr("Localizable", "supportData.localeItem.locale", fallback: "Locale") + } + public enum PermissionItem { + /// Camera access + public static let camera = L10n.tr("Localizable", "supportData.permissionItem.camera", fallback: "Camera access") + /// FaceID available + public static let faceID = L10n.tr("Localizable", "supportData.permissionItem.faceID", fallback: "FaceID available") + /// Permissions + public static let permissions = L10n.tr("Localizable", "supportData.permissionItem.permissions", fallback: "Permissions") + /// TouchID available + public static let touchID = L10n.tr("Localizable", "supportData.permissionItem.touchID", fallback: "TouchID available") + } + public enum SystemVersionItem { + /// iOS version + public static let version = L10n.tr("Localizable", "supportData.systemVersionItem.version", fallback: "iOS version") + } + public enum TimeItem { + /// Current time + public static let time = L10n.tr("Localizable", "supportData.timeItem.time", fallback: "Current time") + } + } + public enum Sync { + public enum Message { + /// Error: %@ + public static func error(_ p1: Any) -> String { + return L10n.tr("Localizable", "sync.message.error", String(describing: p1), fallback: "Error: %@") + } + /// %@%% Synced + public static func sync(_ p1: Any) -> String { + return L10n.tr("Localizable", "sync.message.sync", String(describing: p1), fallback: "%@%% Synced") + } + /// Unprepared + public static let unprepared = L10n.tr("Localizable", "sync.message.unprepared", fallback: "Unprepared") + /// Up-To-Date + public static let uptodate = L10n.tr("Localizable", "sync.message.uptodate", fallback: "Up-To-Date") + } + } + public enum Transaction { + /// Confirmed + public static let confirmed = L10n.tr("Localizable", "transaction.confirmed", fallback: "Confirmed") + /// %@ times + public static func confirmedTimes(_ p1: Any) -> String { + return L10n.tr("Localizable", "transaction.confirmedTimes", String(describing: p1), fallback: "%@ times") + } + /// Confirming ~%@mins + public static func confirming(_ p1: Any) -> String { + return L10n.tr("Localizable", "transaction.confirming", String(describing: p1), fallback: "Confirming ~%@mins") + } + /// Failed + public static let failed = L10n.tr("Localizable", "transaction.failed", fallback: "Failed") + /// Received + public static let received = L10n.tr("Localizable", "transaction.received", fallback: "Received") + /// RECEIVING + public static let receiving = L10n.tr("Localizable", "transaction.receiving", fallback: "RECEIVING") + /// SENDING + public static let sending = L10n.tr("Localizable", "transaction.sending", fallback: "SENDING") + /// Sent + public static let sent = L10n.tr("Localizable", "transaction.sent", fallback: "Sent") + /// to + public static let to = L10n.tr("Localizable", "transaction.to", fallback: "to") + /// unconfirmed + public static let unconfirmed = L10n.tr("Localizable", "transaction.unconfirmed", fallback: "unconfirmed") + /// With memo: + public static let withMemo = L10n.tr("Localizable", "transaction.withMemo", fallback: "With memo:") + /// You are receiving %@ %@ + public static func youAreReceiving(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "transaction.youAreReceiving", String(describing: p1), String(describing: p2), fallback: "You are receiving %@ %@") + } + /// You are sending %@ %@ + public static func youAreSending(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "transaction.youAreSending", String(describing: p1), String(describing: p2), fallback: "You are sending %@ %@") + } + /// You DID NOT send %@ %@ + public static func youDidNotSent(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "transaction.youDidNotSent", String(describing: p1), String(describing: p2), fallback: "You DID NOT send %@ %@") + } + /// You received %@ %@ + public static func youReceived(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "transaction.youReceived", String(describing: p1), String(describing: p2), fallback: "You received %@ %@") + } + /// You sent %@ %@ + public static func youSent(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "transaction.youSent", String(describing: p1), String(describing: p2), fallback: "You sent %@ %@") + } + } + public enum TransactionDetail { + /// Error: %@ + public static func error(_ p1: Any) -> String { + return L10n.tr("Localizable", "transactionDetail.error", String(describing: p1), fallback: "Error: %@") + } + /// Transaction detail + public static let title = L10n.tr("Localizable", "transactionDetail.title", fallback: "Transaction detail") + } + public enum Transactions { + /// Transactions + public static let title = L10n.tr("Localizable", "transactions.title", fallback: "Transactions") + } + public enum ValidationFailed { + /// Your placed words did not match your secret recovery phrase. + public static let description = L10n.tr("Localizable", "validationFailed.description", fallback: "Your placed words did not match your secret recovery phrase.") + /// Remember, you can't recover your funds if you lose (or incorrectly save) these 24 words. + public static let incorrectBackupDescription = L10n.tr("Localizable", "validationFailed.incorrectBackupDescription", fallback: "Remember, you can't recover your funds if you lose (or incorrectly save) these 24 words.") + /// Ouch, sorry, no. + public static let title = L10n.tr("Localizable", "validationFailed.title", fallback: "Ouch, sorry, no.") + public enum Button { + /// Try again + public static let tryAgain = L10n.tr("Localizable", "validationFailed.button.tryAgain", fallback: "Try again") + } + } + public enum ValidationSuccess { + /// Place that backup somewhere safe and venture forth in security. + public static let description = L10n.tr("Localizable", "validationSuccess.description", fallback: "Place that backup somewhere safe and venture forth in security.") + /// Success! + public static let title = L10n.tr("Localizable", "validationSuccess.title", fallback: "Success!") + public enum Button { + /// Take me to my wallet! + public static let goToWallet = L10n.tr("Localizable", "validationSuccess.button.goToWallet", fallback: "Take me to my wallet!") + /// Show me my phrase again + public static let phraseAgain = L10n.tr("Localizable", "validationSuccess.button.phraseAgain", fallback: "Show me my phrase again") + } + } + public enum WalletEvent { + public enum Alert { + public enum LeavingApp { + /// While usually an acceptable risk, you will possibly exposing your behavior and interest in this transaction by going online. OH NOES! What will you do? + public static let message = L10n.tr("Localizable", "walletEvent.alert.leavingApp.message", fallback: "While usually an acceptable risk, you will possibly exposing your behavior and interest in this transaction by going online. OH NOES! What will you do?") + /// You are exiting your wallet + public static let title = L10n.tr("Localizable", "walletEvent.alert.leavingApp.title", fallback: "You are exiting your wallet") + public enum Button { + /// NEVERMIND + public static let nevermind = L10n.tr("Localizable", "walletEvent.alert.leavingApp.button.nevermind", fallback: "NEVERMIND") + /// SEE TX ONLINE + public static let seeOnline = L10n.tr("Localizable", "walletEvent.alert.leavingApp.button.seeOnline", fallback: "SEE TX ONLINE") + } + } + } + public enum Detail { + /// wallet import wallet event + public static let `import` = L10n.tr("Localizable", "walletEvent.detail.import", fallback: "wallet import wallet event") + /// shielded %@ detail + public static func shielded(_ p1: Any) -> String { + return L10n.tr("Localizable", "walletEvent.detail.shielded", String(describing: p1), fallback: "shielded %@ detail") + } + } + public enum Row { + /// wallet import wallet event + public static let `import` = L10n.tr("Localizable", "walletEvent.row.import", fallback: "wallet import wallet event") + /// shielded wallet event %@ + public static func shielded(_ p1: Any) -> String { + return L10n.tr("Localizable", "walletEvent.row.shielded", String(describing: p1), fallback: "shielded wallet event %@") + } + } + } + public enum WelcomeScreen { + /// Just Loading, one sec + public static let subtitle = L10n.tr("Localizable", "welcomeScreen.subtitle", fallback: "Just Loading, one sec") + /// Powered by Zcash + public static let title = L10n.tr("Localizable", "welcomeScreen.title", fallback: "Powered by Zcash") + } +} +// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length +// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces + +// MARK: - Implementation Details + +extension L10n { + private static func tr(_ table: String, _ key: String, _ args: CVarArg..., fallback value: String) -> String { + let format = BundleToken.bundle.localizedString(forKey: key, value: value, table: table) + return String(format: format, locale: Locale.current, arguments: args) + } +} + +// swiftlint:disable convenience_type +private final class BundleToken { + static let bundle: Bundle = { + #if SWIFT_PACKAGE + return Bundle.module + #else + return Bundle(for: BundleToken.self) + #endif + }() +} +// swiftlint:enable convenience_type diff --git a/secant/Resources/Assets.xcassets/Backgrounds/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/Contents.json diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout0.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout0.imageset/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout0.imageset/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout0.imageset/Contents.json diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0-1.jpg b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0-1.jpg similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0-1.jpg rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0-1.jpg diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0-2.jpg b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0-2.jpg similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0-2.jpg rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0-2.jpg diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0.jpg b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0.jpg similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0.jpg rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout0.imageset/callout0.jpg diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout1.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout1.imageset/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout1.imageset/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout1.imageset/Contents.json diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout1.imageset/ua_welcome_darktheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout1.imageset/ua_welcome_darktheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout1.imageset/ua_welcome_darktheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout1.imageset/ua_welcome_darktheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout1.imageset/ua_welcome_lighttheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout1.imageset/ua_welcome_lighttheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout1.imageset/ua_welcome_lighttheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout1.imageset/ua_welcome_lighttheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout2.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout2.imageset/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout2.imageset/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout2.imageset/Contents.json diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout2.imageset/illus_ua_darktheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout2.imageset/illus_ua_darktheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout2.imageset/illus_ua_darktheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout2.imageset/illus_ua_darktheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout2.imageset/illus_ua_lighttheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout2.imageset/illus_ua_lighttheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout2.imageset/illus_ua_lighttheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout2.imageset/illus_ua_lighttheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout3.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout3.imageset/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout3.imageset/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout3.imageset/Contents.json diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout3.imageset/illus_future_darktheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout3.imageset/illus_future_darktheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout3.imageset/illus_future_darktheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout3.imageset/illus_future_darktheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout3.imageset/illus_future_lighttheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout3.imageset/illus_future_lighttheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout3.imageset/illus_future_lighttheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout3.imageset/illus_future_lighttheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout4.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout4.imageset/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout4.imageset/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout4.imageset/Contents.json diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout4.imageset/illus_done_darktheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout4.imageset/illus_done_darktheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout4.imageset/illus_done_darktheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout4.imageset/illus_done_darktheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/callout4.imageset/illus_done_lighttheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout4.imageset/illus_done_lighttheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/callout4.imageset/illus_done_lighttheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/callout4.imageset/illus_done_lighttheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/Contents.json diff --git a/secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/illus_alert_darktheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/illus_alert_darktheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/illus_alert_darktheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/illus_alert_darktheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/illus_alert_lighttheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/illus_alert_lighttheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/illus_alert_lighttheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFailed.imageset/illus_alert_lighttheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/Contents.json diff --git a/secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/illus_bank_darktheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/illus_bank_darktheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/illus_bank_darktheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/illus_bank_darktheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/illus_bank_lighttheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/illus_bank_lighttheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/illus_bank_lighttheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupFlow1.imageset/illus_bank_lighttheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/Contents.json diff --git a/secant/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/illus_bigsuccess_darktheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/illus_bigsuccess_darktheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/illus_bigsuccess_darktheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/illus_bigsuccess_darktheme.pdf diff --git a/secant/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/illus_bigsuccess_lighttheme.pdf b/modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/illus_bigsuccess_lighttheme.pdf similarity index 100% rename from secant/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/illus_bigsuccess_lighttheme.pdf rename to modules/Sources/Generated/Resources/Assets.xcassets/Backgrounds/calloutBackupSucceeded.imageset/illus_bigsuccess_lighttheme.pdf diff --git a/secant/Resources/Assets.xcassets/Icons/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Icons/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Contents.json diff --git a/secant/Resources/Colors.xcassets/BackgroundColors/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Icons/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/BackgroundColors/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Icons/Contents.json diff --git a/secant/Resources/Assets.xcassets/Icons/qrCode.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/Contents.json similarity index 100% rename from secant/Resources/Assets.xcassets/Icons/qrCode.imageset/Contents.json rename to modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/Contents.json diff --git a/secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme.png b/modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme.png similarity index 100% rename from secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme.png rename to modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme.png diff --git a/secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme@2x.png b/modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme@2x.png similarity index 100% rename from secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme@2x.png rename to modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme@2x.png diff --git a/secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme@3x.png b/modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme@3x.png similarity index 100% rename from secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme@3x.png rename to modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_darktheme@3x.png diff --git a/secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme.png b/modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme.png similarity index 100% rename from secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme.png rename to modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme.png diff --git a/secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme@2x.png b/modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme@2x.png similarity index 100% rename from secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme@2x.png rename to modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme@2x.png diff --git a/secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme@3x.png b/modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme@3x.png similarity index 100% rename from secant/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme@3x.png rename to modules/Sources/Generated/Resources/Assets.xcassets/Icons/qrCode.imageset/qr_lighttheme@3x.png diff --git a/modules/Sources/Generated/Resources/Assets.xcassets/WelcomeScreenLogo.imageset/Contents.json b/modules/Sources/Generated/Resources/Assets.xcassets/WelcomeScreenLogo.imageset/Contents.json new file mode 100644 index 0000000..2106347 --- /dev/null +++ b/modules/Sources/Generated/Resources/Assets.xcassets/WelcomeScreenLogo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "eccLogo.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/modules/Sources/Generated/Resources/Assets.xcassets/WelcomeScreenLogo.imageset/eccLogo.png b/modules/Sources/Generated/Resources/Assets.xcassets/WelcomeScreenLogo.imageset/eccLogo.png new file mode 100644 index 0000000..d3d5a7a Binary files /dev/null and b/modules/Sources/Generated/Resources/Assets.xcassets/WelcomeScreenLogo.imageset/eccLogo.png differ diff --git a/secant/Resources/Colors.xcassets/Buttons/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/Contents.json diff --git a/secant/Resources/Colors.xcassets/BackgroundColors/numberedChip.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/numberedChip.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/BackgroundColors/numberedChip.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/numberedChip.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/BackgroundColors/phraseGridDarkGray.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/phraseGridDarkGray.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/BackgroundColors/phraseGridDarkGray.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/phraseGridDarkGray.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/BackgroundColors/red.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/red.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/BackgroundColors/red.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/red.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/BackgroundColors/staticWelcomeScreen.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/staticWelcomeScreen.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/BackgroundColors/staticWelcomeScreen.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/BackgroundColors/staticWelcomeScreen.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/ActiveButton.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/ActiveButton.colorset/Contents.json similarity index 76% rename from secant/Resources/Colors.xcassets/Buttons/ActiveButton.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/ActiveButton.colorset/Contents.json index 4c8b3ab..a896f30 100644 --- a/secant/Resources/Colors.xcassets/Buttons/ActiveButton.colorset/Contents.json +++ b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/ActiveButton.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0x57", - "green" : "0x33", - "red" : "0x26" + "blue" : "0.341", + "green" : "0.200", + "red" : "0.149" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0x00", - "green" : "0xB9", - "red" : "0xFF" + "blue" : "0.000", + "green" : "0.725", + "red" : "1.000" } }, "idiom" : "universal" diff --git a/secant/Resources/Colors.xcassets/Buttons/ActiveButtonDisabled.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/ActiveButtonDisabled.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/ActiveButtonDisabled.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/ActiveButtonDisabled.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/ActiveButtonPressed.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/ActiveButtonPressed.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/ActiveButtonPressed.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/ActiveButtonPressed.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/ButtonsTitleShadow.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/ButtonsTitleShadow.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/ButtonsTitleShadow.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/ButtonsTitleShadow.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/CheckCircle/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/CheckCircle/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/NeumorphicButtonDarkSide.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/NeumorphicButtonDarkSide.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/NeumorphicButtonDarkSide.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/NeumorphicButtonDarkSide.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/NeumorphicButtonLightSide.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/NeumorphicButtonLightSide.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/NeumorphicButtonLightSide.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/NeumorphicButtonLightSide.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/OnboardingNavigation.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/OnboardingNavigation.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/OnboardingNavigation.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/OnboardingNavigation.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/OnboardingNavigationPressed.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/OnboardingNavigationPressed.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/OnboardingNavigationPressed.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/OnboardingNavigationPressed.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/PrimaryButton.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/PrimaryButton.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/PrimaryButton.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/PrimaryButton.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/PrimaryButtonDisabled.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/PrimaryButtonDisabled.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/PrimaryButtonDisabled.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/PrimaryButtonDisabled.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/PrimaryButtonPressed.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/PrimaryButtonPressed.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/PrimaryButtonPressed.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/PrimaryButtonPressed.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/SecondaryButton.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/SecondaryButton.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/SecondaryButton.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/SecondaryButton.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Buttons/SecondaryButtonPressed.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Buttons/SecondaryButtonPressed.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Buttons/SecondaryButtonPressed.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Buttons/SecondaryButtonPressed.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/CheckCircle/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/CheckCircle/Contents.json diff --git a/secant/Resources/Colors.xcassets/CheckCircle/externalRing.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/CheckCircle/externalRing.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/CheckCircle/externalRing.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/CheckCircle/externalRing.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/CheckCircle/internalRing.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/CheckCircle/internalRing.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/CheckCircle/internalRing.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/CheckCircle/internalRing.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Cursor/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Cursor/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Contents.json diff --git a/secant/Resources/Colors.xcassets/Cursor/Bar.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Cursor/Bar.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Cursor/Bar.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Cursor/Bar.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/MFP/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Cursor/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/MFP/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Cursor/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/MFP/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/MFP/Contents.json diff --git a/secant/Resources/Colors.xcassets/MFP/background.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/MFP/background.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/MFP/background.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/MFP/background.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/MFP/fontDark.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/MFP/fontDark.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/MFP/fontDark.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/MFP/fontDark.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/MFP/fontLight.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/MFP/fontLight.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/MFP/fontLight.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/MFP/fontLight.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/MFP/primary.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/MFP/primary.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/MFP/primary.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/MFP/primary.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/BadgeShadow.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/BadgeShadow.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/BadgeShadow.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/BadgeShadow.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/CircularFrameDarkOutlineGradientEnd.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/CircularFrameDarkOutlineGradientEnd.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/CircularFrameDarkOutlineGradientEnd.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/CircularFrameDarkOutlineGradientEnd.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/CircularFrameDarkOutlineGradientStart.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/CircularFrameDarkOutlineGradientStart.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/CircularFrameDarkOutlineGradientStart.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/CircularFrameDarkOutlineGradientStart.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/CircularFrameGradientEnd.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/CircularFrameGradientEnd.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/CircularFrameGradientEnd.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/CircularFrameGradientEnd.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/CircularFrameGradientStart.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/CircularFrameGradientStart.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/CircularFrameGradientStart.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/CircularFrameGradientStart.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ProgressIndicator/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ProgressIndicator/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/NavigationButtonDisabled.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/NavigationButtonDisabled.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/NavigationButtonDisabled.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/NavigationButtonDisabled.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/NavigationButtonEnabled.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/NavigationButtonEnabled.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/NavigationButtonEnabled.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/NavigationButtonEnabled.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/NeumorphicDarkSide.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/NeumorphicDarkSide.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/NeumorphicDarkSide.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/NeumorphicDarkSide.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/NeumorphicLightSide.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/NeumorphicLightSide.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/NeumorphicLightSide.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/NeumorphicLightSide.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Onboarding/badgeBackground.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/badgeBackground.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Onboarding/badgeBackground.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Onboarding/badgeBackground.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/QRScan/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/QRScan/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/Contents.json diff --git a/secant/Resources/Colors.xcassets/ProgressIndicator/GradientLeft.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/GradientLeft.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ProgressIndicator/GradientLeft.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/GradientLeft.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ProgressIndicator/GradientRight.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/GradientRight.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ProgressIndicator/GradientRight.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/GradientRight.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ProgressIndicator/NegativeSpace.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/NegativeSpace.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ProgressIndicator/NegativeSpace.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/NegativeSpace.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ProgressIndicator/holdToSendButton.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/holdToSendButton.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ProgressIndicator/holdToSendButton.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ProgressIndicator/holdToSendButton.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/QRScan/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/QRScan/Contents.json diff --git a/secant/Resources/Colors.xcassets/QRScan/frame.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/QRScan/frame.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/QRScan/frame.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/QRScan/frame.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Shadow/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Shadow/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/amberGradientEnd.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/amberGradientEnd.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/amberGradientEnd.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/amberGradientEnd.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/amberGradientMiddle.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/amberGradientMiddle.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/amberGradientMiddle.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/amberGradientMiddle.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/amberGradientStart.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/amberGradientStart.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/amberGradientStart.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/amberGradientStart.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/gradientDarkEnd.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/gradientDarkEnd.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/gradientDarkEnd.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/gradientDarkEnd.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/gradientDarkStart.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/gradientDarkStart.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/gradientDarkStart.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/gradientDarkStart.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/gradientEnd.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/gradientEnd.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/gradientEnd.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/gradientEnd.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/gradientStart.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/gradientStart.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/gradientStart.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/gradientStart.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/greenGradientEnd.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/greenGradientEnd.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/greenGradientEnd.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/greenGradientEnd.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/greenGradientStart.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/greenGradientStart.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/greenGradientStart.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/greenGradientStart.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/modalDialog.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/modalDialog.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/modalDialog.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/modalDialog.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/redGradientEnd.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/redGradientEnd.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/redGradientEnd.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/redGradientEnd.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/redGradientStart.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/redGradientStart.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/redGradientStart.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/redGradientStart.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/semiTransparentGradientEnd.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/semiTransparentGradientEnd.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/semiTransparentGradientEnd.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/semiTransparentGradientEnd.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ScreenBackground/semiTransparentGradientStart.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/semiTransparentGradientStart.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ScreenBackground/semiTransparentGradientStart.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ScreenBackground/semiTransparentGradientStart.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Shadow/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Shadow/Contents.json diff --git a/secant/Resources/Colors.xcassets/Shadow/drawerShadow.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Shadow/drawerShadow.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Shadow/drawerShadow.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Shadow/drawerShadow.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Shadow/emptyChipInnerShadow.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Shadow/emptyChipInnerShadow.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Shadow/emptyChipInnerShadow.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Shadow/emptyChipInnerShadow.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Shadow/holdToSendButtonShadow.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Shadow/holdToSendButtonShadow.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Shadow/holdToSendButtonShadow.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Shadow/holdToSendButtonShadow.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Shadow/numberedTextShadow.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Shadow/numberedTextShadow.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Shadow/numberedTextShadow.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Shadow/numberedTextShadow.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/ActiveButtonText.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/ActiveButtonText.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/ActiveButtonText.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/ActiveButtonText.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/Body.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/Body.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/Body.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/Body.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/Button.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/Button.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/Button.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/Button.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TextField/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TextField/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/DrawerTabsText.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/DrawerTabsText.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/DrawerTabsText.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/DrawerTabsText.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/Heading.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/Heading.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/Heading.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/Heading.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/ImportSeedEditor.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/ImportSeedEditor.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/ImportSeedEditor.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/ImportSeedEditor.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/InvalidEntry.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/InvalidEntry.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/InvalidEntry.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/InvalidEntry.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/Medium.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/Medium.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/Medium.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/Medium.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/Regular.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/Regular.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/Regular.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/Regular.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/SecondaryButtonText.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/SecondaryButtonText.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/SecondaryButtonText.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/SecondaryButtonText.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/TitleText.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/TitleText.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/TitleText.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/TitleText.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/TransactionDetailText.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/TransactionDetailText.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/TransactionDetailText.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/TransactionDetailText.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/TransactionRowSubtitle.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/TransactionRowSubtitle.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/TransactionRowSubtitle.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/TransactionRowSubtitle.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/ValidMnemonic.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/ValidMnemonic.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/ValidMnemonic.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/ValidMnemonic.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/balanceText.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/balanceText.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/balanceText.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/balanceText.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/captionText.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/captionText.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/captionText.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/captionText.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/captionTextShadow.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/captionTextShadow.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/captionTextShadow.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/captionTextShadow.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/forDarkBackground.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/forDarkBackground.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/forDarkBackground.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/forDarkBackground.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/highlightedSuperscriptText.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/highlightedSuperscriptText.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/highlightedSuperscriptText.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/highlightedSuperscriptText.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/Text/moreInfoText.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/Text/moreInfoText.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/Text/moreInfoText.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/Text/moreInfoText.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TextField/Underline/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TextField/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TextField/Underline/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TextField/Contents.json diff --git a/secant/Resources/Colors.xcassets/TextField/MultilineOutline.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TextField/MultilineOutline.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TextField/MultilineOutline.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TextField/MultilineOutline.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TextField/TitleAccessoryButton.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TextField/TitleAccessoryButton.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TextField/TitleAccessoryButton.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TextField/TitleAccessoryButton.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TextField/TitleAccessoryButtonPressed.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TextField/TitleAccessoryButtonPressed.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TextField/TitleAccessoryButtonPressed.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TextField/TitleAccessoryButtonPressed.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TransactionDetail/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TextField/Underline/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TransactionDetail/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TextField/Underline/Contents.json diff --git a/secant/Resources/Colors.xcassets/TextField/Underline/Gray.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TextField/Underline/Gray.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TextField/Underline/Gray.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TextField/Underline/Gray.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TextField/Underline/Purple.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TextField/Underline/Purple.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TextField/Underline/Purple.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TextField/Underline/Purple.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ZcashBadge/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ZcashBadge/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/Contents.json diff --git a/secant/Resources/Colors.xcassets/TransactionDetail/FailedMark.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/FailedMark.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TransactionDetail/FailedMark.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/FailedMark.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TransactionDetail/HighlightMark.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/HighlightMark.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TransactionDetail/HighlightMark.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/HighlightMark.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TransactionDetail/InactiveMark.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/InactiveMark.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TransactionDetail/InactiveMark.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/InactiveMark.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TransactionDetail/NeutralMark.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/NeutralMark.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TransactionDetail/NeutralMark.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/NeutralMark.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/TransactionDetail/SucceededMark.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/SucceededMark.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/TransactionDetail/SucceededMark.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/TransactionDetail/SucceededMark.colorset/Contents.json diff --git a/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/secant/Resources/Colors.xcassets/ZcashBadge/ZcashLogoFill.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/ZcashLogoFill.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ZcashBadge/ZcashLogoFill.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/ZcashLogoFill.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ZcashBadge/innerCircle.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/innerCircle.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ZcashBadge/innerCircle.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/innerCircle.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ZcashBadge/outerRingGradientEnd.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/outerRingGradientEnd.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ZcashBadge/outerRingGradientEnd.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/outerRingGradientEnd.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ZcashBadge/outerRingGradientStart.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/outerRingGradientStart.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ZcashBadge/outerRingGradientStart.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/outerRingGradientStart.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ZcashBadge/shadowColor.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/shadowColor.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ZcashBadge/shadowColor.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/shadowColor.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ZcashBadge/thickRing.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/thickRing.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ZcashBadge/thickRing.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/thickRing.colorset/Contents.json diff --git a/secant/Resources/Colors.xcassets/ZcashBadge/thinRing.colorset/Contents.json b/modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/thinRing.colorset/Contents.json similarity index 100% rename from secant/Resources/Colors.xcassets/ZcashBadge/thinRing.colorset/Contents.json rename to modules/Sources/Generated/Resources/Colors.xcassets/ZcashBadge/thinRing.colorset/Contents.json diff --git a/modules/Sources/Generated/Resources/Fonts/Roboto/LICENSE.txt b/modules/Sources/Generated/Resources/Fonts/Roboto/LICENSE.txt new file mode 100644 index 0000000..75b5248 --- /dev/null +++ b/modules/Sources/Generated/Resources/Fonts/Roboto/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + 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. diff --git a/secant/Resources/Fonts/Roboto/Roboto-Black.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Black.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-Black.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Black.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-BlackItalic.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-BlackItalic.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-BlackItalic.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-BlackItalic.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-Bold.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Bold.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-Bold.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Bold.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-BoldItalic.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-BoldItalic.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-BoldItalic.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-BoldItalic.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-Italic.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Italic.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-Italic.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Italic.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-Light.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Light.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-Light.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Light.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-LightItalic.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-LightItalic.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-LightItalic.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-LightItalic.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-Medium.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Medium.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-Medium.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Medium.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-MediumItalic.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-MediumItalic.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-MediumItalic.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-MediumItalic.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-Regular.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Regular.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-Regular.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Regular.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-Thin.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Thin.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-Thin.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-Thin.ttf diff --git a/secant/Resources/Fonts/Roboto/Roboto-ThinItalic.ttf b/modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-ThinItalic.ttf similarity index 100% rename from secant/Resources/Fonts/Roboto/Roboto-ThinItalic.ttf rename to modules/Sources/Generated/Resources/Fonts/Roboto/Roboto-ThinItalic.ttf diff --git a/secant/Resources/Fonts/Rubik/Rubik-Italic-VariableFont_wght.ttf b/modules/Sources/Generated/Resources/Fonts/Rubik/Rubik-Italic-VariableFont_wght.ttf similarity index 100% rename from secant/Resources/Fonts/Rubik/Rubik-Italic-VariableFont_wght.ttf rename to modules/Sources/Generated/Resources/Fonts/Rubik/Rubik-Italic-VariableFont_wght.ttf diff --git a/secant/Resources/Fonts/Rubik/Rubik-VariableFont_wght.ttf b/modules/Sources/Generated/Resources/Fonts/Rubik/Rubik-VariableFont_wght.ttf similarity index 100% rename from secant/Resources/Fonts/Rubik/Rubik-VariableFont_wght.ttf rename to modules/Sources/Generated/Resources/Fonts/Rubik/Rubik-VariableFont_wght.ttf diff --git a/secant/Resources/Fonts/Zboto.otf b/modules/Sources/Generated/Resources/Fonts/Zboto.otf similarity index 100% rename from secant/Resources/Fonts/Zboto.otf rename to modules/Sources/Generated/Resources/Fonts/Zboto.otf diff --git a/secant/Resources/Localizable.strings b/modules/Sources/Generated/Resources/Localizable.strings similarity index 100% rename from secant/Resources/Localizable.strings rename to modules/Sources/Generated/Resources/Localizable.strings diff --git a/modules/Sources/Generated/XCAssets+Generated.swift b/modules/Sources/Generated/XCAssets+Generated.swift new file mode 100644 index 0000000..af82988 --- /dev/null +++ b/modules/Sources/Generated/XCAssets+Generated.swift @@ -0,0 +1,269 @@ +// swiftlint:disable all +// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen + +import SwiftUI +#if os(macOS) + import AppKit +#elseif os(iOS) + import UIKit +#elseif os(tvOS) || os(watchOS) + import UIKit +#endif + +// Deprecated typealiases +@available(*, deprecated, renamed: "ColorAsset.SystemColor", message: "This typealias will be removed in SwiftGen 7.0") +public typealias AssetColorTypeAlias = ColorAsset.SystemColor +@available(*, deprecated, renamed: "ImageAsset.UniversalImage", message: "This typealias will be removed in SwiftGen 7.0") +public typealias AssetImageTypeAlias = ImageAsset.UniversalImage + +// swiftlint:disable superfluous_disable_command file_length implicit_return + +// MARK: - Asset Catalogs + +// swiftlint:disable identifier_name line_length nesting type_body_length type_name +public enum Asset { + public enum Assets { + public enum Backgrounds { + public static let callout0 = ImageAsset(name: "callout0") + public static let callout1 = ImageAsset(name: "callout1") + public static let callout2 = ImageAsset(name: "callout2") + public static let callout3 = ImageAsset(name: "callout3") + public static let callout4 = ImageAsset(name: "callout4") + public static let calloutBackupFailed = ImageAsset(name: "calloutBackupFailed") + public static let calloutBackupFlow1 = ImageAsset(name: "calloutBackupFlow1") + public static let calloutBackupSucceeded = ImageAsset(name: "calloutBackupSucceeded") + } + public enum Icons { + public static let qrCode = ImageAsset(name: "qrCode") + } + public static let welcomeScreenLogo = ImageAsset(name: "WelcomeScreenLogo") + } + public enum Colors { + public enum BackgroundColors { + public static let numberedChip = ColorAsset(name: "numberedChip") + public static let phraseGridDarkGray = ColorAsset(name: "phraseGridDarkGray") + public static let red = ColorAsset(name: "red") + public static let staticWelcomeScreen = ColorAsset(name: "staticWelcomeScreen") + } + public enum Buttons { + public static let activeButton = ColorAsset(name: "ActiveButton") + public static let activeButtonDisabled = ColorAsset(name: "ActiveButtonDisabled") + public static let activeButtonPressed = ColorAsset(name: "ActiveButtonPressed") + public static let buttonsTitleShadow = ColorAsset(name: "ButtonsTitleShadow") + public static let neumorphicButtonDarkSide = ColorAsset(name: "NeumorphicButtonDarkSide") + public static let neumorphicButtonLightSide = ColorAsset(name: "NeumorphicButtonLightSide") + public static let onboardingNavigation = ColorAsset(name: "OnboardingNavigation") + public static let onboardingNavigationPressed = ColorAsset(name: "OnboardingNavigationPressed") + public static let primaryButton = ColorAsset(name: "PrimaryButton") + public static let primaryButtonDisabled = ColorAsset(name: "PrimaryButtonDisabled") + public static let primaryButtonPressed = ColorAsset(name: "PrimaryButtonPressed") + public static let secondaryButton = ColorAsset(name: "SecondaryButton") + public static let secondaryButtonPressed = ColorAsset(name: "SecondaryButtonPressed") + } + public enum CheckCircle { + public static let externalRing = ColorAsset(name: "externalRing") + public static let internalRing = ColorAsset(name: "internalRing") + } + public enum Cursor { + public static let bar = ColorAsset(name: "Bar") + } + public enum Mfp { + public static let background = ColorAsset(name: "background") + public static let fontDark = ColorAsset(name: "fontDark") + public static let fontLight = ColorAsset(name: "fontLight") + public static let primary = ColorAsset(name: "primary") + } + public enum Onboarding { + public static let badgeShadow = ColorAsset(name: "BadgeShadow") + public static let circularFrameDarkOutlineGradientEnd = ColorAsset(name: "CircularFrameDarkOutlineGradientEnd") + public static let circularFrameDarkOutlineGradientStart = ColorAsset(name: "CircularFrameDarkOutlineGradientStart") + public static let circularFrameGradientEnd = ColorAsset(name: "CircularFrameGradientEnd") + public static let circularFrameGradientStart = ColorAsset(name: "CircularFrameGradientStart") + public static let navigationButtonDisabled = ColorAsset(name: "NavigationButtonDisabled") + public static let navigationButtonEnabled = ColorAsset(name: "NavigationButtonEnabled") + public static let neumorphicDarkSide = ColorAsset(name: "NeumorphicDarkSide") + public static let neumorphicLightSide = ColorAsset(name: "NeumorphicLightSide") + public static let badgeBackground = ColorAsset(name: "badgeBackground") + } + public enum ProgressIndicator { + public static let gradientLeft = ColorAsset(name: "GradientLeft") + public static let gradientRight = ColorAsset(name: "GradientRight") + public static let negativeSpace = ColorAsset(name: "NegativeSpace") + public static let holdToSendButton = ColorAsset(name: "holdToSendButton") + } + public enum QRScan { + public static let frame = ColorAsset(name: "frame") + } + public enum ScreenBackground { + public static let amberGradientEnd = ColorAsset(name: "amberGradientEnd") + public static let amberGradientMiddle = ColorAsset(name: "amberGradientMiddle") + public static let amberGradientStart = ColorAsset(name: "amberGradientStart") + public static let gradientDarkEnd = ColorAsset(name: "gradientDarkEnd") + public static let gradientDarkStart = ColorAsset(name: "gradientDarkStart") + public static let gradientEnd = ColorAsset(name: "gradientEnd") + public static let gradientStart = ColorAsset(name: "gradientStart") + public static let greenGradientEnd = ColorAsset(name: "greenGradientEnd") + public static let greenGradientStart = ColorAsset(name: "greenGradientStart") + public static let modalDialog = ColorAsset(name: "modalDialog") + public static let redGradientEnd = ColorAsset(name: "redGradientEnd") + public static let redGradientStart = ColorAsset(name: "redGradientStart") + public static let semiTransparentGradientEnd = ColorAsset(name: "semiTransparentGradientEnd") + public static let semiTransparentGradientStart = ColorAsset(name: "semiTransparentGradientStart") + } + public enum Shadow { + public static let drawerShadow = ColorAsset(name: "drawerShadow") + public static let emptyChipInnerShadow = ColorAsset(name: "emptyChipInnerShadow") + public static let holdToSendButtonShadow = ColorAsset(name: "holdToSendButtonShadow") + public static let numberedTextShadow = ColorAsset(name: "numberedTextShadow") + } + public enum Text { + public static let activeButtonText = ColorAsset(name: "ActiveButtonText") + public static let body = ColorAsset(name: "Body") + public static let button = ColorAsset(name: "Button") + public static let drawerTabsText = ColorAsset(name: "DrawerTabsText") + public static let heading = ColorAsset(name: "Heading") + public static let importSeedEditor = ColorAsset(name: "ImportSeedEditor") + public static let invalidEntry = ColorAsset(name: "InvalidEntry") + public static let medium = ColorAsset(name: "Medium") + public static let regular = ColorAsset(name: "Regular") + public static let secondaryButtonText = ColorAsset(name: "SecondaryButtonText") + public static let titleText = ColorAsset(name: "TitleText") + public static let transactionDetailText = ColorAsset(name: "TransactionDetailText") + public static let transactionRowSubtitle = ColorAsset(name: "TransactionRowSubtitle") + public static let validMnemonic = ColorAsset(name: "ValidMnemonic") + public static let balanceText = ColorAsset(name: "balanceText") + public static let captionText = ColorAsset(name: "captionText") + public static let captionTextShadow = ColorAsset(name: "captionTextShadow") + public static let forDarkBackground = ColorAsset(name: "forDarkBackground") + public static let highlightedSuperscriptText = ColorAsset(name: "highlightedSuperscriptText") + public static let moreInfoText = ColorAsset(name: "moreInfoText") + } + public enum TextField { + public static let multilineOutline = ColorAsset(name: "MultilineOutline") + public static let titleAccessoryButton = ColorAsset(name: "TitleAccessoryButton") + public static let titleAccessoryButtonPressed = ColorAsset(name: "TitleAccessoryButtonPressed") + public enum Underline { + public static let gray = ColorAsset(name: "Gray") + public static let purple = ColorAsset(name: "Purple") + } + } + public enum TransactionDetail { + public static let failedMark = ColorAsset(name: "FailedMark") + public static let highlightMark = ColorAsset(name: "HighlightMark") + public static let inactiveMark = ColorAsset(name: "InactiveMark") + public static let neutralMark = ColorAsset(name: "NeutralMark") + public static let succeededMark = ColorAsset(name: "SucceededMark") + } + public enum ZcashBadge { + public static let zcashLogoFill = ColorAsset(name: "ZcashLogoFill") + public static let innerCircle = ColorAsset(name: "innerCircle") + public static let outerRingGradientEnd = ColorAsset(name: "outerRingGradientEnd") + public static let outerRingGradientStart = ColorAsset(name: "outerRingGradientStart") + public static let shadowColor = ColorAsset(name: "shadowColor") + public static let thickRing = ColorAsset(name: "thickRing") + public static let thinRing = ColorAsset(name: "thinRing") + } + } +} +// swiftlint:enable identifier_name line_length nesting type_body_length type_name + +// MARK: - Implementation Details + +public final class ColorAsset { + public fileprivate(set) var name: String + + #if os(macOS) + public typealias SystemColor = NSColor + #elseif os(iOS) || os(tvOS) || os(watchOS) + public typealias SystemColor = UIColor + #endif + + @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *) + public private(set) lazy var systemColor: SystemColor = { + guard let color = SystemColor(asset: self) else { + fatalError("Unable to load color asset named \(name).") + } + return color + }() + + public private(set) lazy var color: Color = { + Color(systemColor) + }() + + fileprivate init(name: String) { + self.name = name + } +} + +public extension ColorAsset.SystemColor { + @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *) + convenience init?(asset: ColorAsset) { + let bundle = BundleToken.bundle + #if os(iOS) || os(tvOS) + self.init(named: asset.name, in: bundle, compatibleWith: nil) + #elseif os(macOS) + self.init(named: NSColor.Name(asset.name), bundle: bundle) + #elseif os(watchOS) + self.init(named: asset.name) + #endif + } +} + +public struct ImageAsset { + public fileprivate(set) var name: String + + #if os(macOS) + public typealias UniversalImage = NSImage + #elseif os(iOS) || os(tvOS) || os(watchOS) + public typealias UniversalImage = UIImage + #endif + + public var systemImage: UniversalImage { + let bundle = BundleToken.bundle + #if os(iOS) || os(tvOS) + let image = UniversalImage(named: name, in: bundle, compatibleWith: nil) + #elseif os(macOS) + let name = NSImage.Name(self.name) + let image = (bundle == .main) ? NSImage(named: name) : bundle.image(forResource: name) + #elseif os(watchOS) + let image = UniversalImage(named: name) + #endif + guard let result = image else { + fatalError("Unable to load image asset named \(name).") + } + return result + } + + public var image: Image { + let bundle = BundleToken.bundle + return Image(name, bundle: bundle) + } +} + +public extension ImageAsset.UniversalImage { + @available(macOS, deprecated, + message: "This initializer is unsafe on macOS, please use the ImageAsset.image property") + convenience init?(asset: ImageAsset) { + #if os(iOS) || os(tvOS) + let bundle = BundleToken.bundle + self.init(named: asset.name, in: bundle, compatibleWith: nil) + #elseif os(macOS) + self.init(named: NSImage.Name(asset.name)) + #elseif os(watchOS) + self.init(named: asset.name) + #endif + } +} + +// swiftlint:disable convenience_type +private final class BundleToken { + static let bundle: Bundle = { + #if SWIFT_PACKAGE + return Bundle.module + #else + return Bundle(for: BundleToken.self) + #endif + }() +} + +// swiftlint:enable convenience_type diff --git a/modules/Sources/LocalAuthenticationClient/LocalAuthenticationHandlerInterface.swift b/modules/Sources/LocalAuthenticationClient/LocalAuthenticationInterface.swift similarity index 87% rename from modules/Sources/LocalAuthenticationClient/LocalAuthenticationHandlerInterface.swift rename to modules/Sources/LocalAuthenticationClient/LocalAuthenticationInterface.swift index 1a60ecf..22c24b0 100644 --- a/modules/Sources/LocalAuthenticationClient/LocalAuthenticationHandlerInterface.swift +++ b/modules/Sources/LocalAuthenticationClient/LocalAuthenticationInterface.swift @@ -16,5 +16,5 @@ extension DependencyValues { } public struct LocalAuthenticationClient { - public let authenticate: @Sendable (String) async -> Bool + public let authenticate: @Sendable () async -> Bool } diff --git a/modules/Sources/LocalAuthenticationClient/LocalAuthenticationLiveKey.swift b/modules/Sources/LocalAuthenticationClient/LocalAuthenticationLiveKey.swift index f06bd30..548f8a4 100644 --- a/modules/Sources/LocalAuthenticationClient/LocalAuthenticationLiveKey.swift +++ b/modules/Sources/LocalAuthenticationClient/LocalAuthenticationLiveKey.swift @@ -7,12 +7,14 @@ import ComposableArchitecture import LocalAuthentication +import Generated extension LocalAuthenticationClient: DependencyKey { public static let liveValue = Self( - authenticate: { reason in + authenticate: { let context = LAContext() var error: NSError? + let reason = L10n.LocalAuthentication.reason do { /// Biometrics validation diff --git a/modules/Sources/LocalAuthenticationClient/LocalAuthenticationMocks.swift b/modules/Sources/LocalAuthenticationClient/LocalAuthenticationMocks.swift index 56d9b24..c13a45c 100644 --- a/modules/Sources/LocalAuthenticationClient/LocalAuthenticationMocks.swift +++ b/modules/Sources/LocalAuthenticationClient/LocalAuthenticationMocks.swift @@ -7,10 +7,10 @@ extension LocalAuthenticationClient { public static let mockAuthenticationSucceeded = Self( - authenticate: { _ in true } + authenticate: { true } ) public static let mockAuthenticationFailed = Self( - authenticate: { _ in false } + authenticate: { false } ) } diff --git a/secant/Models/DropDelegate.swift b/modules/Sources/Models/DropDelegate.swift similarity index 77% rename from secant/Models/DropDelegate.swift rename to modules/Sources/Models/DropDelegate.swift index 447a1cb..f647a53 100644 --- a/secant/Models/DropDelegate.swift +++ b/modules/Sources/Models/DropDelegate.swift @@ -9,16 +9,21 @@ import Foundation import SwiftUI import OrderedCollections import ComposableArchitecture +import UIComponents /// Drop delegate that accepts items conforming to `PhraseChip.validationWordTypeIdentifier` -struct WordChipDropDelegate: DropDelegate { +public struct WordChipDropDelegate: DropDelegate { var dropAction: ((PhraseChip.Kind) -> Void)? - func validateDrop(info: DropInfo) -> Bool { + public init(dropAction: ((PhraseChip.Kind) -> Void)? = nil) { + self.dropAction = dropAction + } + + public func validateDrop(info: DropInfo) -> Bool { return info.hasItemsConforming(to: [PhraseChip.validationWordTypeIdentifier]) } - func performDrop(info: DropInfo) -> Bool { + public func performDrop(info: DropInfo) -> Bool { if let item = info.itemProviders(for: [PhraseChip.validationWordTypeIdentifier]).first { item.loadItem(forTypeIdentifier: PhraseChip.validationWordTypeIdentifier, options: nil) { text, _ in DispatchQueue.main.async { @@ -35,9 +40,3 @@ struct WordChipDropDelegate: DropDelegate { return false } } - -extension RecoveryPhraseValidationFlowReducer.State { - func groupCompleted(index: Int) -> Bool { - validationWords.first(where: { $0.groupIndex == index }) != nil - } -} diff --git a/modules/Sources/Models/RecoveryPhrase.swift b/modules/Sources/Models/RecoveryPhrase.swift new file mode 100644 index 0000000..2ba47d1 --- /dev/null +++ b/modules/Sources/Models/RecoveryPhrase.swift @@ -0,0 +1,89 @@ +// +// RecoveryPhrase.swift +// secant-testnet +// +// Created by Lukáš Korba on 12.05.2022. +// + +import Foundation +import ZcashLightClientKit +import Utils +import UIComponents + +public enum RecoveryPhraseError: Error { + /// This error is thrown then the Recovery Phrase can't be generated + case unableToGeneratePhrase +} + +public struct RecoveryPhrase: Equatable, Redactable { + public struct Group: Hashable { + public var startIndex: Int + public var words: [RedactableString] + } + + public let words: [RedactableString] + + private let groupSize = 6 + + public init(words: [RedactableString]) { + self.words = words + } + + public func toGroups(groupSizeOverride: Int? = nil) -> [Group] { + let internalGroupSize = groupSizeOverride ?? groupSize + let chunks = words.count / internalGroupSize + return zip(0 ..< chunks, words.chunked(into: internalGroupSize)).map { + Group(startIndex: $0 * internalGroupSize + 1, words: $1) + } + } + + public func toString() -> RedactableString { + let result = words + .map { $0.data } + .joined(separator: " ") + return result.redacted + } + + public func words(fromMissingIndices indices: [Int]) -> [PhraseChip.Kind] { + assert((indices.count - 1) * groupSize <= self.words.count) + + return indices.enumerated().map { index, position in + .unassigned(word: self.words[(index * groupSize) + position]) + } + } +} + +// TODO: [#695] This should have a #DEBUG tag, but if so, it's not possible to compile this on release mode and submit it to testflight https://github.com/zcash/ZcashLightClientKit/issues/695 +extension RecoveryPhrase { + public static let testPhrase = [ + // 1 + "bring", "salute", "thank", + "require", "spirit", "toe", + // 7 + "boil", "hill", "casino", + "trophy", "drink", "frown", + // 13 + "bird", "grit", "close", + "morning", "bind", "cancel", + // 19 + "daughter", "salon", "quit", + "pizza", "just", "garlic" + ] + + public static let placeholder = RecoveryPhrase(words: testPhrase.map { $0.redacted }) + public static let empty = RecoveryPhrase(words: []) +} + +extension RecoveryPhrase.Group { + /// Returns an array of words where the word at the missing index will be an empty string + func words(with missingIndex: Int) -> [RedactableString] { + assert(missingIndex >= 0) + assert(missingIndex < self.words.count) + + var wordsApplyingMissing = self.words + + wordsApplyingMissing[missingIndex] = "".redacted + + return wordsApplyingMissing + } +} diff --git a/secant/Models/TransactionState.swift b/modules/Sources/Models/TransactionState.swift similarity index 52% rename from secant/Models/TransactionState.swift rename to modules/Sources/Models/TransactionState.swift index 0d569bc..70b7960 100644 --- a/secant/Models/TransactionState.swift +++ b/modules/Sources/Models/TransactionState.swift @@ -9,8 +9,8 @@ import Foundation import ZcashLightClientKit /// Representation of the transaction on the SDK side, used as a bridge to the TCA wallet side. -struct TransactionState: Equatable, Identifiable { - enum Status: Equatable { +public struct TransactionState: Equatable, Identifiable { + public enum Status: Equatable { case paid(success: Bool) case received case failed @@ -18,24 +18,24 @@ struct TransactionState: Equatable, Identifiable { case receiving } - var errorMessage: String? - var expiryHeight: BlockHeight? - var memos: [Memo]? - var minedHeight: BlockHeight? - var shielded = true - var zAddress: String? + public var errorMessage: String? + public var expiryHeight: BlockHeight? + public var memos: [Memo]? + public var minedHeight: BlockHeight? + public var shielded = true + public var zAddress: String? - var fee: Zatoshi - var id: String - var status: Status - var timestamp: TimeInterval? - var zecAmount: Zatoshi + public var fee: Zatoshi + public var id: String + public var status: Status + public var timestamp: TimeInterval? + public var zecAmount: Zatoshi - var address: String { + public var address: String { zAddress ?? "" } - var unarySymbol: String { + public var unarySymbol: String { switch status { case .paid, .sending: return "-" @@ -46,21 +46,47 @@ struct TransactionState: Equatable, Identifiable { } } - var date: Date? { + public var date: Date? { guard let timestamp else { return nil } return Date(timeIntervalSince1970: timestamp) } - var totalAmount: Zatoshi { + public var totalAmount: Zatoshi { Zatoshi(zecAmount.amount + fee.amount) } - var viewOnlineURL: URL? { + public var viewOnlineURL: URL? { URL(string: "https://zcashblockexplorer.com/transactions/\(id)") } - func confirmationsWith(_ latestMinedHeight: BlockHeight?) -> BlockHeight { + public init( + errorMessage: String? = nil, + expiryHeight: BlockHeight? = nil, + memos: [Memo]? = nil, + minedHeight: BlockHeight? = nil, + shielded: Bool = true, + zAddress: String? = nil, + fee: Zatoshi, + id: String, + status: Status, + timestamp: TimeInterval? = nil, + zecAmount: Zatoshi + ) { + self.errorMessage = errorMessage + self.expiryHeight = expiryHeight + self.memos = memos + self.minedHeight = minedHeight + self.shielded = shielded + self.zAddress = zAddress + self.fee = fee + self.id = id + self.status = status + self.timestamp = timestamp + self.zecAmount = zecAmount + } + + public func confirmationsWith(_ latestMinedHeight: BlockHeight?) -> BlockHeight { guard let minedHeight, let latestMinedHeight, minedHeight > 0, latestMinedHeight > 0 else { return 0 } @@ -70,7 +96,7 @@ struct TransactionState: Equatable, Identifiable { } extension TransactionState { - init(transaction: ZcashTransaction.Overview, memos: [Memo]? = nil, latestBlockHeight: BlockHeight? = nil) { + public init(transaction: ZcashTransaction.Overview, memos: [Memo]? = nil, latestBlockHeight: BlockHeight? = nil) { expiryHeight = transaction.expiryHeight minedHeight = transaction.minedHeight fee = transaction.fee ?? .zero @@ -93,12 +119,12 @@ extension TransactionState { // MARK: - Placeholders extension TransactionState { - static func placeholder( - amount: Zatoshi, - fee: Zatoshi, + public static func placeholder( + amount: Zatoshi = .zero, + fee: Zatoshi = .zero, shielded: Bool = true, status: Status = .received, - timestamp: TimeInterval, + timestamp: TimeInterval = 0.0, uuid: String = UUID().debugDescription ) -> TransactionState { .init( @@ -116,10 +142,24 @@ extension TransactionState { } } -struct TransactionStateMockHelper { - var date: TimeInterval - var amount: Zatoshi - var shielded = true - var status: TransactionState.Status = .received - var uuid = "" +public struct TransactionStateMockHelper { + public var date: TimeInterval + public var amount: Zatoshi + public var shielded = true + public var status: TransactionState.Status = .received + public var uuid = "" + + public init( + date: TimeInterval, + amount: Zatoshi, + shielded: Bool = true, + status: TransactionState.Status = .received, + uuid: String = "" + ) { + self.date = date + self.amount = amount + self.shielded = shielded + self.status = status + self.uuid = uuid + } } diff --git a/secant/Models/ValidationWord.swift b/modules/Sources/Models/ValidationWord.swift similarity index 55% rename from secant/Models/ValidationWord.swift rename to modules/Sources/Models/ValidationWord.swift index ae30532..45c5464 100644 --- a/secant/Models/ValidationWord.swift +++ b/modules/Sources/Models/ValidationWord.swift @@ -10,7 +10,12 @@ import Utils /// Represents the data of a word that has been placed into an empty position, that will be used /// to validate the completed phrase when all ValidationWords have been placed. -struct ValidationWord: Equatable { - var groupIndex: Int - var word: RedactableString +public struct ValidationWord: Equatable { + public var groupIndex: Int + public var word: RedactableString + + public init(groupIndex: Int, word: RedactableString) { + self.groupIndex = groupIndex + self.word = word + } } diff --git a/modules/Sources/Models/WalletEvent.swift b/modules/Sources/Models/WalletEvent.swift new file mode 100644 index 0000000..f011b63 --- /dev/null +++ b/modules/Sources/Models/WalletEvent.swift @@ -0,0 +1,32 @@ +// +// WalletEvent.swift +// secant-testnet +// +// Created by Lukáš Korba on 20.06.2022. +// + +import Foundation +import ComposableArchitecture +import SwiftUI +import ZcashLightClientKit +import Utils + +// MARK: - Model + +public struct WalletEvent: Equatable, Identifiable, Redactable { + public enum WalletEventState: Equatable { + case transaction(TransactionState) + case shielded(Zatoshi) + case walletImport(BlockHeight) + } + + public let id: String + public let state: WalletEventState + public var timestamp: TimeInterval? + + public init(id: String, state: WalletEventState, timestamp: TimeInterval? = nil) { + self.id = id + self.state = state + self.timestamp = timestamp + } +} diff --git a/secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizer.swift b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseRandomizerClient/RecoveryPhraseRandomizer.swift similarity index 78% rename from secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizer.swift rename to modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseRandomizerClient/RecoveryPhraseRandomizer.swift index d80ff0d..a5933da 100644 --- a/secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizer.swift +++ b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseRandomizerClient/RecoveryPhraseRandomizer.swift @@ -6,9 +6,10 @@ // import Foundation +import Models -struct RecoveryPhraseRandomizer { - func random(phrase: RecoveryPhrase) -> RecoveryPhraseValidationFlowReducer.State { +public struct RecoveryPhraseRandomizer { + public func random(phrase: RecoveryPhrase) -> RecoveryPhraseValidationFlowReducer.State { let missingIndices = randomIndices() let missingWordChipKind = phrase.words(fromMissingIndices: missingIndices).shuffled() @@ -20,7 +21,7 @@ struct RecoveryPhraseRandomizer { ) } - func randomIndices() -> [Int] { + public func randomIndices() -> [Int] { (0.. RecoveryPhraseValidationFlowReducer.State + + public init(random: @escaping (RecoveryPhrase) -> RecoveryPhraseValidationFlowReducer.State) { + self.random = random + } +} diff --git a/secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizerLiveKey.swift b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseRandomizerClient/RecoveryPhraseRandomizerLiveKey.swift similarity index 88% rename from secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizerLiveKey.swift rename to modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseRandomizerClient/RecoveryPhraseRandomizerLiveKey.swift index 42b0f53..17d30d4 100644 --- a/secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizerLiveKey.swift +++ b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseRandomizerClient/RecoveryPhraseRandomizerLiveKey.swift @@ -9,7 +9,7 @@ import Foundation import ComposableArchitecture extension RecoveryPhraseRandomizerClient: DependencyKey { - static let liveValue = Self( + public static let liveValue = Self( random: { RecoveryPhraseRandomizer().random(phrase: $0) } ) } diff --git a/secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizerTestKey.swift b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseRandomizerClient/RecoveryPhraseRandomizerTestKey.swift similarity index 89% rename from secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizerTestKey.swift rename to modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseRandomizerClient/RecoveryPhraseRandomizerTestKey.swift index 5d85fb0..efedeed 100644 --- a/secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizerTestKey.swift +++ b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseRandomizerClient/RecoveryPhraseRandomizerTestKey.swift @@ -9,7 +9,7 @@ import ComposableArchitecture import XCTestDynamicOverlay extension RecoveryPhraseRandomizerClient: TestDependencyKey { - static let testValue = Self( + public static let testValue = Self( random: XCTUnimplemented("\(Self.self).random", placeholder: .placeholder) ) } diff --git a/secant/Features/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowStore.swift b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowStore.swift similarity index 81% rename from secant/Features/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowStore.swift rename to modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowStore.swift index e391121..bd5e0eb 100644 --- a/secant/Features/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowStore.swift +++ b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowStore.swift @@ -10,13 +10,16 @@ import ComposableArchitecture import SwiftUI import Utils import FeedbackGeneratorClient +import UIComponents +import Models +import PasteboardClient -typealias RecoveryPhraseValidationFlowStore = Store -typealias RecoveryPhraseValidationFlowViewStore = ViewStore +public typealias RecoveryPhraseValidationFlowStore = Store +public typealias RecoveryPhraseValidationFlowViewStore = ViewStore -struct RecoveryPhraseValidationFlowReducer: ReducerProtocol { - struct State: Equatable { - enum Destination: Equatable, CaseIterable { +public struct RecoveryPhraseValidationFlowReducer: ReducerProtocol { + public struct State: Equatable { + public enum Destination: Equatable, CaseIterable { case validation case success case failure @@ -25,23 +28,31 @@ struct RecoveryPhraseValidationFlowReducer: ReducerProtocol { static let wordGroupSize = 6 static let phraseChunks = 4 - var phrase: RecoveryPhrase - var missingIndices: [Int] - var missingWordChips: [PhraseChip.Kind] - var validationWords: [ValidationWord] - var destination: Destination? + public var phrase: RecoveryPhrase + public var missingIndices: [Int] + public var missingWordChips: [PhraseChip.Kind] + public var validationWords: [ValidationWord] + public var destination: Destination? - var isComplete: Bool { + public var isComplete: Bool { !validationWords.isEmpty && validationWords.count == missingIndices.count } - var isValid: Bool { + public var isValid: Bool { guard let resultingPhrase = self.resultingPhrase else { return false } return resultingPhrase == phrase.words } + + public init(phrase: RecoveryPhrase, missingIndices: [Int], missingWordChips: [PhraseChip.Kind], validationWords: [ValidationWord], destination: Destination? = nil) { + self.phrase = phrase + self.missingIndices = missingIndices + self.missingWordChips = missingWordChips + self.validationWords = validationWords + self.destination = destination + } } - enum Action: Equatable { + public enum Action: Equatable { case updateDestination(RecoveryPhraseValidationFlowReducer.State.Destination?) case reset case move(wordChip: PhraseChip.Kind, intoGroup: Int) @@ -57,8 +68,10 @@ struct RecoveryPhraseValidationFlowReducer: ReducerProtocol { @Dependency(\.pasteboard) var pasteboard @Dependency(\.randomRecoveryPhrase) var randomRecoveryPhrase + public init() {} + // swiftlint:disable:next cyclomatic_complexity - func reduce(into state: inout State, action: Action) -> ComposableArchitecture.EffectTask { + public func reduce(into state: inout State, action: Action) -> ComposableArchitecture.EffectTask { switch action { case .reset: state = randomRecoveryPhrase.random(state.phrase) @@ -118,12 +131,18 @@ struct RecoveryPhraseValidationFlowReducer: ReducerProtocol { } } +extension RecoveryPhraseValidationFlowReducer.State { + func groupCompleted(index: Int) -> Bool { + validationWords.first(where: { $0.groupIndex == index }) != nil + } +} + extension RecoveryPhraseValidationFlowReducer.State { /// Given an array of RecoveryPhraseStepCompletion, missing indices, original phrase and the number of groups it was split into, /// assembly the resulting phrase. This comes up with the "proposed solution" for the recovery phrase validation challenge. /// - returns:an array of String containing the recovery phrase words ordered by the original phrase order, or `nil` /// if a resulting phrase can't be formed because the validation state is not complete. - var resultingPhrase: [RedactableString]? { + public var resultingPhrase: [RedactableString]? { guard missingIndices.count == validationWords.count else { return nil } guard validationWords.count == Self.phraseChunks else { return nil } @@ -154,20 +173,6 @@ extension RecoveryPhraseValidationFlowReducer.State { } } -extension RecoveryPhrase.Group { - /// Returns an array of words where the word at the missing index will be an empty string - func words(with missingIndex: Int) -> [RedactableString] { - assert(missingIndex >= 0) - assert(missingIndex < self.words.count) - - var wordsApplyingMissing = self.words - - wordsApplyingMissing[missingIndex] = "".redacted - - return wordsApplyingMissing - } -} - // MARK: - ViewStore extension RecoveryPhraseValidationFlowViewStore { @@ -213,7 +218,7 @@ extension RecoveryPhraseValidationFlowViewStore { // MARK: - Placeholders extension RecoveryPhraseValidationFlowReducer.State { - static let placeholder = RecoveryPhraseValidationFlowReducer.State( + public static let placeholder = RecoveryPhraseValidationFlowReducer.State( phrase: .placeholder, missingIndices: [2, 0, 3, 5], missingWordChips: [ @@ -226,7 +231,7 @@ extension RecoveryPhraseValidationFlowReducer.State { destination: nil ) - static let placeholderStep1 = RecoveryPhraseValidationFlowReducer.State( + public static let placeholderStep1 = RecoveryPhraseValidationFlowReducer.State( phrase: .placeholder, missingIndices: [2, 0, 3, 5], missingWordChips: [ @@ -241,7 +246,7 @@ extension RecoveryPhraseValidationFlowReducer.State { destination: nil ) - static let placeholderStep2 = RecoveryPhraseValidationFlowReducer.State( + public static let placeholderStep2 = RecoveryPhraseValidationFlowReducer.State( phrase: .placeholder, missingIndices: [2, 0, 3, 5], missingWordChips: [ @@ -257,7 +262,7 @@ extension RecoveryPhraseValidationFlowReducer.State { destination: nil ) - static let placeholderStep3 = RecoveryPhraseValidationFlowReducer.State( + public static let placeholderStep3 = RecoveryPhraseValidationFlowReducer.State( phrase: .placeholder, missingIndices: [2, 0, 3, 5], missingWordChips: [ @@ -274,7 +279,7 @@ extension RecoveryPhraseValidationFlowReducer.State { destination: nil ) - static let placeholderStep4 = RecoveryPhraseValidationFlowReducer.State( + public static let placeholderStep4 = RecoveryPhraseValidationFlowReducer.State( phrase: .placeholder, missingIndices: [2, 0, 3, 5], missingWordChips: [ diff --git a/secant/Features/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowView.swift b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowView.swift similarity index 95% rename from secant/Features/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowView.swift rename to modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowView.swift index 080c6d2..73e9d63 100644 --- a/secant/Features/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowView.swift +++ b/modules/Sources/RecoveryPhraseValidationFlow/RecoveryPhraseValidationFlowView.swift @@ -7,11 +7,16 @@ import SwiftUI import ComposableArchitecture +import Generated -struct RecoveryPhraseValidationFlowView: View { +public struct RecoveryPhraseValidationFlowView: View { var store: RecoveryPhraseValidationFlowStore - var body: some View { + public init(store: RecoveryPhraseValidationFlowStore) { + self.store = store + } + + public var body: some View { WithViewStore(store) { viewStore in GeometryReader { proxy in VStack { diff --git a/secant/Features/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupFailedView.swift b/modules/Sources/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupFailedView.swift similarity index 94% rename from secant/Features/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupFailedView.swift rename to modules/Sources/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupFailedView.swift index d4a2d89..5eb4cf1 100644 --- a/secant/Features/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupFailedView.swift +++ b/modules/Sources/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupFailedView.swift @@ -7,13 +7,20 @@ import SwiftUI import ComposableArchitecture +import Generated +import Utils +import UIComponents -struct RecoveryPhraseBackupFailedView: View { +public struct RecoveryPhraseBackupFailedView: View { @Environment(\.presentationMode) var presentationMode var store: RecoveryPhraseValidationFlowStore - var body: some View { + public init(store: RecoveryPhraseValidationFlowStore) { + self.store = store + } + + public var body: some View { WithViewStore(store) { viewStore in GeometryReader { proxy in VStack { diff --git a/secant/Features/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupSucceededView.swift b/modules/Sources/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupSucceededView.swift similarity index 95% rename from secant/Features/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupSucceededView.swift rename to modules/Sources/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupSucceededView.swift index 96fc8f9..8b78d93 100644 --- a/secant/Features/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupSucceededView.swift +++ b/modules/Sources/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupSucceededView.swift @@ -7,11 +7,16 @@ import SwiftUI import ComposableArchitecture +import Generated -struct RecoveryPhraseBackupSucceededView: View { +public struct RecoveryPhraseBackupSucceededView: View { var store: RecoveryPhraseValidationFlowStore - var body: some View { + public init(store: RecoveryPhraseValidationFlowStore) { + self.store = store + } + + public var body: some View { WithViewStore(store) { viewStore in GeometryReader { proxy in VStack { diff --git a/secant/Features/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupView.swift b/modules/Sources/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupView.swift similarity index 95% rename from secant/Features/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupView.swift rename to modules/Sources/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupView.swift index 50d8452..77abecc 100644 --- a/secant/Features/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupView.swift +++ b/modules/Sources/RecoveryPhraseValidationFlow/Views/RecoveryPhraseBackupView.swift @@ -7,15 +7,22 @@ import SwiftUI import ComposableArchitecture +import Generated +import UIComponents +import Models -struct RecoveryPhraseBackupView: View { +public struct RecoveryPhraseBackupView: View { let store: RecoveryPhraseValidationFlowStore var viewStore: RecoveryPhraseValidationFlowViewStore { ViewStore(store) } - var body: some View { + public init(store: RecoveryPhraseValidationFlowStore) { + self.store = store + } + + public var body: some View { VStack(alignment: .center) { header(for: viewStore) .padding(.horizontal) @@ -117,7 +124,7 @@ private extension RecoveryPhraseValidationFlowReducer.State { } extension RecoveryPhraseValidationFlowReducer.State { - func wordsChips( + public func wordsChips( for groupIndex: Int, groupSize: Int, from wordGroup: RecoveryPhrase.Group diff --git a/secant/Dependencies/ReviewRequest/ReviewRequestInterface.swift b/modules/Sources/ReviewRequestClient/ReviewRequestInterface.swift similarity index 51% rename from secant/Dependencies/ReviewRequest/ReviewRequestInterface.swift rename to modules/Sources/ReviewRequestClient/ReviewRequestInterface.swift index 0a449ba..1c6ecba 100644 --- a/secant/Dependencies/ReviewRequest/ReviewRequestInterface.swift +++ b/modules/Sources/ReviewRequestClient/ReviewRequestInterface.swift @@ -8,15 +8,15 @@ import ComposableArchitecture extension DependencyValues { - var reviewRequest: ReviewRequestClient { + public var reviewRequest: ReviewRequestClient { get { self[ReviewRequestClient.self] } set { self[ReviewRequestClient.self] = newValue } } } -struct ReviewRequestClient { - let canRequestReview: () -> Bool - let foundTransactions: () async -> Void - let reviewRequested: () async -> Void - let syncFinished: () async -> Void +public struct ReviewRequestClient { + public let canRequestReview: () -> Bool + public let foundTransactions: () -> Void + public let reviewRequested: () -> Void + public let syncFinished: () -> Void } diff --git a/secant/Dependencies/ReviewRequest/ReviewRequestLiveKey.swift b/modules/Sources/ReviewRequestClient/ReviewRequestLiveKey.swift similarity index 67% rename from secant/Dependencies/ReviewRequest/ReviewRequestLiveKey.swift rename to modules/Sources/ReviewRequestClient/ReviewRequestLiveKey.swift index 578ff0e..c655baa 100644 --- a/secant/Dependencies/ReviewRequest/ReviewRequestLiveKey.swift +++ b/modules/Sources/ReviewRequestClient/ReviewRequestLiveKey.swift @@ -7,13 +7,14 @@ import Foundation import ComposableArchitecture -import DateClient import AppVersionClient +import DateClient +import UserDefaultsClient extension ReviewRequestClient: DependencyKey { - static let liveValue = ReviewRequestClient.live() + public static let liveValue = ReviewRequestClient.live() - static func live( + public static func live( appVersion: AppVersionClient = .liveValue, date: DateClient = .liveValue, userDefaults: UserDefaultsClient = .live() @@ -41,26 +42,26 @@ extension ReviewRequestClient: DependencyKey { foundTransactions: { // only if there's the very first sync stored guard userDefaults.objectForKey(Constants.latestSyncKey) != nil else { return } - await userDefaults.setValue(date.now().timeIntervalSince1970, Constants.foundTransactionsKey) + userDefaults.setValue(date.now().timeIntervalSince1970, Constants.foundTransactionsKey) }, reviewRequested: { // the review has been requested, update the version and timestamp - await userDefaults.setValue(date.now().timeIntervalSince1970, Constants.reviewRequestedKey) - await userDefaults.setValue(appVersion.appVersion(), Constants.versionKey) + userDefaults.setValue(date.now().timeIntervalSince1970, Constants.reviewRequestedKey) + userDefaults.setValue(appVersion.appVersion(), Constants.versionKey) }, syncFinished: { // synchronizer's sync has been finished successfuly - await userDefaults.setValue(date.now().timeIntervalSince1970, Constants.latestSyncKey) + userDefaults.setValue(date.now().timeIntervalSince1970, Constants.latestSyncKey) } ) } } -internal extension ReviewRequestClient { - enum Constants: CaseIterable { - static let foundTransactionsKey = "ReviewRequestClient.foundTransactions" - static let latestSyncKey = "ReviewRequestClient.latestSyncKey" - static let reviewRequestedKey = "ReviewRequestClient.reviewRequestedKey" - static let versionKey = "ReviewRequestClient.versionKey" +extension ReviewRequestClient { + public enum Constants: CaseIterable { + public static let foundTransactionsKey = "ReviewRequestClient.foundTransactions" + public static let latestSyncKey = "ReviewRequestClient.latestSyncKey" + public static let reviewRequestedKey = "ReviewRequestClient.reviewRequestedKey" + public static let versionKey = "ReviewRequestClient.versionKey" } } diff --git a/secant/Dependencies/ReviewRequest/ReviewRequestTestKey.swift b/modules/Sources/ReviewRequestClient/ReviewRequestTestKey.swift similarity index 90% rename from secant/Dependencies/ReviewRequest/ReviewRequestTestKey.swift rename to modules/Sources/ReviewRequestClient/ReviewRequestTestKey.swift index 69c50a0..fae6efa 100644 --- a/secant/Dependencies/ReviewRequest/ReviewRequestTestKey.swift +++ b/modules/Sources/ReviewRequestClient/ReviewRequestTestKey.swift @@ -9,7 +9,7 @@ import ComposableArchitecture import XCTestDynamicOverlay extension ReviewRequestClient: TestDependencyKey { - static let testValue = Self( + public static let testValue = Self( canRequestReview: XCTUnimplemented("\(Self.self).canRequestReview", placeholder: false), foundTransactions: XCTUnimplemented("\(Self.self).foundTransactions"), reviewRequested: XCTUnimplemented("\(Self.self).reviewRequested"), @@ -18,7 +18,7 @@ extension ReviewRequestClient: TestDependencyKey { } extension ReviewRequestClient { - static let noOp = Self( + public static let noOp = Self( canRequestReview: { false }, foundTransactions: { }, reviewRequested: { }, diff --git a/modules/Sources/SDKSynchronizerClient/SDKSynchronizerInterface.swift b/modules/Sources/SDKSynchronizerClient/SDKSynchronizerInterface.swift new file mode 100644 index 0000000..2e9fad8 --- /dev/null +++ b/modules/Sources/SDKSynchronizerClient/SDKSynchronizerInterface.swift @@ -0,0 +1,47 @@ +// +// SDKSynchronizerClient.swift +// secant-testnet +// +// Created by Lukáš Korba on 13.04.2022. +// + +import Foundation +import Combine +import ComposableArchitecture +import ZcashLightClientKit +import Models + +extension DependencyValues { + public var sdkSynchronizer: SDKSynchronizerClient { + get { self[SDKSynchronizerClient.self] } + set { self[SDKSynchronizerClient.self] = newValue } + } +} + +public struct SDKSynchronizerClient { + public let stateStream: () -> AnyPublisher + public let eventStream: () -> AnyPublisher + public let latestState: () -> SynchronizerState + public let latestScannedHeight: () -> BlockHeight + + public let prepareWith: ([UInt8], UnifiedFullViewingKey, BlockHeight) async throws -> Void + public let start: (_ retry: Bool) async throws -> Void + public let stop: () -> Void + public let isSyncing: () -> Bool + public let isInitialized: () -> Bool + + public let rewind: (RewindPolicy) -> AnyPublisher + + public let getShieldedBalance: () -> WalletBalance? + public let getTransparentBalance: () -> WalletBalance? + public let getAllTransactions: () async throws -> [WalletEvent] + + public let getUnifiedAddress: (_ account: Int) async throws -> UnifiedAddress? + public let getTransparentAddress: (_ account: Int) async throws -> TransparentAddress? + public let getSaplingAddress: (_ accountIndex: Int) async throws -> SaplingAddress? + + public var sendTransaction: (UnifiedSpendingKey, Zatoshi, Recipient, Memo?) async throws -> TransactionState + public let shieldFunds: (UnifiedSpendingKey, Memo, Zatoshi) async throws -> TransactionState + + public let wipe: () -> AnyPublisher? +} diff --git a/secant/Dependencies/SDKSynchronizer/SDKSynchronizerLive.swift b/modules/Sources/SDKSynchronizerClient/SDKSynchronizerLive.swift similarity index 94% rename from secant/Dependencies/SDKSynchronizer/SDKSynchronizerLive.swift rename to modules/Sources/SDKSynchronizerClient/SDKSynchronizerLive.swift index ca5c218..eb76cdd 100644 --- a/secant/Dependencies/SDKSynchronizer/SDKSynchronizerLive.swift +++ b/modules/Sources/SDKSynchronizerClient/SDKSynchronizerLive.swift @@ -10,21 +10,21 @@ import Combine import ComposableArchitecture import ZcashLightClientKit import DatabaseFilesClient +import Models +import ZcashSDKEnvironment -extension SDKSynchronizerClient: DependencyKey { - static let liveValue: SDKSynchronizerClient = Self.live() - - static func live( +extension SDKSynchronizerClient { + public static func live( databaseFiles: DatabaseFilesClient = .liveValue, - environment: ZcashSDKEnvironment = .liveValue + environment: ZcashSDKEnvironment = .liveValue, + network: ZcashNetwork ) -> Self { - let network = environment.network let initializer = Initializer( cacheDbURL: databaseFiles.cacheDbURLFor(network), fsBlockDbRoot: databaseFiles.fsBlockDbRootFor(network), generalStorageURL: databaseFiles.documentsDirectory(), dataDbURL: databaseFiles.dataDbURLFor(network), - endpoint: environment.endpoint, + endpoint: environment.endpoint(network), network: network, spendParamsURL: databaseFiles.spendParamsURLFor(network), outputParamsURL: databaseFiles.outputParamsURLFor(network), @@ -46,7 +46,7 @@ extension SDKSynchronizerClient: DependencyKey { start: { retry in try await synchronizer.start(retry: retry) }, stop: { synchronizer.stop() }, isSyncing: { synchronizer.latestState.syncStatus.isSyncing }, - isInitialized: { synchronizer.latestState.syncStatus != .unprepared }, + isInitialized: { synchronizer.latestState.syncStatus != SyncStatus.unprepared }, rewind: { synchronizer.rewind($0) }, getShieldedBalance: { synchronizer.latestState.shieldedBalance }, getTransparentBalance: { synchronizer.latestState.transparentBalance }, diff --git a/secant/Dependencies/SDKSynchronizer/SDKSynchronizerTest.swift b/modules/Sources/SDKSynchronizerClient/SDKSynchronizerTest.swift similarity index 96% rename from secant/Dependencies/SDKSynchronizer/SDKSynchronizerTest.swift rename to modules/Sources/SDKSynchronizerClient/SDKSynchronizerTest.swift index 6155c79..b5ee0a1 100644 --- a/secant/Dependencies/SDKSynchronizer/SDKSynchronizerTest.swift +++ b/modules/Sources/SDKSynchronizerClient/SDKSynchronizerTest.swift @@ -9,9 +9,11 @@ import Combine import ComposableArchitecture import Foundation import ZcashLightClientKit +import Models +import Utils extension SDKSynchronizerClient: TestDependencyKey { - static let testValue = Self( + public static let testValue = Self( stateStream: XCTUnimplemented("\(Self.self).stateStream", placeholder: Empty().eraseToAnyPublisher()), eventStream: XCTUnimplemented("\(Self.self).eventStream", placeholder: Empty().eraseToAnyPublisher()), latestState: XCTUnimplemented("\(Self.self).latestState", placeholder: .zero), @@ -28,14 +30,14 @@ extension SDKSynchronizerClient: TestDependencyKey { getUnifiedAddress: XCTUnimplemented("\(Self.self).getUnifiedAddress", placeholder: nil), getTransparentAddress: XCTUnimplemented("\(Self.self).getTransparentAddress", placeholder: nil), getSaplingAddress: XCTUnimplemented("\(Self.self).getSaplingAddress", placeholder: nil), - sendTransaction: XCTUnimplemented("\(Self.self).sendTransaction", placeholder: .placeholder), - shieldFunds: XCTUnimplemented("\(Self.self).shieldFunds", placeholder: .placeholder), + sendTransaction: XCTUnimplemented("\(Self.self).sendTransaction", placeholder: .placeholder()), + shieldFunds: XCTUnimplemented("\(Self.self).shieldFunds", placeholder: .placeholder()), wipe: XCTUnimplemented("\(Self.self).wipe") ) } extension SDKSynchronizerClient { - static let noOp = Self( + public static let noOp = Self( stateStream: { Empty().eraseToAnyPublisher() }, eventStream: { Empty().eraseToAnyPublisher() }, latestState: { .zero }, @@ -52,16 +54,16 @@ extension SDKSynchronizerClient { getUnifiedAddress: { _ in return nil }, getTransparentAddress: { _ in return nil }, getSaplingAddress: { _ in return nil }, - sendTransaction: { _, _, _, _ in return .placeholder }, - shieldFunds: { _, _, _ in return .placeholder }, + sendTransaction: { _, _, _, _ in return .placeholder() }, + shieldFunds: { _, _, _ in return .placeholder() }, wipe: { Empty().eraseToAnyPublisher() } ) - static let mock = Self.mocked() + public static let mock = Self.mocked() } extension SDKSynchronizerClient { - static func mocked( + public static func mocked( stateStream: @escaping () -> AnyPublisher = { Just(.zero).eraseToAnyPublisher() }, eventStream: @escaping () -> AnyPublisher = { Empty().eraseToAnyPublisher() }, latestState: @escaping () -> SynchronizerState = { .zero }, diff --git a/modules/Sources/SecItem/SecItemInterface.swift b/modules/Sources/SecItem/SecItemInterface.swift new file mode 100644 index 0000000..1054073 --- /dev/null +++ b/modules/Sources/SecItem/SecItemInterface.swift @@ -0,0 +1,28 @@ +// +// SecItemClient.swift +// secant-testnet +// +// Created by Lukáš Korba on 12.04.2022. +// + +import Foundation +import Security + +public struct SecItemClient { + public let copyMatching: (CFDictionary, inout CFTypeRef?) -> OSStatus + public let add: (CFDictionary, inout CFTypeRef?) -> OSStatus + public let update: (CFDictionary, CFDictionary) -> OSStatus + public let delete: (CFDictionary) -> OSStatus + + public init( + copyMatching: @escaping (CFDictionary, inout CFTypeRef?) -> OSStatus, + add: @escaping (CFDictionary, inout CFTypeRef?) -> OSStatus, + update: @escaping (CFDictionary, CFDictionary) -> OSStatus, + delete: @escaping (CFDictionary) -> OSStatus + ) { + self.copyMatching = copyMatching + self.add = add + self.update = update + self.delete = delete + } +} diff --git a/secant/Dependencies/SecItem/SecItemLive.swift b/modules/Sources/SecItem/SecItemLive.swift similarity index 92% rename from secant/Dependencies/SecItem/SecItemLive.swift rename to modules/Sources/SecItem/SecItemLive.swift index 618a5db..eb6ac81 100644 --- a/secant/Dependencies/SecItem/SecItemLive.swift +++ b/modules/Sources/SecItem/SecItemLive.swift @@ -9,7 +9,7 @@ import Foundation import Security extension SecItemClient { - static let live = SecItemClient( + public static let live = SecItemClient( copyMatching: { query, result in SecItemCopyMatching(query, &result) }, diff --git a/secant/Dependencies/SupportDataGenerator/SupportDataGenerator.swift b/modules/Sources/SupportDataGeneratorClient/SupportDataGenerator.swift similarity index 96% rename from secant/Dependencies/SupportDataGenerator/SupportDataGenerator.swift rename to modules/Sources/SupportDataGeneratorClient/SupportDataGenerator.swift index 4959a47..f61401a 100644 --- a/secant/Dependencies/SupportDataGenerator/SupportDataGenerator.swift +++ b/modules/Sources/SupportDataGeneratorClient/SupportDataGenerator.swift @@ -9,15 +9,17 @@ import AVFoundation import Foundation import LocalAuthentication import UIKit +import Generated +import Utils -struct SupportData: Equatable { - let toAddress: String - let subject: String - let message: String +public struct SupportData: Equatable { + public let toAddress: String + public let subject: String + public let message: String } -enum SupportDataGenerator { - static func generate() -> SupportData { +public enum SupportDataGenerator { + public static func generate() -> SupportData { let items: [SupportDataGeneratorItem] = [ TimeItem(), AppVersionItem(), diff --git a/secant/Dependencies/SupportDataGenerator/SupportDataGeneratorInterface.swift b/modules/Sources/SupportDataGeneratorClient/SupportDataGeneratorInterface.swift similarity index 65% rename from secant/Dependencies/SupportDataGenerator/SupportDataGeneratorInterface.swift rename to modules/Sources/SupportDataGeneratorClient/SupportDataGeneratorInterface.swift index 1c2f37b..eeb3837 100644 --- a/secant/Dependencies/SupportDataGenerator/SupportDataGeneratorInterface.swift +++ b/modules/Sources/SupportDataGeneratorClient/SupportDataGeneratorInterface.swift @@ -8,12 +8,12 @@ import ComposableArchitecture extension DependencyValues { - var supportDataGenerator: SupportDataGeneratorClient { + public var supportDataGenerator: SupportDataGeneratorClient { get { self[SupportDataGeneratorClient.self] } set { self[SupportDataGeneratorClient.self] = newValue } } } -struct SupportDataGeneratorClient { - let generate: () -> SupportData +public struct SupportDataGeneratorClient { + public let generate: () -> SupportData } diff --git a/secant/Dependencies/SupportDataGenerator/SupportDataGeneratorLiveKey.swift b/modules/Sources/SupportDataGeneratorClient/SupportDataGeneratorLiveKey.swift similarity index 86% rename from secant/Dependencies/SupportDataGenerator/SupportDataGeneratorLiveKey.swift rename to modules/Sources/SupportDataGeneratorClient/SupportDataGeneratorLiveKey.swift index d6551d6..80d2cde 100644 --- a/secant/Dependencies/SupportDataGenerator/SupportDataGeneratorLiveKey.swift +++ b/modules/Sources/SupportDataGeneratorClient/SupportDataGeneratorLiveKey.swift @@ -8,7 +8,7 @@ import ComposableArchitecture extension SupportDataGeneratorClient: DependencyKey { - static let liveValue = Self( + public static let liveValue = Self( generate: { SupportDataGenerator.generate() } ) } diff --git a/secant/Dependencies/SupportDataGenerator/SupportDataGeneratorTestKey.swift b/modules/Sources/SupportDataGeneratorClient/SupportDataGeneratorTestKey.swift similarity index 84% rename from secant/Dependencies/SupportDataGenerator/SupportDataGeneratorTestKey.swift rename to modules/Sources/SupportDataGeneratorClient/SupportDataGeneratorTestKey.swift index e096e9e..8f1318a 100644 --- a/secant/Dependencies/SupportDataGenerator/SupportDataGeneratorTestKey.swift +++ b/modules/Sources/SupportDataGeneratorClient/SupportDataGeneratorTestKey.swift @@ -9,13 +9,13 @@ import ComposableArchitecture import XCTestDynamicOverlay extension SupportDataGeneratorClient: TestDependencyKey { - static let testValue = Self( + public static let testValue = Self( generate: XCTUnimplemented("\(Self.self).generate") ) } extension SupportDataGeneratorClient { - static let noOp = Self( + public static let noOp = Self( generate: { SupportData(toAddress: "", subject: "", message: "") } ) } diff --git a/secant/UI Components/Backgrounds/ScreenBackground.swift b/modules/Sources/UIComponents/Backgrounds/ScreenBackground.swift similarity index 84% rename from secant/UI Components/Backgrounds/ScreenBackground.swift rename to modules/Sources/UIComponents/Backgrounds/ScreenBackground.swift index be97051..87292d4 100644 --- a/secant/UI Components/Backgrounds/ScreenBackground.swift +++ b/modules/Sources/UIComponents/Backgrounds/ScreenBackground.swift @@ -6,16 +6,17 @@ // import SwiftUI +import Generated /// A Vertical LinearGradient that takes an array of Colors and renders them vertically /// in a centered fashion mostly used as a background for Screen views.. -struct ScreenBackground: View { +public struct ScreenBackground: View { @Environment(\.colorScheme) var colorScheme var colors: [Color] var darkGradientEndPointY = 1.0 - var body: some View { + public var body: some View { LinearGradient( colors: colors, startPoint: UnitPoint(x: 0.5, y: 0), @@ -25,7 +26,7 @@ struct ScreenBackground: View { } extension ScreenBackground { - static let `default` = ScreenBackground( + public static let `default` = ScreenBackground( colors: [ Asset.Colors.ScreenBackground.gradientStart.color, Asset.Colors.ScreenBackground.gradientEnd.color @@ -33,11 +34,11 @@ extension ScreenBackground { ) } -struct ScreenBackgroundModifier: ViewModifier { +public struct ScreenBackgroundModifier: ViewModifier { var colors: [Color] var darkGradientEndPointY = 1.0 - func body(content: Content) -> some View { + public func body(content: Content) -> some View { ZStack { ScreenBackground( colors: colors, @@ -53,7 +54,7 @@ struct ScreenBackgroundModifier: ViewModifier { extension View { /// Adds a Vertical Linear Gradient with the default Colors of VLinearGradient. /// Supports both Light and Dark Mode - func applyScreenBackground() -> some View { + public func applyScreenBackground() -> some View { self.modifier( ScreenBackgroundModifier( colors: [ @@ -64,7 +65,7 @@ extension View { ) } - func applyErredScreenBackground() -> some View { + public func applyErredScreenBackground() -> some View { self.modifier( ScreenBackgroundModifier( colors: [ @@ -76,7 +77,7 @@ extension View { ) } - func applySucceededScreenBackground() -> some View { + public func applySucceededScreenBackground() -> some View { self.modifier( ScreenBackgroundModifier( colors: [ @@ -88,7 +89,7 @@ extension View { ) } - func applySemiTransparentScreenBackground() -> some View { + public func applySemiTransparentScreenBackground() -> some View { self.modifier( ScreenBackgroundModifier( colors: [ @@ -99,7 +100,7 @@ extension View { ) } - func applyDarkScreenBackground() -> some View { + public func applyDarkScreenBackground() -> some View { self.modifier( ScreenBackgroundModifier( colors: [ @@ -110,7 +111,7 @@ extension View { ) } - func applyAmberScreenBackground() -> some View { + public func applyAmberScreenBackground() -> some View { self.modifier( ScreenBackgroundModifier( colors: [ diff --git a/secant/UI Components/Buttons/ActiveButton.swift b/modules/Sources/UIComponents/Buttons/ActiveButton.swift similarity index 93% rename from secant/UI Components/Buttons/ActiveButton.swift rename to modules/Sources/UIComponents/Buttons/ActiveButton.swift index 80f0bff..93f921f 100644 --- a/secant/UI Components/Buttons/ActiveButton.swift +++ b/modules/Sources/UIComponents/Buttons/ActiveButton.swift @@ -6,9 +6,10 @@ // import SwiftUI +import Generated extension Button { - var activeButtonStyle: some View { + public var activeButtonStyle: some View { buttonStyle( StandardButtonStyle( foregroundColor: Asset.Colors.Text.activeButtonText.color, diff --git a/secant/UI Components/Buttons/StandardButtonStyle.swift b/modules/Sources/UIComponents/Buttons/StandardButtonStyle.swift similarity index 74% rename from secant/UI Components/Buttons/StandardButtonStyle.swift rename to modules/Sources/UIComponents/Buttons/StandardButtonStyle.swift index 9f8eaca..096ba72 100644 --- a/secant/UI Components/Buttons/StandardButtonStyle.swift +++ b/modules/Sources/UIComponents/Buttons/StandardButtonStyle.swift @@ -6,8 +6,9 @@ // import SwiftUI +import Generated -struct StandardButtonStyle: ButtonStyle { +public struct StandardButtonStyle: ButtonStyle { @Environment(\.isEnabled) private var isEnabled: Bool let foregroundColor: Color @@ -15,7 +16,19 @@ struct StandardButtonStyle: ButtonStyle { let pressedBackgroundColor: Color let disabledBackgroundColor: Color - func makeBody(configuration: Configuration) -> some View { + public init( + foregroundColor: Color, + background: Color, + pressedBackgroundColor: Color, + disabledBackgroundColor: Color + ) { + self.foregroundColor = foregroundColor + self.background = background + self.pressedBackgroundColor = pressedBackgroundColor + self.disabledBackgroundColor = disabledBackgroundColor + } + + public func makeBody(configuration: Configuration) -> some View { configuration.label .frame( minWidth: 0, diff --git a/secant/UI Components/Chips/ColoredChip.swift b/modules/Sources/UIComponents/Chips/ColoredChip.swift similarity index 62% rename from secant/UI Components/Chips/ColoredChip.swift rename to modules/Sources/UIComponents/Chips/ColoredChip.swift index 46a997a..041fb2f 100644 --- a/secant/UI Components/Chips/ColoredChip.swift +++ b/modules/Sources/UIComponents/Chips/ColoredChip.swift @@ -7,11 +7,17 @@ import SwiftUI import Utils +import Generated -struct ColoredChip: View { - var word: RedactableString - var color = Asset.Colors.Buttons.activeButton.color - var body: some View { +public struct ColoredChip: View { + let word: RedactableString + let color: Color = Asset.Colors.Buttons.activeButton.color + + public init(word: RedactableString, color: Color = Asset.Colors.Buttons.activeButton.color) { + self.word = word + } + + public var body: some View { Text(word.data) .font(.custom(FontFamily.Rubik.regular.name, size: 15)) .frame( @@ -31,8 +37,10 @@ struct ColoredChip: View { struct ColoredChip_Previews: PreviewProvider { static var previews: some View { - ColoredChip(word: "negative".redacted) - .frame(width: 115) - .applyScreenBackground() + ColoredChip( + word: "negative".redacted + ) + .frame(width: 115) + .applyScreenBackground() } } diff --git a/secant/UI Components/Chips/EmptyChip.swift b/modules/Sources/UIComponents/Chips/EmptyChip.swift similarity index 94% rename from secant/UI Components/Chips/EmptyChip.swift rename to modules/Sources/UIComponents/Chips/EmptyChip.swift index f9af4eb..207397d 100644 --- a/secant/UI Components/Chips/EmptyChip.swift +++ b/modules/Sources/UIComponents/Chips/EmptyChip.swift @@ -6,11 +6,14 @@ // import SwiftUI +import Generated -struct EmptyChip: View { +public struct EmptyChip: View { @Environment(\.colorScheme) var colorScheme - - var body: some View { + + public init() {} + + public var body: some View { RoundedRectangle(cornerRadius: 6, style: RoundedCornerStyle.continuous) .stroke(Asset.Colors.Text.activeButtonText.color, lineWidth: 0.5) .shadow( @@ -50,7 +53,6 @@ struct EmptyChip_Previews: PreviewProvider { static var previews: some View { Group { ZStack { - Asset.Colors.BackgroundColors.phraseGridDarkGray.color EmptyChip() .frame(width: 100, height: 40, alignment: .leading) } diff --git a/secant/UI Components/Chips/EnumeratedChip.swift b/modules/Sources/UIComponents/Chips/EnumeratedChip.swift similarity index 92% rename from secant/UI Components/Chips/EnumeratedChip.swift rename to modules/Sources/UIComponents/Chips/EnumeratedChip.swift index 4189815..6b36229 100644 --- a/secant/UI Components/Chips/EnumeratedChip.swift +++ b/modules/Sources/UIComponents/Chips/EnumeratedChip.swift @@ -7,8 +7,9 @@ import SwiftUI import Utils +import Generated -struct EnumeratedChip: View { +public struct EnumeratedChip: View { let basePadding: CGFloat = 14 @Clamped(1...24) @@ -17,7 +18,12 @@ struct EnumeratedChip: View { var text: RedactableString var overlayPadding: CGFloat = 20 - var body: some View { + public init(index: Int, text: RedactableString) { + self.index = index + self.text = text + } + + public var body: some View { Text(text.data) .foregroundColor(Asset.Colors.Text.button.color) .font(.custom(FontFamily.Rubik.regular.name, size: 14)) @@ -64,7 +70,6 @@ struct EnumeratedChip_Previews: PreviewProvider { static var previews: some View { grid - .background(Asset.Colors.BackgroundColors.phraseGridDarkGray.color) .previewLayout(.fixed(width: 428, height: 200)) grid diff --git a/secant/UI Components/Chips/PhraseChip.swift b/modules/Sources/UIComponents/Chips/PhraseChip.swift similarity index 85% rename from secant/UI Components/Chips/PhraseChip.swift rename to modules/Sources/UIComponents/Chips/PhraseChip.swift index 395251f..3858e42 100644 --- a/secant/UI Components/Chips/PhraseChip.swift +++ b/modules/Sources/UIComponents/Chips/PhraseChip.swift @@ -7,9 +7,10 @@ import SwiftUI import Utils +import Generated -struct PhraseChip: View { - enum Kind: Hashable { +public struct PhraseChip: View { + public enum Kind: Hashable { case empty case unassigned(word: RedactableString, color: Color = Asset.Colors.Buttons.activeButton.color) case ordered(position: Int, word: RedactableString) @@ -17,7 +18,11 @@ struct PhraseChip: View { var kind: Kind - var body: some View { + public init(kind: Kind) { + self.kind = kind + } + + public var body: some View { switch kind { case .empty: EmptyChip() diff --git a/secant/Utils/View+WhenDraggable.swift b/modules/Sources/UIComponents/Chips/View+WhenDraggable.swift similarity index 73% rename from secant/Utils/View+WhenDraggable.swift rename to modules/Sources/UIComponents/Chips/View+WhenDraggable.swift index 7668e65..db139b6 100644 --- a/secant/Utils/View+WhenDraggable.swift +++ b/modules/Sources/UIComponents/Chips/View+WhenDraggable.swift @@ -10,10 +10,10 @@ import SwiftUI import ComposableArchitecture extension PhraseChip { - static let validationWordTypeIdentifier = "public.text" + public static let validationWordTypeIdentifier = "public.text" /// Makes a PhraseChip draggable when it is of kind .unassigned - @ViewBuilder func makeDraggable() -> some View { + @ViewBuilder public func makeDraggable() -> some View { switch self.kind { case let .unassigned(word, _): self.onDrag { @@ -27,16 +27,16 @@ extension PhraseChip { extension View { /// Makes a View accept drop types Self.validationWordTypeIdentifier when it is of kind .empty - func whenIsDroppable(_ isDroppable: Bool, dropDelegate: DropDelegate) -> some View { + public func whenIsDroppable(_ isDroppable: Bool, dropDelegate: DropDelegate) -> some View { self.modifier(MakeDroppableModifier(isDroppable: isDroppable, drop: dropDelegate)) } } -struct MakeDroppableModifier: ViewModifier { +public struct MakeDroppableModifier: ViewModifier { var isDroppable: Bool var drop: DropDelegate - func body(content: Content) -> some View { + public func body(content: Content) -> some View { if isDroppable { content.onDrop(of: [PhraseChip.validationWordTypeIdentifier], delegate: drop) } else { diff --git a/secant/UI Components/Chips/WordChipGrid.swift b/modules/Sources/UIComponents/Chips/WordChipGrid.swift similarity index 85% rename from secant/UI Components/Chips/WordChipGrid.swift rename to modules/Sources/UIComponents/Chips/WordChipGrid.swift index 71287e7..cce9302 100644 --- a/secant/UI Components/Chips/WordChipGrid.swift +++ b/modules/Sources/UIComponents/Chips/WordChipGrid.swift @@ -9,7 +9,7 @@ import SwiftUI import Utils /// A 3x(N/3) grid of numbered or empty chips. -struct WordChipGrid: View { +public struct WordChipGrid: View { static let spacing: CGFloat = 10 var chips: [PhraseChip.Kind] var coloredChipColor: Color @@ -22,7 +22,7 @@ struct WordChipGrid: View { count: 3 ) - var body: some View { + public var body: some View { LazyVGrid(columns: threeColumnGrid, alignment: .center, spacing: 10) { ForEach(chips, id: \.self) { item in PhraseChip(kind: item) @@ -30,12 +30,12 @@ struct WordChipGrid: View { } } - init(chips: [PhraseChip.Kind], coloredChipColor: Color) { + public init(chips: [PhraseChip.Kind], coloredChipColor: Color) { self.chips = chips self.coloredChipColor = coloredChipColor } - init(words: [RedactableString], startingAt index: Int, coloredChipColor: Color = .clear) { + public init(words: [RedactableString], startingAt index: Int, coloredChipColor: Color = .clear) { let chips = zip(words, index..( + public func innerShadow( using shape: S, angle: Angle = .degrees(0), color: Color = .black, diff --git a/secant/UI Components/FontStyles/SecantButtonStyles.swift b/modules/Sources/UIComponents/FontStyles/SecantButtonStyles.swift similarity index 90% rename from secant/UI Components/FontStyles/SecantButtonStyles.swift rename to modules/Sources/UIComponents/FontStyles/SecantButtonStyles.swift index a2f893f..e066ea8 100644 --- a/secant/UI Components/FontStyles/SecantButtonStyles.swift +++ b/modules/Sources/UIComponents/FontStyles/SecantButtonStyles.swift @@ -6,9 +6,10 @@ // import SwiftUI +import Generated extension Button { - func titleText() -> some View { + public func titleText() -> some View { self.modifier(TitleTextStyle()) } diff --git a/secant/UI Components/FontStyles/SecantTextStyles.swift b/modules/Sources/UIComponents/FontStyles/SecantTextStyles.swift similarity index 90% rename from secant/UI Components/FontStyles/SecantTextStyles.swift rename to modules/Sources/UIComponents/FontStyles/SecantTextStyles.swift index 6368c2c..686eca8 100644 --- a/secant/UI Components/FontStyles/SecantTextStyles.swift +++ b/modules/Sources/UIComponents/FontStyles/SecantTextStyles.swift @@ -7,21 +7,22 @@ import Foundation import SwiftUI +import Generated extension Text { - func captionText() -> some View { + public func captionText() -> some View { self.modifier(CaptionTextStyle()) } - func bodyText() -> some View { + public func bodyText() -> some View { self.modifier(BodyTextStyle()) } - func titleText() -> some View { + public func titleText() -> some View { self.modifier(TitleTextStyle()) } - func paragraphText() -> some View { + public func paragraphText() -> some View { self.modifier(ParagraphStyle()) } diff --git a/secant/Dependencies/UserDefaults/UserDefaultsInterface.swift b/modules/Sources/UserDefaultsClient/UserDefaultsInterface.swift similarity index 58% rename from secant/Dependencies/UserDefaults/UserDefaultsInterface.swift rename to modules/Sources/UserDefaultsClient/UserDefaultsInterface.swift index f281dd5..87a04ac 100644 --- a/secant/Dependencies/UserDefaults/UserDefaultsInterface.swift +++ b/modules/Sources/UserDefaultsClient/UserDefaultsInterface.swift @@ -14,15 +14,20 @@ import ComposableArchitecture extension UserDefaults: @unchecked Sendable { } extension DependencyValues { - var userDefaults: UserDefaultsClient { + public var userDefaults: UserDefaultsClient { get { self[UserDefaultsClient.self] } set { self[UserDefaultsClient.self] = newValue } } } -struct UserDefaultsClient { - let objectForKey: @Sendable (String) -> Any? - let remove: @Sendable (String) async -> Void - let setValue: @Sendable (Any?, String) async -> Void - let synchronize: @Sendable () async -> Bool +public struct UserDefaultsClient { + public let objectForKey: (String) -> Any? + public let remove: (String) -> Void + public let setValue: (Any?, String) -> Void + + public init(objectForKey: @escaping (String) -> Any?, remove: @escaping (String) -> Void, setValue: @escaping (Any?, String) -> Void) { + self.objectForKey = objectForKey + self.remove = remove + self.setValue = setValue + } } diff --git a/secant/Dependencies/UserDefaults/UserDefaultsLiveKey.swift b/modules/Sources/UserDefaultsClient/UserDefaultsLiveKey.swift similarity index 60% rename from secant/Dependencies/UserDefaults/UserDefaultsLiveKey.swift rename to modules/Sources/UserDefaultsClient/UserDefaultsLiveKey.swift index f411d61..e995606 100644 --- a/secant/Dependencies/UserDefaults/UserDefaultsLiveKey.swift +++ b/modules/Sources/UserDefaultsClient/UserDefaultsLiveKey.swift @@ -9,14 +9,13 @@ import Foundation import ComposableArchitecture extension UserDefaultsClient: DependencyKey { - static let liveValue = UserDefaultsClient.live() + public static let liveValue = UserDefaultsClient.live() - static func live(userDefaults: UserDefaults = .standard) -> Self { + public static func live(userDefaults: UserDefaults = .standard) -> Self { Self( objectForKey: { userDefaults.object(forKey: $0) }, remove: { userDefaults.removeObject(forKey: $0) }, - setValue: { userDefaults.set($0, forKey: $1) }, - synchronize: { userDefaults.synchronize() } + setValue: { userDefaults.set($0, forKey: $1) } ) } } diff --git a/secant/Dependencies/UserDefaults/UserDefaultsTestKey.swift b/modules/Sources/UserDefaultsClient/UserDefaultsTestKey.swift similarity index 63% rename from secant/Dependencies/UserDefaults/UserDefaultsTestKey.swift rename to modules/Sources/UserDefaultsClient/UserDefaultsTestKey.swift index f1a4466..f0ecec8 100644 --- a/secant/Dependencies/UserDefaults/UserDefaultsTestKey.swift +++ b/modules/Sources/UserDefaultsClient/UserDefaultsTestKey.swift @@ -9,19 +9,17 @@ import ComposableArchitecture import XCTestDynamicOverlay extension UserDefaultsClient: TestDependencyKey { - static let testValue = Self( + public static let testValue = Self( objectForKey: XCTUnimplemented("\(Self.self).objectForKey", placeholder: nil), remove: XCTUnimplemented("\(Self.self).remove"), - setValue: XCTUnimplemented("\(Self.self).setValue"), - synchronize: XCTUnimplemented("\(Self.self).synchronize", placeholder: false) + setValue: XCTUnimplemented("\(Self.self).setValue") ) } extension UserDefaultsClient { - static let noOp = Self( + public static let noOp = Self( objectForKey: { _ in nil }, remove: { _ in }, - setValue: { _, _ in }, - synchronize: { false } + setValue: { _, _ in } ) } diff --git a/secant/Utils/Array+Chunked.swift b/modules/Sources/Utils/Array+Chunked.swift similarity index 82% rename from secant/Utils/Array+Chunked.swift rename to modules/Sources/Utils/Array+Chunked.swift index 5a691bb..54974f3 100644 --- a/secant/Utils/Array+Chunked.swift +++ b/modules/Sources/Utils/Array+Chunked.swift @@ -8,7 +8,7 @@ import Foundation extension Array { - func chunked(into size: Int) -> [[Element]] { + public func chunked(into size: Int) -> [[Element]] { return stride(from: 0, to: count, by: size).map { Array(self[$0 ..< Swift.min($0 + size, count)]) } diff --git a/secant/Utils/Clamped.swift b/modules/Sources/Utils/Clamped.swift similarity index 82% rename from secant/Utils/Clamped.swift rename to modules/Sources/Utils/Clamped.swift index 52331ed..9deed0b 100644 --- a/secant/Utils/Clamped.swift +++ b/modules/Sources/Utils/Clamped.swift @@ -11,15 +11,15 @@ import Foundation Limits a value to an enclosing range */ @propertyWrapper -struct Clamped { +public struct Clamped { var value: Value let range: ClosedRange - var wrappedValue: Value { + public var wrappedValue: Value { get { value } set { value = clamp(newValue, using: range) } } - init(wrappedValue: Value, _ range: ClosedRange) { + public init(wrappedValue: Value, _ range: ClosedRange) { self.value = wrappedValue self.range = range diff --git a/secant/Utils/NavigationLinks.swift b/modules/Sources/Utils/NavigationLinks.swift similarity index 85% rename from secant/Utils/NavigationLinks.swift rename to modules/Sources/Utils/NavigationLinks.swift index 95b0216..f6a3e10 100644 --- a/secant/Utils/NavigationLinks.swift +++ b/modules/Sources/Utils/NavigationLinks.swift @@ -1,7 +1,7 @@ import SwiftUI extension View { - func navigationLink( + public func navigationLink( isActive: Binding, destination: @escaping () -> Destination ) -> some View { @@ -12,7 +12,7 @@ extension View { ) } - func navigationLinkEmpty( + public func navigationLinkEmpty( isActive: Binding, destination: @escaping () -> Destination ) -> some View { diff --git a/secant/Utils/ScrollableWhenScaled.swift b/modules/Sources/Utils/ScrollableWhenScaled.swift similarity index 91% rename from secant/Utils/ScrollableWhenScaled.swift rename to modules/Sources/Utils/ScrollableWhenScaled.swift index ae62a51..ee9dc08 100644 --- a/secant/Utils/ScrollableWhenScaled.swift +++ b/modules/Sources/Utils/ScrollableWhenScaled.swift @@ -23,7 +23,7 @@ fileprivate struct ScrollableWhenScaledUpModifier: ViewModifier { } extension View { - func scrollableWhenScaledUp() -> some View { + public func scrollableWhenScaledUp() -> some View { self.modifier(ScrollableWhenScaledUpModifier()) } } diff --git a/modules/Sources/Utils/WalletLogger.swift b/modules/Sources/Utils/WalletLogger.swift new file mode 100644 index 0000000..f8b32ad --- /dev/null +++ b/modules/Sources/Utils/WalletLogger.swift @@ -0,0 +1,40 @@ +// +// WalletLogger.swift +// secant-testnet +// +// Created by Lukáš Korba on 23.01.2023. +// + +import Foundation +import ZcashLightClientKit +import os + +public enum LoggerConstants { + public static let sdkLogs = "sdkLogs" + public static let tcaLogs = "tcaLogs" + public static let walletLogs = "walletLogs" +} + +public var walletLogger: ZcashLightClientKit.Logger? + +public enum LoggerProxy { + public static func debug(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { + walletLogger?.debug(message, file: file, function: function, line: line) + } + + public static func info(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { + walletLogger?.info(message, file: file, function: function, line: line) + } + + public static func event(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { + walletLogger?.event(message, file: file, function: function, line: line) + } + + public static func warn(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { + walletLogger?.warn(message, file: file, function: function, line: line) + } + + public static func error(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { + walletLogger?.error(message, file: file, function: function, line: line) + } +} diff --git a/secant/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentInterface.swift b/modules/Sources/ZcashSDKEnvironment/ZcashSDKEnvironmentInterface.swift similarity index 59% rename from secant/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentInterface.swift rename to modules/Sources/ZcashSDKEnvironment/ZcashSDKEnvironmentInterface.swift index 5a4097e..d00dc57 100644 --- a/secant/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentInterface.swift +++ b/modules/Sources/ZcashSDKEnvironment/ZcashSDKEnvironmentInterface.swift @@ -9,14 +9,14 @@ import ComposableArchitecture import ZcashLightClientKit extension DependencyValues { - var zcashSDKEnvironment: ZcashSDKEnvironment { + public var zcashSDKEnvironment: ZcashSDKEnvironment { get { self[ZcashSDKEnvironment.self] } set { self[ZcashSDKEnvironment.self] = newValue } } } extension ZcashSDKEnvironment { - enum ZcashSDKConstants { + public enum ZcashSDKConstants { static let endpointMainnetAddress = "lightwalletd.electriccoin.co" static let endpointTestnetAddress = "lightwalletd.testnet.electriccoin.co" static let endpointPort = 9067 @@ -25,7 +25,7 @@ extension ZcashSDKEnvironment { static let streamingCallTimeoutInMillis = Int64(10 * 60 * 60 * 1000) // ten hours } - static func endpoint(for network: ZcashNetwork) -> String { + public static func endpoint(for network: ZcashNetwork) -> String { switch network.networkType { case .testnet: return ZcashSDKConstants.endpointTestnetAddress @@ -35,13 +35,13 @@ extension ZcashSDKEnvironment { } } -struct ZcashSDKEnvironment { - var latestCheckpoint: BlockHeight { BlockHeight.ofLatestCheckpoint(network: self.network) } - let endpoint: LightWalletEndpoint - var isMainnet: Bool { network.networkType == .mainnet } - let memoCharLimit: Int - let mnemonicWordsMaxCount: Int - let network: ZcashNetwork - let requiredTransactionConfirmations: Int - let sdkVersion: String +public struct ZcashSDKEnvironment { + public var latestCheckpoint: (ZcashNetwork) -> BlockHeight //{ BlockHeight.ofLatestCheckpoint(network: network()) } + public let endpoint: (ZcashNetwork) -> LightWalletEndpoint + //public var isMainnet: Bool { network().networkType == .mainnet } + public let memoCharLimit: Int + public let mnemonicWordsMaxCount: Int + //public let network: () -> ZcashNetwork + public let requiredTransactionConfirmations: Int + public let sdkVersion: String } diff --git a/modules/Sources/ZcashSDKEnvironment/ZcashSDKEnvironmentLiveKey.swift b/modules/Sources/ZcashSDKEnvironment/ZcashSDKEnvironmentLiveKey.swift new file mode 100644 index 0000000..2bcbac3 --- /dev/null +++ b/modules/Sources/ZcashSDKEnvironment/ZcashSDKEnvironmentLiveKey.swift @@ -0,0 +1,28 @@ +// +// ZcashSDKEnvironmentLiveKey.swift +// secant-testnet +// +// Created by Lukáš Korba on 13.11.2022. +// + +import ComposableArchitecture +import ZcashLightClientKit + +extension ZcashSDKEnvironment: DependencyKey { + public static let liveValue = Self( + latestCheckpoint: { network in BlockHeight.ofLatestCheckpoint(network: network) }, + endpoint: { network in + LightWalletEndpoint( + address: Self.endpoint(for: network), + port: ZcashSDKConstants.endpointPort, + secure: true, + streamingCallTimeoutInMillis: ZcashSDKConstants.streamingCallTimeoutInMillis + ) + }, + memoCharLimit: MemoBytes.capacity, + mnemonicWordsMaxCount: ZcashSDKConstants.mnemonicWordsMaxCount, + //network: { TargetConstants.zcashNetwork }, + requiredTransactionConfirmations: ZcashSDKConstants.requiredTransactionConfirmations, + sdkVersion: "0.18.1-beta" + ) +} diff --git a/modules/Sources/ZcashSDKEnvironment/ZcashSDKEnvironmentTestKey.swift b/modules/Sources/ZcashSDKEnvironment/ZcashSDKEnvironmentTestKey.swift new file mode 100644 index 0000000..c6452ec --- /dev/null +++ b/modules/Sources/ZcashSDKEnvironment/ZcashSDKEnvironmentTestKey.swift @@ -0,0 +1,31 @@ +// +// ZcashSDKEnvironmentTestKey.swift +// secant-testnet +// +// Created by Lukáš Korba on 13.11.2022. +// + +import ComposableArchitecture +import ZcashLightClientKit +import XCTestDynamicOverlay + +extension ZcashSDKEnvironment: TestDependencyKey { + public static let testnet = ZcashSDKEnvironment.liveValue + + public static let testValue = Self( + latestCheckpoint: { _ in 0 }, + endpoint: { _ in + LightWalletEndpoint( + address: ZcashSDKConstants.endpointTestnetAddress, + port: ZcashSDKConstants.endpointPort, + secure: true, + streamingCallTimeoutInMillis: ZcashSDKConstants.streamingCallTimeoutInMillis + ) + }, + memoCharLimit: MemoBytes.capacity, + mnemonicWordsMaxCount: ZcashSDKConstants.mnemonicWordsMaxCount, + //network: { ZcashNetworkBuilder.network(for: .testnet) }, + requiredTransactionConfirmations: ZcashSDKConstants.requiredTransactionConfirmations, + sdkVersion: "0.18.1-beta" + ) +} diff --git a/secant.xcodeproj/project.pbxproj b/secant.xcodeproj/project.pbxproj index fda6eaf..0c889ea 100644 --- a/secant.xcodeproj/project.pbxproj +++ b/secant.xcodeproj/project.pbxproj @@ -9,8 +9,6 @@ /* Begin PBXBuildFile section */ 0D0781C4278750E30083ACD7 /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D0781C3278750E30083ACD7 /* WelcomeView.swift */; }; 0D0781C9278776D20083ACD7 /* ZcashSymbol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D0781C7278776D20083ACD7 /* ZcashSymbol.swift */; }; - 0D185819272723FF0046B928 /* ColoredChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D185818272723FF0046B928 /* ColoredChip.swift */; }; - 0D18581B272728D60046B928 /* PhraseChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D18581A272728D60046B928 /* PhraseChip.swift */; }; 0D26103A298C3DCD00CC9DE9 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = 0D261039298C3DCD00CC9DE9 /* FirebaseCrashlytics */; }; 0D26103C298C3E4800CC9DE9 /* CrashReporterInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D26103B298C3E4800CC9DE9 /* CrashReporterInterface.swift */; }; 0D26103E298C3FA600CC9DE9 /* CrashReporterLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D26103D298C3FA600CC9DE9 /* CrashReporterLiveKey.swift */; }; @@ -18,112 +16,73 @@ 0D26AE9B299E8196005260EE /* OnboardingFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E5C03802738C570008BFFD3 /* OnboardingFlowView.swift */; }; 0D26AE9C299E8196005260EE /* ZcashBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0DE282D2DD600C374E8 /* ZcashBadge.swift */; }; 0D26AE9D299E8196005260EE /* CrashReporterTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D26103F298C406F00CC9DE9 /* CrashReporterTestKey.swift */; }; - 0D26AE9F299E8196005260EE /* XCAssets+Generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 660558F6270C862F009D6954 /* XCAssets+Generated.swift */; }; 0D26AEA0299E8196005260EE /* SandboxStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8E2808183D00199FC9 /* SandboxStore.swift */; }; - 0D26AEA1299E8196005260EE /* RecoveryPhraseRandomizerInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863A629239DCB003D0F8B /* RecoveryPhraseRandomizerInterface.swift */; }; - 0D26AEA2299E8196005260EE /* ScrollableWhenScaled.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D35CC45277A36E00074316A /* ScrollableWhenScaled.swift */; }; 0D26AEA3299E8196005260EE /* UserPreferencesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911442848EEB90073DD9A /* UserPreferencesStorage.swift */; }; 0D26AEA5299E8196005260EE /* TransactionSendingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DA414628E4385800F8CC61 /* TransactionSendingView.swift */; }; 0D26AEA6299E8196005260EE /* WalletEventsFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E6273B501F0021B49A /* WalletEventsFlowView.swift */; }; 0D26AEAA299E8196005260EE /* CrashReporterLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D26103D298C3FA600CC9DE9 /* CrashReporterLiveKey.swift */; }; - 0D26AEAB299E8196005260EE /* RecoveryPhraseRandomizerLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863A529239DCB003D0F8B /* RecoveryPhraseRandomizerLiveKey.swift */; }; 0D26AEAC299E8196005260EE /* TCATextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDA079F27EDE18C00D6F09B /* TCATextField.swift */; }; 0D26AEAF299E8196005260EE /* TransactionAmountTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB7758627FC67FD00269373 /* TransactionAmountTextFieldStore.swift */; }; 0D26AEB1299E8196005260EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8135F27F043CC0075AF48 /* AppDelegate.swift */; }; 0D26AEB4299E8196005260EE /* Wedge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34E0AF1028DEE5220034CF37 /* Wedge.swift */; }; 0D26AEB5299E8196005260EE /* TransactionDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E5273B501F0021B49A /* TransactionDetailView.swift */; }; 0D26AEBA299E8196005260EE /* AddressDetailsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB61F2874143800A02233 /* AddressDetailsStore.swift */; }; - 0D26AEBB299E8196005260EE /* RecoveryPhraseBackupSucceededView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DC487C22772574C00BE6A63 /* RecoveryPhraseBackupSucceededView.swift */; }; 0D26AEBC299E8196005260EE /* TCATextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB1C5E727D77F6100BC43D7 /* TCATextFieldStore.swift */; }; - 0D26AEBE299E8196005260EE /* SecantTextStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D8A43C3272AEEDE005A6414 /* SecantTextStyles.swift */; }; 0D26AEBF299E8196005260EE /* TransactionFailedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF640281FD7B600BA3F17 /* TransactionFailedView.swift */; }; - 0D26AEC1299E8196005260EE /* Clamped.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DACFA7E27208CE00039EEA5 /* Clamped.swift */; }; 0D26AEC2299E8196005260EE /* TransactionRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAB46792861EA6A002904A0 /* TransactionRowView.swift */; }; 0D26AEC4299E8196005260EE /* TCALogging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0F5740297E7F1C005304FA /* TCALogging.swift */; }; - 0D26AEC5299E8196005260EE /* RecoveryPhraseValidationFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DFE93E2272CA1AA000FCCA5 /* RecoveryPhraseValidationFlowStore.swift */; }; 0D26AEC6299E8196005260EE /* ImportWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2DF99B27CF704D00649636 /* ImportWalletView.swift */; }; 0D26AEC7299E8196005260EE /* RootInitialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9ADA7C2938F4C00071767B /* RootInitialization.swift */; }; - 0D26AECA299E8196005260EE /* EnumeratedChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D535FE1271F9476009A9E3E /* EnumeratedChip.swift */; }; 0D26AECC299E8196005260EE /* OnboardingFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6654C73D2715A41300901167 /* OnboardingFlowStore.swift */; }; - 0D26AECD299E8196005260EE /* SDKSynchronizerLive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863CA2923CA20003D0F8B /* SDKSynchronizerLive.swift */; }; 0D26AECF299E8196005260EE /* CurrencySelectionStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E6CF8DC27D78319004DCD7A /* CurrencySelectionStore.swift */; }; - 0D26AED0299E8196005260EE /* UserDefaultsTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A7429216EFB00112F41 /* UserDefaultsTestKey.swift */; }; - 0D26AED1299E8196005260EE /* RecoveryPhraseValidationFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EBEF87927CE369800B4F343 /* RecoveryPhraseValidationFlowView.swift */; }; 0D26AED2299E8196005260EE /* BalanceBreakdownStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6713F6289BC58C00A6796F /* BalanceBreakdownStore.swift */; }; 0D26AED3299E8196005260EE /* SyncStatusSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E66122B2877188700C75B70 /* SyncStatusSnapshot.swift */; }; - 0D26AED4299E8196005260EE /* SecantButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4DC6E127C4C6B700E657F4 /* SecantButtonStyles.swift */; }; - 0D26AED5299E8196005260EE /* RecoveryPhraseBackupFailedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DDB6A5027737D4A0012A410 /* RecoveryPhraseBackupFailedView.swift */; }; 0D26AED6299E8196005260EE /* UserPreferencesStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D6316FF29919970007D873F /* UserPreferencesStorageInterface.swift */; }; - 0D26AED8299E8196005260EE /* DropDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D6D628A276A528D002FB4CC /* DropDelegate.swift */; }; 0D26AEDA299E8196005260EE /* ImportSeedEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2DF99A27CF704D00649636 /* ImportSeedEditor.swift */; }; 0D26AEDB299E8196005260EE /* ProfileStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A5027680DD000A2DB75 /* ProfileStore.swift */; }; 0D26AEDC299E8196005260EE /* CheckCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346D41E328DF0B8600963F36 /* CheckCircle.swift */; }; - 0D26AEDE299E8196005260EE /* RecoveryPhraseRandomizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911422848EEB90073DD9A /* RecoveryPhraseRandomizer.swift */; }; - 0D26AEE0299E8196005260EE /* SecItemLive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863BE2923C72C003D0F8B /* SecItemLive.swift */; }; 0D26AEE4299E8196005260EE /* CurrencySelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8719CC27FB0D3B0082C926 /* CurrencySelectionView.swift */; }; - 0D26AEE5299E8196005260EE /* RecoveryPhraseRandomizerTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863A429239DCB003D0F8B /* RecoveryPhraseRandomizerTestKey.swift */; }; 0D26AEE7299E8196005260EE /* TransactionAddressTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF64E2823E94900BA3F17 /* TransactionAddressTextFieldStore.swift */; }; 0D26AEE9299E8196005260EE /* WithStateBinding.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9EEB8152742C2210032EEB8 /* WithStateBinding.swift */; }; 0D26AEEB299E8196005260EE /* Previews.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93673D52742CB840099C6AF /* Previews.swift */; }; - 0D26AEED299E8196005260EE /* PhraseChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D18581A272728D60046B928 /* PhraseChip.swift */; }; 0D26AEEE299E8196005260EE /* QRCodeScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F82832824C00C374E8 /* QRCodeScanView.swift */; }; - 0D26AEEF299E8196005260EE /* ZcashSDKEnvironmentTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A6C292167FF00112F41 /* ZcashSDKEnvironmentTestKey.swift */; }; 0D26AEF0299E8196005260EE /* TCALoggerReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0F5742297EB96C005304FA /* TCALoggerReducer.swift */; }; 0D26AEF1299E8196005260EE /* ConditionalModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF482B92787ADA800EB37D6 /* ConditionalModifier.swift */; }; 0D26AEF2299E8196005260EE /* MultipleLineTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F2288AB6DD00DF7F17 /* MultipleLineTextField.swift */; }; 0D26AEF3299E8196005260EE /* NotEnoughFreeSpaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3448CB3128E47666006ADEDB /* NotEnoughFreeSpaceView.swift */; }; - 0D26AEF5299E8196005260EE /* TransactionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF63B2818305D00BA3F17 /* TransactionState.swift */; }; - 0D26AEF6299E8196005260EE /* SDKSynchronizerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863CC2923CA28003D0F8B /* SDKSynchronizerTest.swift */; }; 0D26AEF7299E8196005260EE /* Drawer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2F1C8E280EDE09004E65FE /* Drawer.swift */; }; - 0D26AEF9299E8196005260EE /* SDKSynchronizerInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB872806E5AE00199FC9 /* SDKSynchronizerInterface.swift */; }; 0D26AEFA299E8196005260EE /* DesignGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DB8AA80271DC7520035BC9D /* DesignGuide.swift */; }; 0D26AEFC299E8196005260EE /* RootStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A4A27680DC400A2DB75 /* RootStore.swift */; }; 0D26AEFD299E8196005260EE /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93874EF273C4DE200F0E875 /* HomeView.swift */; }; - 0D26AEFE299E8196005260EE /* NavigationLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9322DBF273B555C00C105B5 /* NavigationLinks.swift */; }; 0D26AEFF299E8196005260EE /* SandboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8D2808183D00199FC9 /* SandboxView.swift */; }; - 0D26AF00299E8196005260EE /* View+WhenDraggable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D7CE63327349B5D0020E050 /* View+WhenDraggable.swift */; }; 0D26AF01299E8196005260EE /* RecoveryPhraseDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3D04072728B3440032ABC1 /* RecoveryPhraseDisplayView.swift */; }; 0D26AF05299E8196005260EE /* ScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A5D27680DF600A2DB75 /* ScanView.swift */; }; 0D26AF07299E8196005260EE /* RootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A4C27680DC400A2DB75 /* RootView.swift */; }; - 0D26AF09299E8196005260EE /* UserDefaultsLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A7229216EFB00112F41 /* UserDefaultsLiveKey.swift */; }; 0D26AF0A299E8196005260EE /* OnboardingFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EA11F5A27467EF800709571 /* OnboardingFooterView.swift */; }; 0D26AF0E299E8196005260EE /* MultiLineTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F5288AC71A00DF7F17 /* MultiLineTextFieldStore.swift */; }; 0D26AF0F299E8196005260EE /* DebugFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDA07A327EDE2A900D6F09B /* DebugFrame.swift */; }; 0D26AF11299E8196005260EE /* LottieAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6612322878338C00C75B70 /* LottieAnimation.swift */; }; 0D26AF12299E8196005260EE /* UserPreferencesStorageMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863C82923C953003D0F8B /* UserPreferencesStorageMocks.swift */; }; 0D26AF13299E8196005260EE /* RecoveryPhraseDisplayStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3D04092728B3A10032ABC1 /* RecoveryPhraseDisplayStore.swift */; }; - 0D26AF15299E8196005260EE /* RecoveryPhrase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0D6282D286500C374E8 /* RecoveryPhrase.swift */; }; - 0D26AF17299E8196005260EE /* Fonts+Generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 660558F5270C862F009D6954 /* Fonts+Generated.swift */; }; 0D26AF18299E8196005260EE /* WalletEventsFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E3273B501F0021B49A /* WalletEventsFlowStore.swift */; }; 0D26AF19299E8196005260EE /* StoredWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0E5282E7B1100C374E8 /* StoredWallet.swift */; }; - 0D26AF1A299E8196005260EE /* UserDefaultsInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A7329216EFB00112F41 /* UserDefaultsInterface.swift */; }; 0D26AF1B299E8196005260EE /* HomeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93874ED273C4DE200F0E875 /* HomeStore.swift */; }; 0D26AF1E299E8196005260EE /* QRCodeGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB619287310EC00A02233 /* QRCodeGenerator.swift */; }; - 0D26AF1F299E8196005260EE /* Array+Chunked.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0D4282D281800C374E8 /* Array+Chunked.swift */; }; 0D26AF20299E8196005260EE /* UInt+SuperscriptText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DACFA8027208D940039EEA5 /* UInt+SuperscriptText.swift */; }; - 0D26AF21299E8196005260EE /* EmptyChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF2DC50272344E400FA31E2 /* EmptyChip.swift */; }; 0D26AF23299E8196005260EE /* SendFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165B72740403600592F76 /* SendFlowStore.swift */; }; 0D26AF24299E8196005260EE /* SecantApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0826B364170058B01E /* SecantApp.swift */; }; 0D26AF26299E8196005260EE /* WalletStorageLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863992923935B003D0F8B /* WalletStorageLiveKey.swift */; }; 0D26AF27299E8196005260EE /* WalletStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863982923935B003D0F8B /* WalletStorageInterface.swift */; }; - 0D26AF28299E8196005260EE /* StandardButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66DC733E271D88CC0053CBB6 /* StandardButtonStyle.swift */; }; - 0D26AF2A299E8196005260EE /* ActiveButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663FAB9B271D874D00E495F8 /* ActiveButton.swift */; }; 0D26AF2D299E8196005260EE /* DebugMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2F1C832809B606004E65FE /* DebugMenu.swift */; }; - 0D26AF32299E8196005260EE /* View+InnerShadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF2DC5327235E3E00FA31E2 /* View+InnerShadow.swift */; }; - 0D26AF33299E8196005260EE /* ZcashSDKEnvironmentInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A6D292167FF00112F41 /* ZcashSDKEnvironmentInterface.swift */; }; - 0D26AF34299E8196005260EE /* SecItemInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB83280597B700199FC9 /* SecItemInterface.swift */; }; 0D26AF37299E8196005260EE /* ScanUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F528327F6F00C374E8 /* ScanUIView.swift */; }; - 0D26AF39299E8196005260EE /* ColoredChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D185818272723FF0046B928 /* ColoredChip.swift */; }; 0D26AF3A299E8196005260EE /* OnboardingContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EA11F5C27467F7700709571 /* OnboardingContentView.swift */; }; 0D26AF3B299E8196005260EE /* CircularProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB6142869E8C300A02233 /* CircularProgress.swift */; }; 0D26AF3C299E8196005260EE /* OnboardingHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E58E73A274679F000B2B84B /* OnboardingHeaderView.swift */; }; 0D26AF3D299E8196005260EE /* TransactionAddressTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF64D2823E94900BA3F17 /* TransactionAddressTextField.swift */; }; 0D26AF3E299E8196005260EE /* SingleLineTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E35F99127B28E7600EB79CD /* SingleLineTextField.swift */; }; - 0D26AF3F299E8196005260EE /* WordChipGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D8A43C5272B129C005A6414 /* WordChipGrid.swift */; }; 0D26AF40299E8196005260EE /* RootDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9ADA7E2938F5EC0071767B /* RootDestination.swift */; }; 0D26AF41299E8196005260EE /* OnboardingProgressIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66A0807A271993C500118B79 /* OnboardingProgressIndicator.swift */; }; 0D26AF44299E8196005260EE /* Memo+toString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34BF09082927C98000222134 /* Memo+toString.swift */; }; - 0D26AF45299E8196005260EE /* ScreenBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D7DF08B271DCC0E00530046 /* ScreenBackground.swift */; }; 0D26AF46299E8196005260EE /* CheckCircleStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346715A428E2027D0035F7C4 /* CheckCircleStore.swift */; }; 0D26AF47299E8196005260EE /* CreateTransactionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165BB2740403600592F76 /* CreateTransactionView.swift */; }; 0D26AF4A299E8196005260EE /* Bindings.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165B3274031F600592F76 /* Bindings.swift */; }; @@ -135,12 +94,9 @@ 0D26AF54299E8196005260EE /* CrashReporterInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D26103B298C3E4800CC9DE9 /* CrashReporterInterface.swift */; }; 0D26AF55299E8196005260EE /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A5227680DD000A2DB75 /* ProfileView.swift */; }; 0D26AF56299E8196005260EE /* ScanStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A5E27680DF600A2DB75 /* ScanStore.swift */; }; - 0D26AF58299E8196005260EE /* WalletEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAB46772860A1D2002904A0 /* WalletEvent.swift */; }; 0D26AF59299E8196005260EE /* WalletStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911472848EEB90073DD9A /* WalletStorage.swift */; }; - 0D26AF5A299E8196005260EE /* RecoveryPhraseBackupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DFE93E0272C9ECB000FCCA5 /* RecoveryPhraseBackupView.swift */; }; 0D26AF5C299E8196005260EE /* WelcomeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E69A24C27FB002800A55317 /* WelcomeStore.swift */; }; 0D26AF5F299E8196005260EE /* SendFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165CA2741AB5D00592F76 /* SendFlowView.swift */; }; - 0D26AF60299E8196005260EE /* ValidationWord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0DC282D298900C374E8 /* ValidationWord.swift */; }; 0D26AF61299E8196005260EE /* WalletStorageTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863972923935B003D0F8B /* WalletStorageTestKey.swift */; }; 0D26AF62299E8196005260EE /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D0781C3278750E30083ACD7 /* WelcomeView.swift */; }; 0D26AF64299E8196005260EE /* SettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9971A6227680DFE00A2DB75 /* SettingsStore.swift */; }; @@ -151,8 +107,6 @@ 0D26AF69299E8196005260EE /* AddressDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB61E2874143800A02233 /* AddressDetailsView.swift */; }; 0D26AF6A299E8196005260EE /* ClearBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6713F9289BE0E100A6796F /* ClearBackgroundView.swift */; }; 0D26AF6C299E8196005260EE /* TransactionSentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C165BD2740403600592F76 /* TransactionSentView.swift */; }; - 0D26AF6D299E8196005260EE /* ZcashSDKEnvironmentLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A6B292167FF00112F41 /* ZcashSDKEnvironmentLiveKey.swift */; }; - 0D26AF6E299E8196005260EE /* WalletLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0F5746297EE5F3005304FA /* WalletLogger.swift */; }; 0D26AF71299E8196005260EE /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 0D26AE8F299E8196005260EE /* Lottie */; }; 0D26AF72299E8196005260EE /* URLRouting in Frameworks */ = {isa = PBXBuildFile; productRef = 0D26AE93299E8196005260EE /* URLRouting */; }; 0D26AF73299E8196005260EE /* ZcashLightClientKit in Frameworks */ = {isa = PBXBuildFile; productRef = 0D26AE91299E8196005260EE /* ZcashLightClientKit */; }; @@ -160,74 +114,26 @@ 0D26AF75299E8196005260EE /* MnemonicSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0D26AE8B299E8196005260EE /* MnemonicSwift */; }; 0D26AF76299E8196005260EE /* ComposableArchitecture in Frameworks */ = {isa = PBXBuildFile; productRef = 0D26AE89299E8196005260EE /* ComposableArchitecture */; }; 0D26AF77299E8196005260EE /* Parsing in Frameworks */ = {isa = PBXBuildFile; productRef = 0D26AE8D299E8196005260EE /* Parsing */; }; - 0D26AF79299E8196005260EE /* Roboto-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8627209FA60039EEA5 /* Roboto-Medium.ttf */; }; 0D26AF7A299E8196005260EE /* sendingTransaction.json in Resources */ = {isa = PBXBuildFile; fileRef = 34DA414828E439CD00F8CC61 /* sendingTransaction.json */; }; - 0D26AF7B299E8196005260EE /* Roboto-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8B27209FA70039EEA5 /* Roboto-MediumItalic.ttf */; }; - 0D26AF7C299E8196005260EE /* Roboto-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8727209FA60039EEA5 /* Roboto-BoldItalic.ttf */; }; 0D26AF7D299E8196005260EE /* endlessCircleProgress.json in Resources */ = {isa = PBXBuildFile; fileRef = 9E6612352878345000C75B70 /* endlessCircleProgress.json */; }; - 0D26AF7E299E8196005260EE /* Roboto-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8327209FA60039EEA5 /* Roboto-Bold.ttf */; }; - 0D26AF7F299E8196005260EE /* Roboto-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8527209FA60039EEA5 /* Roboto-Italic.ttf */; }; - 0D26AF80299E8196005260EE /* Rubik-Italic-VariableFont_wght.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0D535FDC271F4214009A9E3E /* Rubik-Italic-VariableFont_wght.ttf */; }; - 0D26AF81299E8196005260EE /* Roboto-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8427209FA60039EEA5 /* Roboto-LightItalic.ttf */; }; - 0D26AF82299E8196005260EE /* Roboto-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8C27209FA70039EEA5 /* Roboto-BlackItalic.ttf */; }; - 0D26AF83299E8196005260EE /* Roboto-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8827209FA60039EEA5 /* Roboto-Regular.ttf */; }; 0D26AF84299E8196005260EE /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0F26B364180058B01E /* Preview Assets.xcassets */; }; - 0D26AF85299E8196005260EE /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 660558E8270C7A54009D6954 /* Colors.xcassets */; }; - 0D26AF86299E8196005260EE /* Rubik-VariableFont_wght.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0D535FDD271F4214009A9E3E /* Rubik-VariableFont_wght.ttf */; }; - 0D26AF87299E8196005260EE /* Roboto-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8D27209FA70039EEA5 /* Roboto-Light.ttf */; }; 0D26AF88299E8196005260EE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9E2F1C8B280ED6A7004E65FE /* LaunchScreen.storyboard */; }; - 0D26AF8A299E8196005260EE /* Roboto-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8A27209FA70039EEA5 /* Roboto-Black.ttf */; }; - 0D26AF8B299E8196005260EE /* Roboto-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8F27209FA70039EEA5 /* Roboto-ThinItalic.ttf */; }; 0D26AF8C299E8196005260EE /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0D3B01EB298DAF89007EBCDA /* GoogleService-Info.plist */; }; - 0D26AF8D299E8196005260EE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9E37A2B727C8F59F00AE57B3 /* Localizable.strings */; }; - 0D26AF8E299E8196005260EE /* Roboto-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8927209FA60039EEA5 /* Roboto-Thin.ttf */; }; - 0D26AF8F299E8196005260EE /* Zboto.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0D2ACE7F26C2C67100D62E3C /* Zboto.otf */; }; - 0D2ACE8026C2C67100D62E3C /* Zboto.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0D2ACE7F26C2C67100D62E3C /* Zboto.otf */; }; 0D3016B529BF94D1002371B3 /* Button+Disabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3016B429BF94D1002371B3 /* Button+Disabling.swift */; }; 0D3016B629BF94D1002371B3 /* Button+Disabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3016B429BF94D1002371B3 /* Button+Disabling.swift */; }; 0D3016B829BFB2FB002371B3 /* PlainOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3016B729BFB2FB002371B3 /* PlainOnboardingView.swift */; }; 0D3016B929BFB2FB002371B3 /* PlainOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3016B729BFB2FB002371B3 /* PlainOnboardingView.swift */; }; - 0D35CC46277A36E00074316A /* ScrollableWhenScaled.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D35CC45277A36E00074316A /* ScrollableWhenScaled.swift */; }; 0D3B01EC298DAF89007EBCDA /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0D3B01EB298DAF89007EBCDA /* GoogleService-Info.plist */; }; 0D3D04082728B3440032ABC1 /* RecoveryPhraseDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3D04072728B3440032ABC1 /* RecoveryPhraseDisplayView.swift */; }; 0D3D040A2728B3A10032ABC1 /* RecoveryPhraseDisplayStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3D04092728B3A10032ABC1 /* RecoveryPhraseDisplayStore.swift */; }; 0D4E7A0926B364170058B01E /* SecantApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0826B364170058B01E /* SecantApp.swift */; }; - 0D4E7A0D26B364180058B01E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0C26B364180058B01E /* Assets.xcassets */; }; 0D4E7A1026B364180058B01E /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0F26B364180058B01E /* Preview Assets.xcassets */; }; - 0D535FDE271F4214009A9E3E /* Rubik-Italic-VariableFont_wght.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0D535FDC271F4214009A9E3E /* Rubik-Italic-VariableFont_wght.ttf */; }; - 0D535FDF271F4214009A9E3E /* Rubik-VariableFont_wght.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0D535FDD271F4214009A9E3E /* Rubik-VariableFont_wght.ttf */; }; - 0D535FE2271F9476009A9E3E /* EnumeratedChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D535FE1271F9476009A9E3E /* EnumeratedChip.swift */; }; 0D573CB629C106E900B97379 /* About.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4AA4F729BF76BB00752BB3 /* About.swift */; }; 0D5D9B8F2914620700DBD03F /* URLRouting in Frameworks */ = {isa = PBXBuildFile; productRef = 0D5D9B8E2914620700DBD03F /* URLRouting */; }; 0D63170029919970007D873F /* UserPreferencesStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D6316FF29919970007D873F /* UserPreferencesStorageInterface.swift */; }; - 0D6D628B276A528E002FB4CC /* DropDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D6D628A276A528D002FB4CC /* DropDelegate.swift */; }; - 0D7CE63427349B5D0020E050 /* View+WhenDraggable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D7CE63327349B5D0020E050 /* View+WhenDraggable.swift */; }; - 0D7DF08C271DCC0E00530046 /* ScreenBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D7DF08B271DCC0E00530046 /* ScreenBackground.swift */; }; - 0D7E5D71299FBCDF00BE9569 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0C26B364180058B01E /* Assets.xcassets */; }; - 0D8A43C4272AEEDE005A6414 /* SecantTextStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D8A43C3272AEEDE005A6414 /* SecantTextStyles.swift */; }; - 0D8A43C6272B129C005A6414 /* WordChipGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D8A43C5272B129C005A6414 /* WordChipGrid.swift */; }; - 0DACFA7F27208CE00039EEA5 /* Clamped.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DACFA7E27208CE00039EEA5 /* Clamped.swift */; }; 0DACFA8127208D940039EEA5 /* UInt+SuperscriptText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DACFA8027208D940039EEA5 /* UInt+SuperscriptText.swift */; }; - 0DACFA9027209FA70039EEA5 /* Roboto-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8327209FA60039EEA5 /* Roboto-Bold.ttf */; }; - 0DACFA9127209FA70039EEA5 /* Roboto-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8427209FA60039EEA5 /* Roboto-LightItalic.ttf */; }; - 0DACFA9227209FA70039EEA5 /* Roboto-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8527209FA60039EEA5 /* Roboto-Italic.ttf */; }; - 0DACFA9327209FA70039EEA5 /* Roboto-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8627209FA60039EEA5 /* Roboto-Medium.ttf */; }; - 0DACFA9427209FA70039EEA5 /* Roboto-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8727209FA60039EEA5 /* Roboto-BoldItalic.ttf */; }; - 0DACFA9527209FA70039EEA5 /* Roboto-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8827209FA60039EEA5 /* Roboto-Regular.ttf */; }; - 0DACFA9627209FA70039EEA5 /* Roboto-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8927209FA60039EEA5 /* Roboto-Thin.ttf */; }; - 0DACFA9727209FA70039EEA5 /* Roboto-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8A27209FA70039EEA5 /* Roboto-Black.ttf */; }; - 0DACFA9827209FA70039EEA5 /* Roboto-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8B27209FA70039EEA5 /* Roboto-MediumItalic.ttf */; }; - 0DACFA9927209FA70039EEA5 /* Roboto-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8C27209FA70039EEA5 /* Roboto-BlackItalic.ttf */; }; - 0DACFA9A27209FA70039EEA5 /* Roboto-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8D27209FA70039EEA5 /* Roboto-Light.ttf */; }; - 0DACFA9C27209FA70039EEA5 /* Roboto-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0DACFA8F27209FA70039EEA5 /* Roboto-ThinItalic.ttf */; }; 0DB8AA81271DC7520035BC9D /* DesignGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DB8AA80271DC7520035BC9D /* DesignGuide.swift */; }; - 0DC487C32772574C00BE6A63 /* RecoveryPhraseBackupSucceededView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DC487C22772574C00BE6A63 /* RecoveryPhraseBackupSucceededView.swift */; }; - 0DDB6A5127737D4A0012A410 /* RecoveryPhraseBackupFailedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DDB6A5027737D4A0012A410 /* RecoveryPhraseBackupFailedView.swift */; }; - 0DF2DC51272344E400FA31E2 /* EmptyChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF2DC50272344E400FA31E2 /* EmptyChip.swift */; }; - 0DF2DC5427235E3E00FA31E2 /* View+InnerShadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF2DC5327235E3E00FA31E2 /* View+InnerShadow.swift */; }; 0DF482BA2787ADA800EB37D6 /* ConditionalModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF482B92787ADA800EB37D6 /* ConditionalModifier.swift */; }; - 0DFE93E1272C9ECB000FCCA5 /* RecoveryPhraseBackupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DFE93E0272C9ECB000FCCA5 /* RecoveryPhraseBackupView.swift */; }; - 0DFE93E3272CA1AA000FCCA5 /* RecoveryPhraseValidationFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DFE93E2272CA1AA000FCCA5 /* RecoveryPhraseValidationFlowStore.swift */; }; 2E35F99227B28E7600EB79CD /* SingleLineTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E35F99127B28E7600EB79CD /* SingleLineTextField.swift */; }; 2E35F99A27B3E99C00EB79CD /* TextFieldTitleAccessoryButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E35F99927B3E99C00EB79CD /* TextFieldTitleAccessoryButtonStyle.swift */; }; 2E58E73B274679F000B2B84B /* OnboardingHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E58E73A274679F000B2B84B /* OnboardingHeaderView.swift */; }; @@ -244,20 +150,10 @@ 2EDA07A427EDE2A900D6F09B /* DebugFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDA07A327EDE2A900D6F09B /* DebugFrame.swift */; }; 3448CB3228E47666006ADEDB /* NotEnoughFreeSpaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3448CB3128E47666006ADEDB /* NotEnoughFreeSpaceView.swift */; }; 346715A528E2027D0035F7C4 /* CheckCircleStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346715A428E2027D0035F7C4 /* CheckCircleStore.swift */; }; - 3467319529AE265300974482 /* SupportDataGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3467319429AE265300974482 /* SupportDataGenerator.swift */; }; - 3467319629AE265300974482 /* SupportDataGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3467319429AE265300974482 /* SupportDataGenerator.swift */; }; - 3467319929AE374300974482 /* SupportDataGeneratorInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3467319829AE374300974482 /* SupportDataGeneratorInterface.swift */; }; - 3467319A29AE374300974482 /* SupportDataGeneratorInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3467319829AE374300974482 /* SupportDataGeneratorInterface.swift */; }; - 3467319C29AE374A00974482 /* SupportDataGeneratorLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3467319B29AE374A00974482 /* SupportDataGeneratorLiveKey.swift */; }; - 3467319D29AE374A00974482 /* SupportDataGeneratorLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3467319B29AE374A00974482 /* SupportDataGeneratorLiveKey.swift */; }; - 3467319F29AE375000974482 /* SupportDataGeneratorTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3467319E29AE375000974482 /* SupportDataGeneratorTestKey.swift */; }; - 346731A029AE375000974482 /* SupportDataGeneratorTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3467319E29AE375000974482 /* SupportDataGeneratorTestKey.swift */; }; 346731A229AE3A5100974482 /* UIMailDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346731A129AE3A5100974482 /* UIMailDialog.swift */; }; 346731A329AE3A5100974482 /* UIMailDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346731A129AE3A5100974482 /* UIMailDialog.swift */; }; 346D41E428DF0B8600963F36 /* CheckCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346D41E328DF0B8600963F36 /* CheckCircle.swift */; }; 34BF09092927C98000222134 /* Memo+toString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34BF09082927C98000222134 /* Memo+toString.swift */; }; - 34C4329029B62D8D00F74045 /* L10n.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C4328F29B62D8D00F74045 /* L10n.swift */; }; - 34C4329129B62D8D00F74045 /* L10n.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C4328F29B62D8D00F74045 /* L10n.swift */; }; 34C5658229B60C1C002F3A7C /* UIShareDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C5658129B60C1C002F3A7C /* UIShareDialog.swift */; }; 34C5658329B60C1C002F3A7C /* UIShareDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C5658129B60C1C002F3A7C /* UIShareDialog.swift */; }; 34C5658529B60C8B002F3A7C /* ExportLogsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C5658429B60C8B002F3A7C /* ExportLogsStore.swift */; }; @@ -278,14 +174,9 @@ 34F682F629A7641B0022C079 /* WalletConfigProviderTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F682F429A7641B0022C079 /* WalletConfigProviderTestKey.swift */; }; 34F682F829A775C10022C079 /* UserDefaultsWalletConfigStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F682F729A775C10022C079 /* UserDefaultsWalletConfigStorage.swift */; }; 34F682F929A775C10022C079 /* UserDefaultsWalletConfigStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F682F729A775C10022C079 /* UserDefaultsWalletConfigStorage.swift */; }; - 660558E9270C7A54009D6954 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 660558E8270C7A54009D6954 /* Colors.xcassets */; }; - 660558F7270C862F009D6954 /* Fonts+Generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 660558F5270C862F009D6954 /* Fonts+Generated.swift */; }; - 660558F8270C862F009D6954 /* XCAssets+Generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 660558F6270C862F009D6954 /* XCAssets+Generated.swift */; }; - 663FAB9C271D874D00E495F8 /* ActiveButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663FAB9B271D874D00E495F8 /* ActiveButton.swift */; }; 6654C73A2715A38000901167 /* ComposableArchitecture in Frameworks */ = {isa = PBXBuildFile; productRef = 6654C7392715A38000901167 /* ComposableArchitecture */; }; 6654C73E2715A41300901167 /* OnboardingFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6654C73D2715A41300901167 /* OnboardingFlowStore.swift */; }; 66A0807B271993C500118B79 /* OnboardingProgressIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66A0807A271993C500118B79 /* OnboardingProgressIndicator.swift */; }; - 66DC733F271D88CC0053CBB6 /* StandardButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66DC733E271D88CC0053CBB6 /* StandardButtonStyle.swift */; }; 9E0310B52A24A4CA0021F995 /* FileManager in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0310B42A24A4CA0021F995 /* FileManager */; }; 9E0310B72A24A4D40021F995 /* AppVersionClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0310B62A24A4D40021F995 /* AppVersionClient */; }; 9E0310B92A24A4D40021F995 /* AudioServicesClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0310B82A24A4D40021F995 /* AudioServicesClient */; }; @@ -301,16 +192,6 @@ 9E0310CE2A24BB420021F995 /* URIParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0310CA2A24BB420021F995 /* URIParserTest.swift */; }; 9E0F5741297E7F1D005304FA /* TCALogging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0F5740297E7F1C005304FA /* TCALogging.swift */; }; 9E0F5743297EB96C005304FA /* TCALoggerReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0F5742297EB96C005304FA /* TCALoggerReducer.swift */; }; - 9E0F5747297EE5F3005304FA /* WalletLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0F5746297EE5F3005304FA /* WalletLogger.swift */; }; - 9E153A6E292167FF00112F41 /* ZcashSDKEnvironmentLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A6B292167FF00112F41 /* ZcashSDKEnvironmentLiveKey.swift */; }; - 9E153A6F292167FF00112F41 /* ZcashSDKEnvironmentTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A6C292167FF00112F41 /* ZcashSDKEnvironmentTestKey.swift */; }; - 9E153A70292167FF00112F41 /* ZcashSDKEnvironmentInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A6D292167FF00112F41 /* ZcashSDKEnvironmentInterface.swift */; }; - 9E153A7529216EFB00112F41 /* UserDefaultsLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A7229216EFB00112F41 /* UserDefaultsLiveKey.swift */; }; - 9E153A7629216EFB00112F41 /* UserDefaultsInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A7329216EFB00112F41 /* UserDefaultsInterface.swift */; }; - 9E153A7729216EFB00112F41 /* UserDefaultsTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E153A7429216EFB00112F41 /* UserDefaultsTestKey.swift */; }; - 9E2A07B729DAE0A900F2B086 /* ReviewRequestTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2A07B429DAE0A900F2B086 /* ReviewRequestTestKey.swift */; }; - 9E2A07B829DAE0A900F2B086 /* ReviewRequestLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2A07B529DAE0A900F2B086 /* ReviewRequestLiveKey.swift */; }; - 9E2A07B929DAE0A900F2B086 /* ReviewRequestInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2A07B629DAE0A900F2B086 /* ReviewRequestInterface.swift */; }; 9E2AC0FF27D8EC120042AA47 /* MnemonicSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 9E2AC0FE27D8EC120042AA47 /* MnemonicSwift */; }; 9E2DF99C27CF704D00649636 /* ImportWalletStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2DF99827CF704D00649636 /* ImportWalletStore.swift */; }; 9E2DF99D27CF704D00649636 /* ImportSeedEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2DF99A27CF704D00649636 /* ImportSeedEditor.swift */; }; @@ -374,7 +255,6 @@ 9E3451C429C857DF00177D16 /* View+UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E92AF0728530EBF007367AD /* View+UIImage.swift */; }; 9E3451C529C857E400177D16 /* WalletEventsSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB6112869882D00A02233 /* WalletEventsSnapshotTests.swift */; }; 9E3451C629C857E700177D16 /* WelcomeSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9ECC8E28589E150099D5A2 /* WelcomeSnapshotTests.swift */; }; - 9E37A2B827C8F59F00AE57B3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9E37A2B727C8F59F00AE57B3 /* Localizable.strings */; }; 9E39114A2848EEB90073DD9A /* UserPreferencesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911442848EEB90073DD9A /* UserPreferencesStorage.swift */; }; 9E486DE529B637AF003E6945 /* ImportBirthdayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E486DE429B637AF003E6945 /* ImportBirthdayView.swift */; }; 9E486DE629B637AF003E6945 /* ImportBirthdayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E486DE429B637AF003E6945 /* ImportBirthdayView.swift */; }; @@ -385,7 +265,6 @@ 9E486DF929BA09C2003E6945 /* UIKit+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E486DF829BA09C2003E6945 /* UIKit+Extensions.swift */; }; 9E486DFA29BA09C2003E6945 /* UIKit+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E486DF829BA09C2003E6945 /* UIKit+Extensions.swift */; }; 9E4AA4F829BF76BB00752BB3 /* About.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4AA4F729BF76BB00752BB3 /* About.swift */; }; - 9E4DC6E227C4C6B700E657F4 /* SecantButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4DC6E127C4C6B700E657F4 /* SecantButtonStyles.swift */; }; 9E5BF641281FD7B600BA3F17 /* TransactionFailedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF640281FD7B600BA3F17 /* TransactionFailedView.swift */; }; 9E5BF64F2823E94900BA3F17 /* TransactionAddressTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF64D2823E94900BA3F17 /* TransactionAddressTextField.swift */; }; 9E5BF6502823E94900BA3F17 /* TransactionAddressTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF64E2823E94900BA3F17 /* TransactionAddressTextFieldStore.swift */; }; @@ -399,20 +278,13 @@ 9E69A24D27FB002800A55317 /* WelcomeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E69A24C27FB002800A55317 /* WelcomeStore.swift */; }; 9E7225F3288AB6DD00DF7F17 /* MultipleLineTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F2288AB6DD00DF7F17 /* MultipleLineTextField.swift */; }; 9E7225F6288AC71A00DF7F17 /* MultiLineTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F5288AC71A00DF7F17 /* MultiLineTextFieldStore.swift */; }; - 9E74CCCB29DC04ED003D6E32 /* ReviewRequestInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2A07B629DAE0A900F2B086 /* ReviewRequestInterface.swift */; }; - 9E74CCCC29DC04ED003D6E32 /* ReviewRequestLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2A07B529DAE0A900F2B086 /* ReviewRequestLiveKey.swift */; }; - 9E74CCCD29DC04ED003D6E32 /* ReviewRequestTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2A07B429DAE0A900F2B086 /* ReviewRequestTestKey.swift */; }; 9E74CCD029DC0628003D6E32 /* ReviewRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E74CCCF29DC0628003D6E32 /* ReviewRequestTests.swift */; }; 9E7CB6152869E8C300A02233 /* CircularProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB6142869E8C300A02233 /* CircularProgress.swift */; }; 9E7CB61A287310EC00A02233 /* QRCodeGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB619287310EC00A02233 /* QRCodeGenerator.swift */; }; 9E7CB6202874143800A02233 /* AddressDetailsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB61F2874143800A02233 /* AddressDetailsStore.swift */; }; 9E7CB6212874143800A02233 /* AddressDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7CB61E2874143800A02233 /* AddressDetailsView.swift */; }; - 9E7FE0D5282D281800C374E8 /* Array+Chunked.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0D4282D281800C374E8 /* Array+Chunked.swift */; }; - 9E7FE0D7282D286500C374E8 /* RecoveryPhrase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0D6282D286500C374E8 /* RecoveryPhrase.swift */; }; - 9E7FE0DD282D298900C374E8 /* ValidationWord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0DC282D298900C374E8 /* ValidationWord.swift */; }; 9E7FE0DF282D2DD600C374E8 /* ZcashBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0DE282D2DD600C374E8 /* ZcashBadge.swift */; }; 9E7FE0E6282E7B1100C374E8 /* StoredWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0E5282E7B1100C374E8 /* StoredWallet.swift */; }; - 9E7FE0EC282E7D9400C374E8 /* TransactionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF63B2818305D00BA3F17 /* TransactionState.swift */; }; 9E7FE0F628327F6F00C374E8 /* ScanUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F528327F6F00C374E8 /* ScanUIView.swift */; }; 9E7FE0F92832824C00C374E8 /* QRCodeScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7FE0F82832824C00C374E8 /* QRCodeScanView.swift */; }; 9E80C4482A25E8DF0049E6A7 /* PasteboardClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E80C4472A25E8DF0049E6A7 /* PasteboardClient */; }; @@ -442,14 +314,29 @@ 9E88FBA82A2481DB00DAA500 /* DatabaseFilesClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E88FBA72A2481DB00DAA500 /* DatabaseFilesClient */; }; 9E88FBAA2A24A0E000DAA500 /* DerivationToolClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E88FBA92A24A0E000DAA500 /* DerivationToolClient */; }; 9E88FBAC2A24A0E900DAA500 /* DeeplinkClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E88FBAB2A24A0E900DAA500 /* DeeplinkClient */; }; + 9E9074FF2A260FE400269308 /* WalletEvent+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9074FE2A260FE400269308 /* WalletEvent+View.swift */; }; + 9E9075002A260FE400269308 /* WalletEvent+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9074FE2A260FE400269308 /* WalletEvent+View.swift */; }; + 9E9075022A2681F700269308 /* Generated in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075012A2681F700269308 /* Generated */; }; + 9E9075042A2681FF00269308 /* Generated in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075032A2681FF00269308 /* Generated */; }; + 9E9075062A2689D600269308 /* RecoveryPhraseValidationFlow in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075052A2689D600269308 /* RecoveryPhraseValidationFlow */; }; + 9E9075082A2689DB00269308 /* RecoveryPhraseValidationFlow in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075072A2689DB00269308 /* RecoveryPhraseValidationFlow */; }; + 9E90750A2A268CD700269308 /* SecItem in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075092A268CD700269308 /* SecItem */; }; + 9E90750C2A268CDC00269308 /* SecItem in Frameworks */ = {isa = PBXBuildFile; productRef = 9E90750B2A268CDC00269308 /* SecItem */; }; + 9E90750E2A26919B00269308 /* ReviewRequestClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E90750D2A26919B00269308 /* ReviewRequestClient */; }; + 9E9075102A2691A000269308 /* ReviewRequestClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E90750F2A2691A000269308 /* ReviewRequestClient */; }; + 9E9075122A2691B200269308 /* ZcashSDKEnvironment in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075112A2691B200269308 /* ZcashSDKEnvironment */; }; + 9E9075142A2691B700269308 /* ZcashSDKEnvironment in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075132A2691B700269308 /* ZcashSDKEnvironment */; }; + 9E9075162A2691C600269308 /* SupportDataGeneratorClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075152A2691C600269308 /* SupportDataGeneratorClient */; }; + 9E9075182A2691CB00269308 /* SupportDataGeneratorClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075172A2691CB00269308 /* SupportDataGeneratorClient */; }; + 9E90751A2A2691D900269308 /* SDKSynchronizerClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E9075192A2691D900269308 /* SDKSynchronizerClient */; }; + 9E90751C2A2691E200269308 /* SDKSynchronizerClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9E90751B2A2691E200269308 /* SDKSynchronizerClient */; }; + 9E90751E2A269BE300269308 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9E90751D2A269BE300269308 /* Assets.xcassets */; }; + 9E90751F2A269BE300269308 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9E90751D2A269BE300269308 /* Assets.xcassets */; }; 9E9ADA7D2938F4C00071767B /* RootInitialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9ADA7C2938F4C00071767B /* RootInitialization.swift */; }; 9E9ADA7F2938F5EC0071767B /* RootDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9ADA7E2938F5EC0071767B /* RootDestination.swift */; }; 9E9CEA3E29D47BE000599DF5 /* OnChangeReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9CEA3D29D47BE000599DF5 /* OnChangeReducer.swift */; }; 9EAB466D285A0468002904A0 /* Parsing in Frameworks */ = {isa = PBXBuildFile; productRef = 9EAB466C285A0468002904A0 /* Parsing */; }; - 9EAB46782860A1D2002904A0 /* WalletEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAB46772860A1D2002904A0 /* WalletEvent.swift */; }; 9EAB467A2861EA6A002904A0 /* TransactionRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAB46792861EA6A002904A0 /* TransactionRowView.swift */; }; - 9EAFEB84280597B700199FC9 /* SecItemInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB83280597B700199FC9 /* SecItemInterface.swift */; }; - 9EAFEB882806E5AE00199FC9 /* SDKSynchronizerInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB872806E5AE00199FC9 /* SDKSynchronizerInterface.swift */; }; 9EAFEB8F2808183D00199FC9 /* SandboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8D2808183D00199FC9 /* SandboxView.swift */; }; 9EAFEB902808183D00199FC9 /* SandboxStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAFEB8E2808183D00199FC9 /* SandboxStore.swift */; }; 9EAFEB9128081E9400199FC9 /* HomeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93874ED273C4DE200F0E875 /* HomeStore.swift */; }; @@ -458,19 +345,10 @@ 9EB8639B2923935B003D0F8B /* WalletStorageInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863982923935B003D0F8B /* WalletStorageInterface.swift */; }; 9EB8639C2923935B003D0F8B /* WalletStorageLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863992923935B003D0F8B /* WalletStorageLiveKey.swift */; }; 9EB8639D29239405003D0F8B /* WalletStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911472848EEB90073DD9A /* WalletStorage.swift */; }; - 9EB863A729239DCB003D0F8B /* RecoveryPhraseRandomizerTestKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863A429239DCB003D0F8B /* RecoveryPhraseRandomizerTestKey.swift */; }; - 9EB863A829239DCB003D0F8B /* RecoveryPhraseRandomizerLiveKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863A529239DCB003D0F8B /* RecoveryPhraseRandomizerLiveKey.swift */; }; - 9EB863A929239DCB003D0F8B /* RecoveryPhraseRandomizerInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863A629239DCB003D0F8B /* RecoveryPhraseRandomizerInterface.swift */; }; - 9EB863AA29239EB2003D0F8B /* RecoveryPhraseRandomizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911422848EEB90073DD9A /* RecoveryPhraseRandomizer.swift */; }; - 9EB863BF2923C72C003D0F8B /* SecItemLive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863BE2923C72C003D0F8B /* SecItemLive.swift */; }; 9EB863C72923C93B003D0F8B /* UserPreferencesStorageLive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863C62923C93B003D0F8B /* UserPreferencesStorageLive.swift */; }; 9EB863C92923C953003D0F8B /* UserPreferencesStorageMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863C82923C953003D0F8B /* UserPreferencesStorageMocks.swift */; }; - 9EB863CB2923CA20003D0F8B /* SDKSynchronizerLive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863CA2923CA20003D0F8B /* SDKSynchronizerLive.swift */; }; - 9EB863CD2923CA28003D0F8B /* SDKSynchronizerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EB863CC2923CA28003D0F8B /* SDKSynchronizerTest.swift */; }; - 9EBEF87A27CE369800B4F343 /* RecoveryPhraseValidationFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EBEF87927CE369800B4F343 /* RecoveryPhraseValidationFlowView.swift */; }; 9EF8136027F043CC0075AF48 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8135F27F043CC0075AF48 /* AppDelegate.swift */; }; 9EF8139C27F47AED0075AF48 /* InitializationState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8139B27F47AED0075AF48 /* InitializationState.swift */; }; - F9322DC0273B555C00C105B5 /* NavigationLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9322DBF273B555C00C105B5 /* NavigationLinks.swift */; }; F93673D62742CB840099C6AF /* Previews.swift in Sources */ = {isa = PBXBuildFile; fileRef = F93673D52742CB840099C6AF /* Previews.swift */; }; F96B41E7273B501F0021B49A /* WalletEventsFlowStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E3273B501F0021B49A /* WalletEventsFlowStore.swift */; }; F96B41E8273B501F0021B49A /* TransactionDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96B41E5273B501F0021B49A /* TransactionDetailView.swift */; }; @@ -511,23 +389,18 @@ /* Begin PBXFileReference section */ 0D0781C3278750E30083ACD7 /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = ""; }; 0D0781C7278776D20083ACD7 /* ZcashSymbol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZcashSymbol.swift; sourceTree = ""; }; - 0D185818272723FF0046B928 /* ColoredChip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColoredChip.swift; sourceTree = ""; }; - 0D18581A272728D60046B928 /* PhraseChip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhraseChip.swift; sourceTree = ""; }; 0D1C1AA227611EFD0004AF6A /* RecoveryPhraseDisplayReducerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseDisplayReducerTests.swift; sourceTree = ""; }; 0D26103B298C3E4800CC9DE9 /* CrashReporterInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashReporterInterface.swift; sourceTree = ""; }; 0D26103D298C3FA600CC9DE9 /* CrashReporterLiveKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashReporterLiveKey.swift; sourceTree = ""; }; 0D26103F298C406F00CC9DE9 /* CrashReporterTestKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashReporterTestKey.swift; sourceTree = ""; }; 0D26AF94299E8196005260EE /* secant-mainnet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "secant-mainnet.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 0D2ACE7F26C2C67100D62E3C /* Zboto.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Zboto.otf; sourceTree = ""; }; 0D3016B429BF94D1002371B3 /* Button+Disabling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Button+Disabling.swift"; sourceTree = ""; }; 0D3016B729BFB2FB002371B3 /* PlainOnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlainOnboardingView.swift; sourceTree = ""; }; - 0D35CC45277A36E00074316A /* ScrollableWhenScaled.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollableWhenScaled.swift; sourceTree = ""; }; 0D3B01EB298DAF89007EBCDA /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 0D3D04072728B3440032ABC1 /* RecoveryPhraseDisplayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseDisplayView.swift; sourceTree = ""; }; 0D3D04092728B3A10032ABC1 /* RecoveryPhraseDisplayStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseDisplayStore.swift; sourceTree = ""; }; 0D4E7A0526B364170058B01E /* secant-testnet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "secant-testnet.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 0D4E7A0826B364170058B01E /* SecantApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecantApp.swift; sourceTree = ""; }; - 0D4E7A0C26B364180058B01E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 0D4E7A0F26B364180058B01E /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 0D4E7A1126B364180058B01E /* secant-testnet-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "secant-testnet-Info.plist"; sourceTree = ""; }; 0D4E7A1626B364180058B01E /* secantTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = secantTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -536,40 +409,13 @@ 0D4E7A2126B364180058B01E /* secantUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = secantUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 0D4E7A2526B364180058B01E /* secantUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = secantUITests.swift; sourceTree = ""; }; 0D4E7A2726B364180058B01E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 0D535FDC271F4214009A9E3E /* Rubik-Italic-VariableFont_wght.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Rubik-Italic-VariableFont_wght.ttf"; sourceTree = ""; }; - 0D535FDD271F4214009A9E3E /* Rubik-VariableFont_wght.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Rubik-VariableFont_wght.ttf"; sourceTree = ""; }; - 0D535FE1271F9476009A9E3E /* EnumeratedChip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnumeratedChip.swift; sourceTree = ""; }; 0D6316FF29919970007D873F /* UserPreferencesStorageInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorageInterface.swift; sourceTree = ""; }; - 0D6D628A276A528D002FB4CC /* DropDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DropDelegate.swift; sourceTree = ""; }; - 0D7CE63327349B5D0020E050 /* View+WhenDraggable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+WhenDraggable.swift"; sourceTree = ""; }; - 0D7DF08B271DCC0E00530046 /* ScreenBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenBackground.swift; sourceTree = ""; }; - 0D8A43C3272AEEDE005A6414 /* SecantTextStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecantTextStyles.swift; sourceTree = ""; }; - 0D8A43C5272B129C005A6414 /* WordChipGrid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordChipGrid.swift; sourceTree = ""; }; - 0DACFA7E27208CE00039EEA5 /* Clamped.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clamped.swift; sourceTree = ""; }; 0DACFA8027208D940039EEA5 /* UInt+SuperscriptText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UInt+SuperscriptText.swift"; sourceTree = ""; }; - 0DACFA8327209FA60039EEA5 /* Roboto-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Bold.ttf"; sourceTree = ""; }; - 0DACFA8427209FA60039EEA5 /* Roboto-LightItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-LightItalic.ttf"; sourceTree = ""; }; - 0DACFA8527209FA60039EEA5 /* Roboto-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Italic.ttf"; sourceTree = ""; }; - 0DACFA8627209FA60039EEA5 /* Roboto-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Medium.ttf"; sourceTree = ""; }; - 0DACFA8727209FA60039EEA5 /* Roboto-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-BoldItalic.ttf"; sourceTree = ""; }; - 0DACFA8827209FA60039EEA5 /* Roboto-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Regular.ttf"; sourceTree = ""; }; - 0DACFA8927209FA60039EEA5 /* Roboto-Thin.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Thin.ttf"; sourceTree = ""; }; - 0DACFA8A27209FA70039EEA5 /* Roboto-Black.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Black.ttf"; sourceTree = ""; }; - 0DACFA8B27209FA70039EEA5 /* Roboto-MediumItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-MediumItalic.ttf"; sourceTree = ""; }; - 0DACFA8C27209FA70039EEA5 /* Roboto-BlackItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-BlackItalic.ttf"; sourceTree = ""; }; - 0DACFA8D27209FA70039EEA5 /* Roboto-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Light.ttf"; sourceTree = ""; }; - 0DACFA8F27209FA70039EEA5 /* Roboto-ThinItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-ThinItalic.ttf"; sourceTree = ""; }; 0DB4E0B02881F2DB00947B78 /* WalletBalance+testing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WalletBalance+testing.swift"; sourceTree = ""; }; 0DB8AA80271DC7520035BC9D /* DesignGuide.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesignGuide.swift; sourceTree = ""; }; - 0DC487C22772574C00BE6A63 /* RecoveryPhraseBackupSucceededView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseBackupSucceededView.swift; sourceTree = ""; }; - 0DDB6A5027737D4A0012A410 /* RecoveryPhraseBackupFailedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseBackupFailedView.swift; sourceTree = ""; }; 0DEF4766299EA5920032708B /* secant-mainnet-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "secant-mainnet-Info.plist"; sourceTree = ""; }; - 0DF2DC50272344E400FA31E2 /* EmptyChip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyChip.swift; sourceTree = ""; }; - 0DF2DC5327235E3E00FA31E2 /* View+InnerShadow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+InnerShadow.swift"; sourceTree = ""; }; 0DF482B92787ADA800EB37D6 /* ConditionalModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionalModifier.swift; sourceTree = ""; }; 0DFE93DE272C6D4B000FCCA5 /* RecoveryPhraseBackupTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseBackupTests.swift; sourceTree = ""; }; - 0DFE93E0272C9ECB000FCCA5 /* RecoveryPhraseBackupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseBackupView.swift; sourceTree = ""; }; - 0DFE93E2272CA1AA000FCCA5 /* RecoveryPhraseValidationFlowStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseValidationFlowStore.swift; sourceTree = ""; }; 0DFE93E5272CB6F7000FCCA5 /* RecoveryPhraseValidationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseValidationTests.swift; sourceTree = ""; }; 2E35F99127B28E7600EB79CD /* SingleLineTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleLineTextField.swift; sourceTree = ""; }; 2E35F99927B3E99C00EB79CD /* TextFieldTitleAccessoryButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldTitleAccessoryButtonStyle.swift; sourceTree = ""; }; @@ -590,15 +436,10 @@ 3448CB3128E47666006ADEDB /* NotEnoughFreeSpaceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotEnoughFreeSpaceView.swift; sourceTree = ""; }; 3448CB3628E485CB006ADEDB /* NotEnoughFeeSpaceSnapshots.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotEnoughFeeSpaceSnapshots.swift; sourceTree = ""; }; 346715A428E2027D0035F7C4 /* CheckCircleStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckCircleStore.swift; sourceTree = ""; }; - 3467319429AE265300974482 /* SupportDataGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportDataGenerator.swift; sourceTree = ""; }; - 3467319829AE374300974482 /* SupportDataGeneratorInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportDataGeneratorInterface.swift; sourceTree = ""; }; - 3467319B29AE374A00974482 /* SupportDataGeneratorLiveKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportDataGeneratorLiveKey.swift; sourceTree = ""; }; - 3467319E29AE375000974482 /* SupportDataGeneratorTestKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportDataGeneratorTestKey.swift; sourceTree = ""; }; 346731A129AE3A5100974482 /* UIMailDialog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIMailDialog.swift; sourceTree = ""; }; 3469F18129ACD70500A07146 /* OnboardingFlowFeatureFlagTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingFlowFeatureFlagTests.swift; sourceTree = ""; }; 346D41E328DF0B8600963F36 /* CheckCircle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckCircle.swift; sourceTree = ""; }; 34BF09082927C98000222134 /* Memo+toString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Memo+toString.swift"; sourceTree = ""; }; - 34C4328F29B62D8D00F74045 /* L10n.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = L10n.swift; sourceTree = ""; }; 34C5658129B60C1C002F3A7C /* UIShareDialog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIShareDialog.swift; sourceTree = ""; }; 34C5658429B60C8B002F3A7C /* ExportLogsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportLogsStore.swift; sourceTree = ""; }; 34DA414628E4385800F8CC61 /* TransactionSendingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionSendingView.swift; sourceTree = ""; }; @@ -611,14 +452,9 @@ 34F682F129A764120022C079 /* WalletConfigProviderLiveKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletConfigProviderLiveKey.swift; sourceTree = ""; }; 34F682F429A7641B0022C079 /* WalletConfigProviderTestKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletConfigProviderTestKey.swift; sourceTree = ""; }; 34F682F729A775C10022C079 /* UserDefaultsWalletConfigStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsWalletConfigStorage.swift; sourceTree = ""; }; - 660558E8270C7A54009D6954 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; - 660558F5270C862F009D6954 /* Fonts+Generated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Fonts+Generated.swift"; sourceTree = ""; }; - 660558F6270C862F009D6954 /* XCAssets+Generated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCAssets+Generated.swift"; sourceTree = ""; }; - 663FAB9B271D874D00E495F8 /* ActiveButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveButton.swift; sourceTree = ""; }; 6654C73D2715A41300901167 /* OnboardingFlowStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingFlowStore.swift; sourceTree = ""; }; 6654C7432715A4AC00901167 /* OnboardingStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingStoreTests.swift; sourceTree = ""; }; 66A0807A271993C500118B79 /* OnboardingProgressIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingProgressIndicator.swift; sourceTree = ""; }; - 66DC733E271D88CC0053CBB6 /* StandardButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardButtonStyle.swift; sourceTree = ""; }; 9E01F8272833CDA0000EFC57 /* ScanTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanTests.swift; sourceTree = ""; }; 9E02B56B27FED475005B809B /* DatabaseFilesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseFilesTests.swift; sourceTree = ""; }; 9E0310C72A24BB420021F995 /* URIParserLive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URIParserLive.swift; sourceTree = ""; }; @@ -627,19 +463,9 @@ 9E0310CA2A24BB420021F995 /* URIParserTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URIParserTest.swift; sourceTree = ""; }; 9E0F5740297E7F1C005304FA /* TCALogging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCALogging.swift; sourceTree = ""; }; 9E0F5742297EB96C005304FA /* TCALoggerReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCALoggerReducer.swift; sourceTree = ""; }; - 9E0F5746297EE5F3005304FA /* WalletLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletLogger.swift; sourceTree = ""; }; 9E0F574A2980260D005304FA /* LoggerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggerTests.swift; sourceTree = ""; }; - 9E153A6B292167FF00112F41 /* ZcashSDKEnvironmentLiveKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZcashSDKEnvironmentLiveKey.swift; sourceTree = ""; }; - 9E153A6C292167FF00112F41 /* ZcashSDKEnvironmentTestKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZcashSDKEnvironmentTestKey.swift; sourceTree = ""; }; - 9E153A6D292167FF00112F41 /* ZcashSDKEnvironmentInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZcashSDKEnvironmentInterface.swift; sourceTree = ""; }; - 9E153A7229216EFB00112F41 /* UserDefaultsLiveKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDefaultsLiveKey.swift; sourceTree = ""; }; - 9E153A7329216EFB00112F41 /* UserDefaultsInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDefaultsInterface.swift; sourceTree = ""; }; - 9E153A7429216EFB00112F41 /* UserDefaultsTestKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDefaultsTestKey.swift; sourceTree = ""; }; 9E207C352966EC77003E2C9B /* AddressDetailsSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressDetailsSnapshotTests.swift; sourceTree = ""; }; 9E207C382966EF87003E2C9B /* AddressDetailsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressDetailsTests.swift; sourceTree = ""; }; - 9E2A07B429DAE0A900F2B086 /* ReviewRequestTestKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReviewRequestTestKey.swift; sourceTree = ""; }; - 9E2A07B529DAE0A900F2B086 /* ReviewRequestLiveKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReviewRequestLiveKey.swift; sourceTree = ""; }; - 9E2A07B629DAE0A900F2B086 /* ReviewRequestInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReviewRequestInterface.swift; sourceTree = ""; }; 9E2DF99827CF704D00649636 /* ImportWalletStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportWalletStore.swift; sourceTree = ""; }; 9E2DF99A27CF704D00649636 /* ImportSeedEditor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportSeedEditor.swift; sourceTree = ""; }; 9E2DF99B27CF704D00649636 /* ImportWalletView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportWalletView.swift; sourceTree = ""; }; @@ -648,12 +474,10 @@ 9E2F1C8E280EDE09004E65FE /* Drawer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Drawer.swift; sourceTree = ""; }; 9E33ECD029D4CCB600708DE4 /* AlertRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertRequest.swift; sourceTree = ""; }; 9E33ECD229D4D1FB00708DE4 /* AlertStates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertStates.swift; sourceTree = ""; }; - 9E37A2B727C8F59F00AE57B3 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; 9E391123283E4CAC0073DD9A /* ImportWalletTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportWalletTests.swift; sourceTree = ""; }; 9E39112D283F91600073DD9A /* ZatoshiTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZatoshiTests.swift; sourceTree = ""; }; 9E391131284644580073DD9A /* AppInitializationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInitializationTests.swift; sourceTree = ""; }; 9E3911382848AD500073DD9A /* HomeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTests.swift; sourceTree = ""; }; - 9E3911422848EEB90073DD9A /* RecoveryPhraseRandomizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseRandomizer.swift; sourceTree = ""; }; 9E3911442848EEB90073DD9A /* UserPreferencesStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorage.swift; sourceTree = ""; }; 9E3911472848EEB90073DD9A /* WalletStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStorage.swift; sourceTree = ""; }; 9E486DE429B637AF003E6945 /* ImportBirthdayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportBirthdayView.swift; sourceTree = ""; }; @@ -661,8 +485,6 @@ 9E486DF229B9EEC4003E6945 /* UIResponder+Current.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIResponder+Current.swift"; sourceTree = ""; }; 9E486DF829BA09C2003E6945 /* UIKit+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIKit+Extensions.swift"; sourceTree = ""; }; 9E4AA4F729BF76BB00752BB3 /* About.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = About.swift; sourceTree = ""; }; - 9E4DC6E127C4C6B700E657F4 /* SecantButtonStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecantButtonStyles.swift; sourceTree = ""; }; - 9E5BF63B2818305D00BA3F17 /* TransactionState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionState.swift; sourceTree = ""; }; 9E5BF63E2819542C00BA3F17 /* WalletEventsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletEventsTests.swift; sourceTree = ""; }; 9E5BF640281FD7B600BA3F17 /* TransactionFailedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionFailedView.swift; sourceTree = ""; }; 9E5BF643281FEC9900BA3F17 /* SendTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendTests.swift; sourceTree = ""; }; @@ -689,9 +511,6 @@ 9E7CB61F2874143800A02233 /* AddressDetailsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressDetailsStore.swift; sourceTree = ""; }; 9E7CB6232874246800A02233 /* ProfileTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileTests.swift; sourceTree = ""; }; 9E7CB6262874269F00A02233 /* ProfileSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileSnapshotTests.swift; sourceTree = ""; }; - 9E7FE0D4282D281800C374E8 /* Array+Chunked.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Chunked.swift"; sourceTree = ""; }; - 9E7FE0D6282D286500C374E8 /* RecoveryPhrase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhrase.swift; sourceTree = ""; }; - 9E7FE0DC282D298900C374E8 /* ValidationWord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValidationWord.swift; sourceTree = ""; }; 9E7FE0DE282D2DD600C374E8 /* ZcashBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZcashBadge.swift; sourceTree = ""; }; 9E7FE0E5282E7B1100C374E8 /* StoredWallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoredWallet.swift; sourceTree = ""; }; 9E7FE0F528327F6F00C374E8 /* ScanUIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanUIView.swift; sourceTree = ""; }; @@ -699,6 +518,8 @@ 9E852D5B29AF8EB200CF4AC1 /* RecoveryPhraseValidationFlowFeatureFlagTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseValidationFlowFeatureFlagTests.swift; sourceTree = ""; }; 9E852D6029B098F400CF4AC1 /* RootDebug.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootDebug.swift; sourceTree = ""; }; 9E852D6429B0A86300CF4AC1 /* DebugTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugTests.swift; sourceTree = ""; }; + 9E9074FE2A260FE400269308 /* WalletEvent+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WalletEvent+View.swift"; sourceTree = ""; }; + 9E90751D2A269BE300269308 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9E92AF0728530EBF007367AD /* View+UIImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+UIImage.swift"; sourceTree = ""; }; 9E94C61F28AA7DEE008256E9 /* BalanceBreakdownTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BalanceBreakdownTests.swift; sourceTree = ""; }; 9E94C62228AA7EE0008256E9 /* BalanceBreakdownSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BalanceBreakdownSnapshotTests.swift; sourceTree = ""; }; @@ -713,27 +534,17 @@ 9E9ECC9428589E150099D5A2 /* ImportWalletSnapshotTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportWalletSnapshotTests.swift; sourceTree = ""; }; 9E9ECC9628589E150099D5A2 /* OnboardingSnapshotTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingSnapshotTests.swift; sourceTree = ""; }; 9EAB4675285B5C7C002904A0 /* DeeplinkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeeplinkTests.swift; sourceTree = ""; }; - 9EAB46772860A1D2002904A0 /* WalletEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletEvent.swift; sourceTree = ""; }; 9EAB46792861EA6A002904A0 /* TransactionRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionRowView.swift; sourceTree = ""; }; 9EAFEB812805793200199FC9 /* RootTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootTests.swift; sourceTree = ""; }; - 9EAFEB83280597B700199FC9 /* SecItemInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecItemInterface.swift; sourceTree = ""; }; 9EAFEB852805A23100199FC9 /* SecItemClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecItemClientTests.swift; sourceTree = ""; }; - 9EAFEB872806E5AE00199FC9 /* SDKSynchronizerInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKSynchronizerInterface.swift; sourceTree = ""; }; 9EAFEB8D2808183D00199FC9 /* SandboxView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SandboxView.swift; sourceTree = ""; }; 9EAFEB8E2808183D00199FC9 /* SandboxStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SandboxStore.swift; sourceTree = ""; }; 9EB7D14A2A20C6BC00F35E03 /* modules */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = modules; sourceTree = ""; }; 9EB863972923935B003D0F8B /* WalletStorageTestKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStorageTestKey.swift; sourceTree = ""; }; 9EB863982923935B003D0F8B /* WalletStorageInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStorageInterface.swift; sourceTree = ""; }; 9EB863992923935B003D0F8B /* WalletStorageLiveKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStorageLiveKey.swift; sourceTree = ""; }; - 9EB863A429239DCB003D0F8B /* RecoveryPhraseRandomizerTestKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseRandomizerTestKey.swift; sourceTree = ""; }; - 9EB863A529239DCB003D0F8B /* RecoveryPhraseRandomizerLiveKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseRandomizerLiveKey.swift; sourceTree = ""; }; - 9EB863A629239DCB003D0F8B /* RecoveryPhraseRandomizerInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseRandomizerInterface.swift; sourceTree = ""; }; - 9EB863BE2923C72C003D0F8B /* SecItemLive.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecItemLive.swift; sourceTree = ""; }; 9EB863C62923C93B003D0F8B /* UserPreferencesStorageLive.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorageLive.swift; sourceTree = ""; }; 9EB863C82923C953003D0F8B /* UserPreferencesStorageMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorageMocks.swift; sourceTree = ""; }; - 9EB863CA2923CA20003D0F8B /* SDKSynchronizerLive.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKSynchronizerLive.swift; sourceTree = ""; }; - 9EB863CC2923CA28003D0F8B /* SDKSynchronizerTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKSynchronizerTest.swift; sourceTree = ""; }; - 9EBEF87927CE369800B4F343 /* RecoveryPhraseValidationFlowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseValidationFlowView.swift; sourceTree = ""; }; 9EDDEA9F2829610D00B4100C /* CurrencySelectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrencySelectionTests.swift; sourceTree = ""; }; 9EDDEAA02829610D00B4100C /* TransactionAmountInputTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionAmountInputTests.swift; sourceTree = ""; }; 9EDDEAA12829610D00B4100C /* TransactionAddressInputTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionAddressInputTests.swift; sourceTree = ""; }; @@ -741,7 +552,6 @@ 9EF8135B27ECC25E0075AF48 /* UserPreferencesStorageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorageTests.swift; sourceTree = ""; }; 9EF8135F27F043CC0075AF48 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 9EF8139B27F47AED0075AF48 /* InitializationState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InitializationState.swift; sourceTree = ""; }; - F9322DBF273B555C00C105B5 /* NavigationLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationLinks.swift; sourceTree = ""; }; F93673D52742CB840099C6AF /* Previews.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Previews.swift; sourceTree = ""; }; F93874ED273C4DE200F0E875 /* HomeStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeStore.swift; sourceTree = ""; }; F93874EF273C4DE200F0E875 /* HomeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; @@ -779,14 +589,21 @@ 9E80C4622A25E9AC0049E6A7 /* LocalAuthenticationClient in Frameworks */, 9E80C4542A25E8FA0049E6A7 /* NumberFormatterClient in Frameworks */, 9E80C4562A25E8FA0049E6A7 /* PasteboardClient in Frameworks */, + 9E9075142A2691B700269308 /* ZcashSDKEnvironment in Frameworks */, 9E0310C52A24A4E60021F995 /* FileManager in Frameworks */, + 9E90750E2A26919B00269308 /* ReviewRequestClient in Frameworks */, 9E0310C12A24A4D40021F995 /* DeeplinkClient in Frameworks */, 0D26AF75299E8196005260EE /* MnemonicSwift in Frameworks */, + 9E90751C2A2691E200269308 /* SDKSynchronizerClient in Frameworks */, 9E0310C32A24A4D40021F995 /* DerivationToolClient in Frameworks */, 9E80C4582A25E9690049E6A7 /* DiskSpaceCheckerClient in Frameworks */, 0D26AF76299E8196005260EE /* ComposableArchitecture in Frameworks */, 9E0310B72A24A4D40021F995 /* AppVersionClient in Frameworks */, + 9E9075062A2689D600269308 /* RecoveryPhraseValidationFlow in Frameworks */, + 9E90750C2A268CDC00269308 /* SecItem in Frameworks */, 9E0310B92A24A4D40021F995 /* AudioServicesClient in Frameworks */, + 9E9075042A2681FF00269308 /* Generated in Frameworks */, + 9E9075162A2691C600269308 /* SupportDataGeneratorClient in Frameworks */, 9E80C45A2A25E96D0049E6A7 /* FeedbackGeneratorClient in Frameworks */, 9E80C4522A25E8FA0049E6A7 /* MnemonicClient in Frameworks */, 9E0310BB2A24A4D40021F995 /* CaptureDeviceClient in Frameworks */, @@ -808,14 +625,21 @@ 9E80C4602A25E9A70049E6A7 /* LocalAuthenticationClient in Frameworks */, 0D26103A298C3DCD00CC9DE9 /* FirebaseCrashlytics in Frameworks */, 9E88FBA22A20D35800DAA500 /* AppVersionClient in Frameworks */, + 9E9075122A2691B200269308 /* ZcashSDKEnvironment in Frameworks */, 9E0310B52A24A4CA0021F995 /* FileManager in Frameworks */, + 9E9075102A2691A000269308 /* ReviewRequestClient in Frameworks */, 9E2AC0FF27D8EC120042AA47 /* MnemonicSwift in Frameworks */, 9E88FBAA2A24A0E000DAA500 /* DerivationToolClient in Frameworks */, + 9E90751A2A2691D900269308 /* SDKSynchronizerClient in Frameworks */, 9E80C44C2A25E8EC0049E6A7 /* MnemonicClient in Frameworks */, 9E80C45C2A25E9720049E6A7 /* DiskSpaceCheckerClient in Frameworks */, 9E88FBA82A2481DB00DAA500 /* DatabaseFilesClient in Frameworks */, 6654C73A2715A38000901167 /* ComposableArchitecture in Frameworks */, + 9E9075082A2689DB00269308 /* RecoveryPhraseValidationFlow in Frameworks */, + 9E90750A2A268CD700269308 /* SecItem in Frameworks */, 9EAB466D285A0468002904A0 /* Parsing in Frameworks */, + 9E9075022A2681F700269308 /* Generated in Frameworks */, + 9E9075182A2691CB00269308 /* SupportDataGeneratorClient in Frameworks */, 9E80C45E2A25E9760049E6A7 /* FeedbackGeneratorClient in Frameworks */, 9E88FBA42A247F6900DAA500 /* AudioServicesClient in Frameworks */, 9E88FBA62A24804900DAA500 /* CaptureDeviceClient in Frameworks */, @@ -858,26 +682,6 @@ path = Shapes; sourceTree = ""; }; - 0D2ACE7E26C2C65E00D62E3C /* Fonts */ = { - isa = PBXGroup; - children = ( - 0DACFA8227209F930039EEA5 /* Roboto */, - 0D535FDB271F3B50009A9E3E /* Rubik */, - 0D2ACE7F26C2C67100D62E3C /* Zboto.otf */, - ); - path = Fonts; - sourceTree = ""; - }; - 0D3D04062728B2EC0032ABC1 /* Views */ = { - isa = PBXGroup; - children = ( - 0DFE93E0272C9ECB000FCCA5 /* RecoveryPhraseBackupView.swift */, - 0DC487C22772574C00BE6A63 /* RecoveryPhraseBackupSucceededView.swift */, - 0DDB6A5027737D4A0012A410 /* RecoveryPhraseBackupFailedView.swift */, - ); - path = Views; - sourceTree = ""; - }; 0D4E79FC26B364170058B01E = { isa = PBXGroup; children = ( @@ -965,27 +769,6 @@ path = secantUITests; sourceTree = ""; }; - 0D535FDB271F3B50009A9E3E /* Rubik */ = { - isa = PBXGroup; - children = ( - 0D535FDC271F4214009A9E3E /* Rubik-Italic-VariableFont_wght.ttf */, - 0D535FDD271F4214009A9E3E /* Rubik-VariableFont_wght.ttf */, - ); - path = Rubik; - sourceTree = ""; - }; - 0D535FE0271F945C009A9E3E /* Chips */ = { - isa = PBXGroup; - children = ( - 0D8A43C5272B129C005A6414 /* WordChipGrid.swift */, - 0D535FE1271F9476009A9E3E /* EnumeratedChip.swift */, - 0DF2DC50272344E400FA31E2 /* EmptyChip.swift */, - 0D185818272723FF0046B928 /* ColoredChip.swift */, - 0D18581A272728D60046B928 /* PhraseChip.swift */, - ); - path = Chips; - sourceTree = ""; - }; 0D767873298C374F0047E085 /* CrashReporter */ = { isa = PBXGroup; children = ( @@ -996,55 +779,21 @@ path = CrashReporter; sourceTree = ""; }; - 0D8A43C2272AEEA7005A6414 /* FontStyles */ = { - isa = PBXGroup; - children = ( - 0D8A43C3272AEEDE005A6414 /* SecantTextStyles.swift */, - 9E4DC6E127C4C6B700E657F4 /* SecantButtonStyles.swift */, - ); - path = FontStyles; - sourceTree = ""; - }; 0DA13CA326C1960A00E3B610 /* Models */ = { isa = PBXGroup; children = ( 9EF8135F27F043CC0075AF48 /* AppDelegate.swift */, - 0D6D628A276A528D002FB4CC /* DropDelegate.swift */, 9EF8139B27F47AED0075AF48 /* InitializationState.swift */, - 9E7FE0D6282D286500C374E8 /* RecoveryPhrase.swift */, 9E7FE0E5282E7B1100C374E8 /* StoredWallet.swift */, 9E66122B2877188700C75B70 /* SyncStatusSnapshot.swift */, - 9E5BF63B2818305D00BA3F17 /* TransactionState.swift */, - 9E7FE0DC282D298900C374E8 /* ValidationWord.swift */, 34F682E429A75EB60022C079 /* WalletConfig.swift */, - 9EAB46772860A1D2002904A0 /* WalletEvent.swift */, ); path = Models; sourceTree = ""; }; - 0DACFA8227209F930039EEA5 /* Roboto */ = { - isa = PBXGroup; - children = ( - 0DACFA8A27209FA70039EEA5 /* Roboto-Black.ttf */, - 0DACFA8C27209FA70039EEA5 /* Roboto-BlackItalic.ttf */, - 0DACFA8327209FA60039EEA5 /* Roboto-Bold.ttf */, - 0DACFA8727209FA60039EEA5 /* Roboto-BoldItalic.ttf */, - 0DACFA8527209FA60039EEA5 /* Roboto-Italic.ttf */, - 0DACFA8D27209FA70039EEA5 /* Roboto-Light.ttf */, - 0DACFA8427209FA60039EEA5 /* Roboto-LightItalic.ttf */, - 0DACFA8627209FA60039EEA5 /* Roboto-Medium.ttf */, - 0DACFA8B27209FA70039EEA5 /* Roboto-MediumItalic.ttf */, - 0DACFA8827209FA60039EEA5 /* Roboto-Regular.ttf */, - 0DACFA8927209FA60039EEA5 /* Roboto-Thin.ttf */, - 0DACFA8F27209FA70039EEA5 /* Roboto-ThinItalic.ttf */, - ); - path = Roboto; - sourceTree = ""; - }; 0DF2DC5227235E1F00FA31E2 /* Extensions */ = { isa = PBXGroup; children = ( - 0DF2DC5327235E3E00FA31E2 /* View+InnerShadow.swift */, 0DF482B92787ADA800EB37D6 /* ConditionalModifier.swift */, 0D3016B429BF94D1002371B3 /* Button+Disabling.swift */, ); @@ -1115,17 +864,6 @@ path = SendSnapshotTests; sourceTree = ""; }; - 3467319729AE36F000974482 /* SupportDataGenerator */ = { - isa = PBXGroup; - children = ( - 3467319429AE265300974482 /* SupportDataGenerator.swift */, - 3467319829AE374300974482 /* SupportDataGeneratorInterface.swift */, - 3467319B29AE374A00974482 /* SupportDataGeneratorLiveKey.swift */, - 3467319E29AE375000974482 /* SupportDataGeneratorTestKey.swift */, - ); - path = SupportDataGenerator; - sourceTree = ""; - }; 346D41E228DF0B0900963F36 /* CheckCircle */ = { isa = PBXGroup; children = ( @@ -1172,15 +910,6 @@ path = WalletConfigProvider; sourceTree = ""; }; - 663FAB9A271D873300E495F8 /* Buttons */ = { - isa = PBXGroup; - children = ( - 66DC733E271D88CC0053CBB6 /* StandardButtonStyle.swift */, - 663FAB9B271D874D00E495F8 /* ActiveButton.swift */, - ); - path = Buttons; - sourceTree = ""; - }; 6654C73B2715A3F000901167 /* Features */ = { isa = PBXGroup; children = ( @@ -1194,7 +923,6 @@ 6654C73C2715A3FA00901167 /* OnboardingFlow */, F9971A4F27680DD000A2DB75 /* Profile */, 9E7FE0E4282E753700C374E8 /* RecoveryPhraseDisplay */, - 9E7FE0E3282E751A00C374E8 /* RecoveryPhraseValidationFlow */, F9971A4927680DC400A2DB75 /* Root */, 9EAFEB8B2808174900199FC9 /* Sandbox */, F9971A5B27680DF600A2DB75 /* Scan */, @@ -1244,14 +972,6 @@ path = ProgressIndicators; sourceTree = ""; }; - 669FDAE6272C2380007B9422 /* Backgrounds */ = { - isa = PBXGroup; - children = ( - 0D7DF08B271DCC0E00530046 /* ScreenBackground.swift */, - ); - path = Backgrounds; - sourceTree = ""; - }; 9E01F8262833CD84000EFC57 /* ScanTests */ = { isa = PBXGroup; children = ( @@ -1276,31 +996,10 @@ children = ( 9E0F5740297E7F1C005304FA /* TCALogging.swift */, 9E0F5742297EB96C005304FA /* TCALoggerReducer.swift */, - 9E0F5746297EE5F3005304FA /* WalletLogger.swift */, ); path = Logging; sourceTree = ""; }; - 9E153A6A292167BF00112F41 /* ZcashSDKEnvironment */ = { - isa = PBXGroup; - children = ( - 9E153A6D292167FF00112F41 /* ZcashSDKEnvironmentInterface.swift */, - 9E153A6B292167FF00112F41 /* ZcashSDKEnvironmentLiveKey.swift */, - 9E153A6C292167FF00112F41 /* ZcashSDKEnvironmentTestKey.swift */, - ); - path = ZcashSDKEnvironment; - sourceTree = ""; - }; - 9E153A7129216EBD00112F41 /* UserDefaults */ = { - isa = PBXGroup; - children = ( - 9E153A7329216EFB00112F41 /* UserDefaultsInterface.swift */, - 9E153A7229216EFB00112F41 /* UserDefaultsLiveKey.swift */, - 9E153A7429216EFB00112F41 /* UserDefaultsTestKey.swift */, - ); - path = UserDefaults; - sourceTree = ""; - }; 9E207C342966EC60003E2C9B /* AddressDetailsSnapshotTests */ = { isa = PBXGroup; children = ( @@ -1317,16 +1016,6 @@ path = AddressDetailsTests; sourceTree = ""; }; - 9E2A07B329DAE07E00F2B086 /* ReviewRequest */ = { - isa = PBXGroup; - children = ( - 9E2A07B629DAE0A900F2B086 /* ReviewRequestInterface.swift */, - 9E2A07B529DAE0A900F2B086 /* ReviewRequestLiveKey.swift */, - 9E2A07B429DAE0A900F2B086 /* ReviewRequestTestKey.swift */, - ); - path = ReviewRequest; - sourceTree = ""; - }; 9E2DF99727CF704D00649636 /* ImportWallet */ = { isa = PBXGroup; children = ( @@ -1556,48 +1245,29 @@ 9E7FE0B6282D1D9800C374E8 /* Resources */ = { isa = PBXGroup; children = ( + 9E90751D2A269BE300269308 /* Assets.xcassets */, 9E6612342878341F00C75B70 /* Lotties */, - 0D4E7A0C26B364180058B01E /* Assets.xcassets */, 0D3B01EB298DAF89007EBCDA /* GoogleService-Info.plist */, - 660558E8270C7A54009D6954 /* Colors.xcassets */, - 9E37A2B727C8F59F00AE57B3 /* Localizable.strings */, - 0D2ACE7E26C2C65E00D62E3C /* Fonts */, - 9E7FE0B7282D1D9800C374E8 /* Generated */, ); path = Resources; sourceTree = ""; }; - 9E7FE0B7282D1D9800C374E8 /* Generated */ = { - isa = PBXGroup; - children = ( - 660558F5270C862F009D6954 /* Fonts+Generated.swift */, - 34C4328F29B62D8D00F74045 /* L10n.swift */, - 660558F6270C862F009D6954 /* XCAssets+Generated.swift */, - ); - path = Generated; - sourceTree = ""; - }; 9E7FE0BB282D1DC200C374E8 /* Utils */ = { isa = PBXGroup; children = ( 9E9CEA3C29D47BD100599DF5 /* Reducers */, - 9E7FE0D4282D281800C374E8 /* Array+Chunked.swift */, F9C165B3274031F600592F76 /* Bindings.swift */, - 0DACFA7E27208CE00039EEA5 /* Clamped.swift */, 9E6713F9289BE0E100A6796F /* ClearBackgroundView.swift */, 2EDA07A327EDE2A900D6F09B /* DebugFrame.swift */, 9E2F1C832809B606004E65FE /* DebugMenu.swift */, 9E486DEF29B9EE84003E6945 /* KeyboardAdaptive.swift */, 9E6612322878338C00C75B70 /* LottieAnimation.swift */, 34BF09082927C98000222134 /* Memo+toString.swift */, - F9322DBF273B555C00C105B5 /* NavigationLinks.swift */, F93673D52742CB840099C6AF /* Previews.swift */, 9E7CB619287310EC00A02233 /* QRCodeGenerator.swift */, - 0D35CC45277A36E00074316A /* ScrollableWhenScaled.swift */, 0DACFA8027208D940039EEA5 /* UInt+SuperscriptText.swift */, 9E486DF829BA09C2003E6945 /* UIKit+Extensions.swift */, 9E486DF229B9EEC4003E6945 /* UIResponder+Current.swift */, - 0D7CE63327349B5D0020E050 /* View+WhenDraggable.swift */, F9EEB8152742C2210032EEB8 /* WithStateBinding.swift */, 9E0F573F297E7F00005304FA /* Logging */, ); @@ -1608,17 +1278,10 @@ isa = PBXGroup; children = ( 0D767873298C374F0047E085 /* CrashReporter */, - 9EB863A329239D95003D0F8B /* RecoveryPhraseRandomizer */, - 9E2A07B329DAE07E00F2B086 /* ReviewRequest */, - 9EB863B62923C539003D0F8B /* SDKSynchronizer */, - 9EB863B32923C465003D0F8B /* SecItem */, - 3467319729AE36F000974482 /* SupportDataGenerator */, 9E0310C62A24BB230021F995 /* URIParser */, - 9E153A7129216EBD00112F41 /* UserDefaults */, 9EB863B72923C55A003D0F8B /* UserPreferencesStorage */, 34F682EA29A763F00022C079 /* WalletConfigProvider */, 9EB86396292392F6003D0F8B /* WalletStorage */, - 9E153A6A292167BF00112F41 /* ZcashSDKEnvironment */, ); path = Dependencies; sourceTree = ""; @@ -1634,26 +1297,12 @@ 9E2F1C8D280EDDEF004E65FE /* Drawer */, 2E35F99027B28E6800EB79CD /* TextFields */, 0D0781C5278776B90083ACD7 /* Shapes */, - 0D8A43C2272AEEA7005A6414 /* FontStyles */, - 0D535FE0271F945C009A9E3E /* Chips */, - 663FAB9A271D873300E495F8 /* Buttons */, 669FDAE5272C2371007B9422 /* ProgressIndicators */, - 669FDAE6272C2380007B9422 /* Backgrounds */, 9E7FE0EA282E7D1A00C374E8 /* ZcashBadge */, ); path = "UI Components"; sourceTree = ""; }; - 9E7FE0E3282E751A00C374E8 /* RecoveryPhraseValidationFlow */ = { - isa = PBXGroup; - children = ( - 0DFE93E2272CA1AA000FCCA5 /* RecoveryPhraseValidationFlowStore.swift */, - 9EBEF87927CE369800B4F343 /* RecoveryPhraseValidationFlowView.swift */, - 0D3D04062728B2EC0032ABC1 /* Views */, - ); - path = RecoveryPhraseValidationFlow; - sourceTree = ""; - }; 9E7FE0E4282E753700C374E8 /* RecoveryPhraseDisplay */ = { isa = PBXGroup; children = ( @@ -1817,36 +1466,6 @@ path = WalletStorage; sourceTree = ""; }; - 9EB863A329239D95003D0F8B /* RecoveryPhraseRandomizer */ = { - isa = PBXGroup; - children = ( - 9E3911422848EEB90073DD9A /* RecoveryPhraseRandomizer.swift */, - 9EB863A629239DCB003D0F8B /* RecoveryPhraseRandomizerInterface.swift */, - 9EB863A529239DCB003D0F8B /* RecoveryPhraseRandomizerLiveKey.swift */, - 9EB863A429239DCB003D0F8B /* RecoveryPhraseRandomizerTestKey.swift */, - ); - path = RecoveryPhraseRandomizer; - sourceTree = ""; - }; - 9EB863B32923C465003D0F8B /* SecItem */ = { - isa = PBXGroup; - children = ( - 9EAFEB83280597B700199FC9 /* SecItemInterface.swift */, - 9EB863BE2923C72C003D0F8B /* SecItemLive.swift */, - ); - path = SecItem; - sourceTree = ""; - }; - 9EB863B62923C539003D0F8B /* SDKSynchronizer */ = { - isa = PBXGroup; - children = ( - 9EAFEB872806E5AE00199FC9 /* SDKSynchronizerInterface.swift */, - 9EB863CA2923CA20003D0F8B /* SDKSynchronizerLive.swift */, - 9EB863CC2923CA28003D0F8B /* SDKSynchronizerTest.swift */, - ); - path = SDKSynchronizer; - sourceTree = ""; - }; 9EB863B72923C55A003D0F8B /* UserPreferencesStorage */ = { isa = PBXGroup; children = ( @@ -1896,6 +1515,7 @@ children = ( F96B41E5273B501F0021B49A /* TransactionDetailView.swift */, 9EAB46792861EA6A002904A0 /* TransactionRowView.swift */, + 9E9074FE2A260FE400269308 /* WalletEvent+View.swift */, ); path = Views; sourceTree = ""; @@ -2006,6 +1626,13 @@ 9E80C4572A25E9690049E6A7 /* DiskSpaceCheckerClient */, 9E80C4592A25E96D0049E6A7 /* FeedbackGeneratorClient */, 9E80C4612A25E9AC0049E6A7 /* LocalAuthenticationClient */, + 9E9075032A2681FF00269308 /* Generated */, + 9E9075052A2689D600269308 /* RecoveryPhraseValidationFlow */, + 9E90750B2A268CDC00269308 /* SecItem */, + 9E90750D2A26919B00269308 /* ReviewRequestClient */, + 9E9075132A2691B700269308 /* ZcashSDKEnvironment */, + 9E9075152A2691C600269308 /* SupportDataGeneratorClient */, + 9E90751B2A2691E200269308 /* SDKSynchronizerClient */, ); productName = secant; productReference = 0D26AF94299E8196005260EE /* secant-mainnet.app */; @@ -2051,6 +1678,13 @@ 9E80C45B2A25E9720049E6A7 /* DiskSpaceCheckerClient */, 9E80C45D2A25E9760049E6A7 /* FeedbackGeneratorClient */, 9E80C45F2A25E9A70049E6A7 /* LocalAuthenticationClient */, + 9E9075012A2681F700269308 /* Generated */, + 9E9075072A2689DB00269308 /* RecoveryPhraseValidationFlow */, + 9E9075092A268CD700269308 /* SecItem */, + 9E90750F2A2691A000269308 /* ReviewRequestClient */, + 9E9075112A2691B200269308 /* ZcashSDKEnvironment */, + 9E9075172A2691CB00269308 /* SupportDataGeneratorClient */, + 9E9075192A2691D900269308 /* SDKSynchronizerClient */, ); productName = secant; productReference = 0D4E7A0526B364170058B01E /* secant-testnet.app */; @@ -2151,29 +1785,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0D26AF79299E8196005260EE /* Roboto-Medium.ttf in Resources */, 0D26AF7A299E8196005260EE /* sendingTransaction.json in Resources */, - 0D26AF7B299E8196005260EE /* Roboto-MediumItalic.ttf in Resources */, - 0D26AF7C299E8196005260EE /* Roboto-BoldItalic.ttf in Resources */, - 0D7E5D71299FBCDF00BE9569 /* Assets.xcassets in Resources */, 0D26AF7D299E8196005260EE /* endlessCircleProgress.json in Resources */, - 0D26AF7E299E8196005260EE /* Roboto-Bold.ttf in Resources */, - 0D26AF7F299E8196005260EE /* Roboto-Italic.ttf in Resources */, - 0D26AF80299E8196005260EE /* Rubik-Italic-VariableFont_wght.ttf in Resources */, - 0D26AF81299E8196005260EE /* Roboto-LightItalic.ttf in Resources */, - 0D26AF82299E8196005260EE /* Roboto-BlackItalic.ttf in Resources */, - 0D26AF83299E8196005260EE /* Roboto-Regular.ttf in Resources */, 0D26AF84299E8196005260EE /* Preview Assets.xcassets in Resources */, - 0D26AF85299E8196005260EE /* Colors.xcassets in Resources */, - 0D26AF86299E8196005260EE /* Rubik-VariableFont_wght.ttf in Resources */, - 0D26AF87299E8196005260EE /* Roboto-Light.ttf in Resources */, 0D26AF88299E8196005260EE /* LaunchScreen.storyboard in Resources */, - 0D26AF8A299E8196005260EE /* Roboto-Black.ttf in Resources */, - 0D26AF8B299E8196005260EE /* Roboto-ThinItalic.ttf in Resources */, + 9E90751F2A269BE300269308 /* Assets.xcassets in Resources */, 0D26AF8C299E8196005260EE /* GoogleService-Info.plist in Resources */, - 0D26AF8D299E8196005260EE /* Localizable.strings in Resources */, - 0D26AF8E299E8196005260EE /* Roboto-Thin.ttf in Resources */, - 0D26AF8F299E8196005260EE /* Zboto.otf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2181,29 +1798,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0DACFA9327209FA70039EEA5 /* Roboto-Medium.ttf in Resources */, 34DA414928E439CD00F8CC61 /* sendingTransaction.json in Resources */, - 0DACFA9827209FA70039EEA5 /* Roboto-MediumItalic.ttf in Resources */, - 0DACFA9427209FA70039EEA5 /* Roboto-BoldItalic.ttf in Resources */, 9E6612362878345000C75B70 /* endlessCircleProgress.json in Resources */, - 0DACFA9027209FA70039EEA5 /* Roboto-Bold.ttf in Resources */, - 0DACFA9227209FA70039EEA5 /* Roboto-Italic.ttf in Resources */, - 0D535FDE271F4214009A9E3E /* Rubik-Italic-VariableFont_wght.ttf in Resources */, - 0DACFA9127209FA70039EEA5 /* Roboto-LightItalic.ttf in Resources */, - 0DACFA9927209FA70039EEA5 /* Roboto-BlackItalic.ttf in Resources */, - 0DACFA9527209FA70039EEA5 /* Roboto-Regular.ttf in Resources */, 0D4E7A1026B364180058B01E /* Preview Assets.xcassets in Resources */, - 660558E9270C7A54009D6954 /* Colors.xcassets in Resources */, - 0D535FDF271F4214009A9E3E /* Rubik-VariableFont_wght.ttf in Resources */, - 0DACFA9A27209FA70039EEA5 /* Roboto-Light.ttf in Resources */, 9E2F1C8C280ED6A7004E65FE /* LaunchScreen.storyboard in Resources */, - 0D4E7A0D26B364180058B01E /* Assets.xcassets in Resources */, - 0DACFA9727209FA70039EEA5 /* Roboto-Black.ttf in Resources */, - 0DACFA9C27209FA70039EEA5 /* Roboto-ThinItalic.ttf in Resources */, + 9E90751E2A269BE300269308 /* Assets.xcassets in Resources */, 0D3B01EC298DAF89007EBCDA /* GoogleService-Info.plist in Resources */, - 9E37A2B827C8F59F00AE57B3 /* Localizable.strings in Resources */, - 0DACFA9627209FA70039EEA5 /* Roboto-Thin.ttf in Resources */, - 0D2ACE8026C2C67100D62E3C /* Zboto.otf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2403,16 +2003,11 @@ 0D26AE9C299E8196005260EE /* ZcashBadge.swift in Sources */, 34F682F329A764120022C079 /* WalletConfigProviderLiveKey.swift in Sources */, 0D26AE9D299E8196005260EE /* CrashReporterTestKey.swift in Sources */, - 0D26AE9F299E8196005260EE /* XCAssets+Generated.swift in Sources */, 0D26AEA0299E8196005260EE /* SandboxStore.swift in Sources */, - 0D26AEA1299E8196005260EE /* RecoveryPhraseRandomizerInterface.swift in Sources */, - 0D26AEA2299E8196005260EE /* ScrollableWhenScaled.swift in Sources */, 0D26AEA3299E8196005260EE /* UserPreferencesStorage.swift in Sources */, 0D26AEA5299E8196005260EE /* TransactionSendingView.swift in Sources */, 0D26AEA6299E8196005260EE /* WalletEventsFlowView.swift in Sources */, - 3467319A29AE374300974482 /* SupportDataGeneratorInterface.swift in Sources */, 0D26AEAA299E8196005260EE /* CrashReporterLiveKey.swift in Sources */, - 0D26AEAB299E8196005260EE /* RecoveryPhraseRandomizerLiveKey.swift in Sources */, 0D26AEAC299E8196005260EE /* TCATextField.swift in Sources */, 34F682F029A7640A0022C079 /* WalletConfigProviderInterface.swift in Sources */, 0D26AEAF299E8196005260EE /* TransactionAmountTextFieldStore.swift in Sources */, @@ -2422,78 +2017,50 @@ 0D26AEB4299E8196005260EE /* Wedge.swift in Sources */, 0D26AEB5299E8196005260EE /* TransactionDetailView.swift in Sources */, 0D26AEBA299E8196005260EE /* AddressDetailsStore.swift in Sources */, - 0D26AEBB299E8196005260EE /* RecoveryPhraseBackupSucceededView.swift in Sources */, 0D26AEBC299E8196005260EE /* TCATextFieldStore.swift in Sources */, - 0D26AEBE299E8196005260EE /* SecantTextStyles.swift in Sources */, 0D26AEBF299E8196005260EE /* TransactionFailedView.swift in Sources */, - 0D26AEC1299E8196005260EE /* Clamped.swift in Sources */, 0D26AEC2299E8196005260EE /* TransactionRowView.swift in Sources */, 0D26AEC4299E8196005260EE /* TCALogging.swift in Sources */, - 0D26AEC5299E8196005260EE /* RecoveryPhraseValidationFlowStore.swift in Sources */, 9E80C4672A25EAFB0049E6A7 /* URIParser.swift in Sources */, 9E486DFA29BA09C2003E6945 /* UIKit+Extensions.swift in Sources */, 9E80C46A2A25EAFB0049E6A7 /* URIParserInterface.swift in Sources */, 9E33ECDA29D5E30700708DE4 /* OnChangeReducer.swift in Sources */, 0D26AEC6299E8196005260EE /* ImportWalletView.swift in Sources */, 0D26AEC7299E8196005260EE /* RootInitialization.swift in Sources */, - 9E74CCCC29DC04ED003D6E32 /* ReviewRequestLiveKey.swift in Sources */, - 0D26AECA299E8196005260EE /* EnumeratedChip.swift in Sources */, 0D26AECC299E8196005260EE /* OnboardingFlowStore.swift in Sources */, - 0D26AECD299E8196005260EE /* SDKSynchronizerLive.swift in Sources */, 0D26AECF299E8196005260EE /* CurrencySelectionStore.swift in Sources */, - 0D26AED0299E8196005260EE /* UserDefaultsTestKey.swift in Sources */, - 0D26AED1299E8196005260EE /* RecoveryPhraseValidationFlowView.swift in Sources */, 0D26AED2299E8196005260EE /* BalanceBreakdownStore.swift in Sources */, 0D26AED3299E8196005260EE /* SyncStatusSnapshot.swift in Sources */, - 0D26AED4299E8196005260EE /* SecantButtonStyles.swift in Sources */, - 0D26AED5299E8196005260EE /* RecoveryPhraseBackupFailedView.swift in Sources */, - 346731A029AE375000974482 /* SupportDataGeneratorTestKey.swift in Sources */, 0D26AED6299E8196005260EE /* UserPreferencesStorageInterface.swift in Sources */, - 0D26AED8299E8196005260EE /* DropDelegate.swift in Sources */, 0D26AEDA299E8196005260EE /* ImportSeedEditor.swift in Sources */, 0D26AEDB299E8196005260EE /* ProfileStore.swift in Sources */, 9E486DE629B637AF003E6945 /* ImportBirthdayView.swift in Sources */, - 3467319629AE265300974482 /* SupportDataGenerator.swift in Sources */, 0D26AEDC299E8196005260EE /* CheckCircle.swift in Sources */, 9E33ECD929D5E30200708DE4 /* AlertRequest.swift in Sources */, - 0D26AEDE299E8196005260EE /* RecoveryPhraseRandomizer.swift in Sources */, 9E80C4692A25EAFB0049E6A7 /* URIParserLive.swift in Sources */, - 3467319D29AE374A00974482 /* SupportDataGeneratorLiveKey.swift in Sources */, - 0D26AEE0299E8196005260EE /* SecItemLive.swift in Sources */, 0D26AEE4299E8196005260EE /* CurrencySelectionView.swift in Sources */, - 0D26AEE5299E8196005260EE /* RecoveryPhraseRandomizerTestKey.swift in Sources */, 0D26AEE7299E8196005260EE /* TransactionAddressTextFieldStore.swift in Sources */, 34C5658629B60C8B002F3A7C /* ExportLogsStore.swift in Sources */, 0D26AEE9299E8196005260EE /* WithStateBinding.swift in Sources */, 0D26AEEB299E8196005260EE /* Previews.swift in Sources */, - 0D26AEED299E8196005260EE /* PhraseChip.swift in Sources */, - 9E74CCCD29DC04ED003D6E32 /* ReviewRequestTestKey.swift in Sources */, 0D26AEEE299E8196005260EE /* QRCodeScanView.swift in Sources */, - 0D26AEEF299E8196005260EE /* ZcashSDKEnvironmentTestKey.swift in Sources */, 0D26AEF0299E8196005260EE /* TCALoggerReducer.swift in Sources */, 0D26AEF1299E8196005260EE /* ConditionalModifier.swift in Sources */, - 34C4329129B62D8D00F74045 /* L10n.swift in Sources */, 0D26AEF2299E8196005260EE /* MultipleLineTextField.swift in Sources */, 0D26AEF3299E8196005260EE /* NotEnoughFreeSpaceView.swift in Sources */, - 0D26AEF5299E8196005260EE /* TransactionState.swift in Sources */, - 0D26AEF6299E8196005260EE /* SDKSynchronizerTest.swift in Sources */, 0D26AEF7299E8196005260EE /* Drawer.swift in Sources */, - 0D26AEF9299E8196005260EE /* SDKSynchronizerInterface.swift in Sources */, 0D26AEFA299E8196005260EE /* DesignGuide.swift in Sources */, 0D26AEFC299E8196005260EE /* RootStore.swift in Sources */, - 9E74CCCB29DC04ED003D6E32 /* ReviewRequestInterface.swift in Sources */, 0D26AEFD299E8196005260EE /* HomeView.swift in Sources */, - 0D26AEFE299E8196005260EE /* NavigationLinks.swift in Sources */, 0D26AEFF299E8196005260EE /* SandboxView.swift in Sources */, - 0D26AF00299E8196005260EE /* View+WhenDraggable.swift in Sources */, 34C5658329B60C1C002F3A7C /* UIShareDialog.swift in Sources */, 0D26AF01299E8196005260EE /* RecoveryPhraseDisplayView.swift in Sources */, + 9E9075002A260FE400269308 /* WalletEvent+View.swift in Sources */, 0D3016B629BF94D1002371B3 /* Button+Disabling.swift in Sources */, 9E852D6229B098F400CF4AC1 /* RootDebug.swift in Sources */, 34F682ED29A763FD0022C079 /* WalletConfigProvider.swift in Sources */, 0D26AF05299E8196005260EE /* ScanView.swift in Sources */, 0D26AF07299E8196005260EE /* RootView.swift in Sources */, - 0D26AF09299E8196005260EE /* UserDefaultsLiveKey.swift in Sources */, 0D26AF0A299E8196005260EE /* OnboardingFooterView.swift in Sources */, 0D26AF0E299E8196005260EE /* MultiLineTextFieldStore.swift in Sources */, 0D26AF0F299E8196005260EE /* DebugFrame.swift in Sources */, @@ -2501,42 +2068,29 @@ 0D26AF12299E8196005260EE /* UserPreferencesStorageMocks.swift in Sources */, 0D26AF13299E8196005260EE /* RecoveryPhraseDisplayStore.swift in Sources */, 9E486DF129B9EE84003E6945 /* KeyboardAdaptive.swift in Sources */, - 0D26AF15299E8196005260EE /* RecoveryPhrase.swift in Sources */, 0D573CB629C106E900B97379 /* About.swift in Sources */, - 0D26AF17299E8196005260EE /* Fonts+Generated.swift in Sources */, 0D26AF18299E8196005260EE /* WalletEventsFlowStore.swift in Sources */, 0D26AF19299E8196005260EE /* StoredWallet.swift in Sources */, - 0D26AF1A299E8196005260EE /* UserDefaultsInterface.swift in Sources */, 34F682E629A75EB60022C079 /* WalletConfig.swift in Sources */, 0D26AF1B299E8196005260EE /* HomeStore.swift in Sources */, 0D26AF1E299E8196005260EE /* QRCodeGenerator.swift in Sources */, - 0D26AF1F299E8196005260EE /* Array+Chunked.swift in Sources */, 0D26AF20299E8196005260EE /* UInt+SuperscriptText.swift in Sources */, - 0D26AF21299E8196005260EE /* EmptyChip.swift in Sources */, 0D26AF23299E8196005260EE /* SendFlowStore.swift in Sources */, 0D26AF24299E8196005260EE /* SecantApp.swift in Sources */, 0D26AF26299E8196005260EE /* WalletStorageLiveKey.swift in Sources */, 0D26AF27299E8196005260EE /* WalletStorageInterface.swift in Sources */, - 0D26AF28299E8196005260EE /* StandardButtonStyle.swift in Sources */, - 0D26AF2A299E8196005260EE /* ActiveButton.swift in Sources */, 0D26AF2D299E8196005260EE /* DebugMenu.swift in Sources */, - 0D26AF32299E8196005260EE /* View+InnerShadow.swift in Sources */, - 0D26AF33299E8196005260EE /* ZcashSDKEnvironmentInterface.swift in Sources */, - 0D26AF34299E8196005260EE /* SecItemInterface.swift in Sources */, 34F682F629A7641B0022C079 /* WalletConfigProviderTestKey.swift in Sources */, 0D26AF37299E8196005260EE /* ScanUIView.swift in Sources */, - 0D26AF39299E8196005260EE /* ColoredChip.swift in Sources */, 0D26AF3A299E8196005260EE /* OnboardingContentView.swift in Sources */, 0D26AF3B299E8196005260EE /* CircularProgress.swift in Sources */, 0D26AF3C299E8196005260EE /* OnboardingHeaderView.swift in Sources */, 0D26AF3D299E8196005260EE /* TransactionAddressTextField.swift in Sources */, 0D26AF3E299E8196005260EE /* SingleLineTextField.swift in Sources */, - 0D26AF3F299E8196005260EE /* WordChipGrid.swift in Sources */, 0D26AF40299E8196005260EE /* RootDestination.swift in Sources */, 0D26AF41299E8196005260EE /* OnboardingProgressIndicator.swift in Sources */, 9E33ECD829D5E30200708DE4 /* AlertStates.swift in Sources */, 0D26AF44299E8196005260EE /* Memo+toString.swift in Sources */, - 0D26AF45299E8196005260EE /* ScreenBackground.swift in Sources */, 0D26AF46299E8196005260EE /* CheckCircleStore.swift in Sources */, 0D26AF47299E8196005260EE /* CreateTransactionView.swift in Sources */, 0D26AF4A299E8196005260EE /* Bindings.swift in Sources */, @@ -2549,12 +2103,9 @@ 346731A329AE3A5100974482 /* UIMailDialog.swift in Sources */, 0D26AF55299E8196005260EE /* ProfileView.swift in Sources */, 0D26AF56299E8196005260EE /* ScanStore.swift in Sources */, - 0D26AF58299E8196005260EE /* WalletEvent.swift in Sources */, 0D26AF59299E8196005260EE /* WalletStorage.swift in Sources */, - 0D26AF5A299E8196005260EE /* RecoveryPhraseBackupView.swift in Sources */, 0D26AF5C299E8196005260EE /* WelcomeStore.swift in Sources */, 0D26AF5F299E8196005260EE /* SendFlowView.swift in Sources */, - 0D26AF60299E8196005260EE /* ValidationWord.swift in Sources */, 0D26AF61299E8196005260EE /* WalletStorageTestKey.swift in Sources */, 0D26AF62299E8196005260EE /* WelcomeView.swift in Sources */, 9E33ECD729D5E30200708DE4 /* AlertReducer.swift in Sources */, @@ -2568,8 +2119,6 @@ 0D26AF69299E8196005260EE /* AddressDetailsView.swift in Sources */, 0D26AF6A299E8196005260EE /* ClearBackgroundView.swift in Sources */, 0D26AF6C299E8196005260EE /* TransactionSentView.swift in Sources */, - 0D26AF6D299E8196005260EE /* ZcashSDKEnvironmentLiveKey.swift in Sources */, - 0D26AF6E299E8196005260EE /* WalletLogger.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2582,18 +2131,13 @@ 9E7FE0DF282D2DD600C374E8 /* ZcashBadge.swift in Sources */, 34F682F229A764120022C079 /* WalletConfigProviderLiveKey.swift in Sources */, 0D261040298C406F00CC9DE9 /* CrashReporterTestKey.swift in Sources */, - 660558F8270C862F009D6954 /* XCAssets+Generated.swift in Sources */, 9EAFEB902808183D00199FC9 /* SandboxStore.swift in Sources */, - 9EB863A929239DCB003D0F8B /* RecoveryPhraseRandomizerInterface.swift in Sources */, - 0D35CC46277A36E00074316A /* ScrollableWhenScaled.swift in Sources */, 9E39114A2848EEB90073DD9A /* UserPreferencesStorage.swift in Sources */, 34DA414728E4385800F8CC61 /* TransactionSendingView.swift in Sources */, F96B41E9273B501F0021B49A /* WalletEventsFlowView.swift in Sources */, 9E4AA4F829BF76BB00752BB3 /* About.swift in Sources */, 9E33ECD429D5D99000708DE4 /* AlertRequest.swift in Sources */, - 3467319929AE374300974482 /* SupportDataGeneratorInterface.swift in Sources */, 0D26103E298C3FA600CC9DE9 /* CrashReporterLiveKey.swift in Sources */, - 9EB863A829239DCB003D0F8B /* RecoveryPhraseRandomizerLiveKey.swift in Sources */, 2EDA07A027EDE18C00D6F09B /* TCATextField.swift in Sources */, 34F682EF29A7640A0022C079 /* WalletConfigProviderInterface.swift in Sources */, 2EB7758727FC67FD00269373 /* TransactionAmountTextFieldStore.swift in Sources */, @@ -2603,75 +2147,48 @@ 34E0AF1128DEE5220034CF37 /* Wedge.swift in Sources */, F96B41E8273B501F0021B49A /* TransactionDetailView.swift in Sources */, 9E7CB6202874143800A02233 /* AddressDetailsStore.swift in Sources */, - 0DC487C32772574C00BE6A63 /* RecoveryPhraseBackupSucceededView.swift in Sources */, 2EB1C5E827D77F6100BC43D7 /* TCATextFieldStore.swift in Sources */, - 0D8A43C4272AEEDE005A6414 /* SecantTextStyles.swift in Sources */, 9E5BF641281FD7B600BA3F17 /* TransactionFailedView.swift in Sources */, - 0DACFA7F27208CE00039EEA5 /* Clamped.swift in Sources */, 9EAB467A2861EA6A002904A0 /* TransactionRowView.swift in Sources */, 9E0F5741297E7F1D005304FA /* TCALogging.swift in Sources */, - 0DFE93E3272CA1AA000FCCA5 /* RecoveryPhraseValidationFlowStore.swift in Sources */, 9E9CEA3E29D47BE000599DF5 /* OnChangeReducer.swift in Sources */, 9E486DF929BA09C2003E6945 /* UIKit+Extensions.swift in Sources */, 9E2DF99E27CF704D00649636 /* ImportWalletView.swift in Sources */, 9E9ADA7D2938F4C00071767B /* RootInitialization.swift in Sources */, - 0D535FE2271F9476009A9E3E /* EnumeratedChip.swift in Sources */, - 9E2A07B829DAE0A900F2B086 /* ReviewRequestLiveKey.swift in Sources */, 6654C73E2715A41300901167 /* OnboardingFlowStore.swift in Sources */, - 9EB863CB2923CA20003D0F8B /* SDKSynchronizerLive.swift in Sources */, 2E6CF8DD27D78319004DCD7A /* CurrencySelectionStore.swift in Sources */, - 9E153A7729216EFB00112F41 /* UserDefaultsTestKey.swift in Sources */, 9E33ECD529D5D99700708DE4 /* AlertReducer.swift in Sources */, - 9EBEF87A27CE369800B4F343 /* RecoveryPhraseValidationFlowView.swift in Sources */, 9E6713F7289BC58C00A6796F /* BalanceBreakdownStore.swift in Sources */, 9E66122C2877188700C75B70 /* SyncStatusSnapshot.swift in Sources */, - 9E4DC6E227C4C6B700E657F4 /* SecantButtonStyles.swift in Sources */, - 0DDB6A5127737D4A0012A410 /* RecoveryPhraseBackupFailedView.swift in Sources */, - 3467319F29AE375000974482 /* SupportDataGeneratorTestKey.swift in Sources */, 0D63170029919970007D873F /* UserPreferencesStorageInterface.swift in Sources */, 9E0310CC2A24BB420021F995 /* URIParserInterface.swift in Sources */, - 0D6D628B276A528E002FB4CC /* DropDelegate.swift in Sources */, 9E2DF99D27CF704D00649636 /* ImportSeedEditor.swift in Sources */, F9971A5327680DD000A2DB75 /* ProfileStore.swift in Sources */, 9E486DE529B637AF003E6945 /* ImportBirthdayView.swift in Sources */, - 3467319529AE265300974482 /* SupportDataGenerator.swift in Sources */, 346D41E428DF0B8600963F36 /* CheckCircle.swift in Sources */, - 9EB863AA29239EB2003D0F8B /* RecoveryPhraseRandomizer.swift in Sources */, - 3467319C29AE374A00974482 /* SupportDataGeneratorLiveKey.swift in Sources */, - 9EB863BF2923C72C003D0F8B /* SecItemLive.swift in Sources */, 2E8719CD27FB0D3B0082C926 /* CurrencySelectionView.swift in Sources */, - 9EB863A729239DCB003D0F8B /* RecoveryPhraseRandomizerTestKey.swift in Sources */, 9E5BF6502823E94900BA3F17 /* TransactionAddressTextFieldStore.swift in Sources */, 34C5658529B60C8B002F3A7C /* ExportLogsStore.swift in Sources */, F9EEB8162742C2210032EEB8 /* WithStateBinding.swift in Sources */, F93673D62742CB840099C6AF /* Previews.swift in Sources */, - 0D18581B272728D60046B928 /* PhraseChip.swift in Sources */, 9E7FE0F92832824C00C374E8 /* QRCodeScanView.swift in Sources */, - 9E153A6F292167FF00112F41 /* ZcashSDKEnvironmentTestKey.swift in Sources */, 9E0F5743297EB96C005304FA /* TCALoggerReducer.swift in Sources */, 0DF482BA2787ADA800EB37D6 /* ConditionalModifier.swift in Sources */, - 34C4329029B62D8D00F74045 /* L10n.swift in Sources */, 9E7225F3288AB6DD00DF7F17 /* MultipleLineTextField.swift in Sources */, 3448CB3228E47666006ADEDB /* NotEnoughFreeSpaceView.swift in Sources */, - 9E7FE0EC282E7D9400C374E8 /* TransactionState.swift in Sources */, - 9EB863CD2923CA28003D0F8B /* SDKSynchronizerTest.swift in Sources */, 9E2F1C8F280EDE09004E65FE /* Drawer.swift in Sources */, - 9EAFEB882806E5AE00199FC9 /* SDKSynchronizerInterface.swift in Sources */, 0DB8AA81271DC7520035BC9D /* DesignGuide.swift in Sources */, F9971A4D27680DC400A2DB75 /* RootStore.swift in Sources */, - 9E2A07B729DAE0A900F2B086 /* ReviewRequestTestKey.swift in Sources */, 9EAFEB9228081E9400199FC9 /* HomeView.swift in Sources */, - F9322DC0273B555C00C105B5 /* NavigationLinks.swift in Sources */, 9EAFEB8F2808183D00199FC9 /* SandboxView.swift in Sources */, - 0D7CE63427349B5D0020E050 /* View+WhenDraggable.swift in Sources */, 34C5658229B60C1C002F3A7C /* UIShareDialog.swift in Sources */, + 9E9074FF2A260FE400269308 /* WalletEvent+View.swift in Sources */, 0D3D04082728B3440032ABC1 /* RecoveryPhraseDisplayView.swift in Sources */, 0D3016B529BF94D1002371B3 /* Button+Disabling.swift in Sources */, 9E852D6129B098F400CF4AC1 /* RootDebug.swift in Sources */, 34F682EC29A763FD0022C079 /* WalletConfigProvider.swift in Sources */, F9971A5F27680DF600A2DB75 /* ScanView.swift in Sources */, F9971A4E27680DC400A2DB75 /* RootView.swift in Sources */, - 9E153A7529216EFB00112F41 /* UserDefaultsLiveKey.swift in Sources */, 2EA11F5B27467EF800709571 /* OnboardingFooterView.swift in Sources */, 9E7225F6288AC71A00DF7F17 /* MultiLineTextFieldStore.swift in Sources */, 2EDA07A427EDE2A900D6F09B /* DebugFrame.swift in Sources */, @@ -2679,42 +2196,29 @@ 9EB863C92923C953003D0F8B /* UserPreferencesStorageMocks.swift in Sources */, 0D3D040A2728B3A10032ABC1 /* RecoveryPhraseDisplayStore.swift in Sources */, 9E486DF029B9EE84003E6945 /* KeyboardAdaptive.swift in Sources */, - 9E7FE0D7282D286500C374E8 /* RecoveryPhrase.swift in Sources */, 9E0310CD2A24BB420021F995 /* URIParser.swift in Sources */, - 660558F7270C862F009D6954 /* Fonts+Generated.swift in Sources */, F96B41E7273B501F0021B49A /* WalletEventsFlowStore.swift in Sources */, 9E7FE0E6282E7B1100C374E8 /* StoredWallet.swift in Sources */, - 9E153A7629216EFB00112F41 /* UserDefaultsInterface.swift in Sources */, 34F682E529A75EB60022C079 /* WalletConfig.swift in Sources */, 9EAFEB9128081E9400199FC9 /* HomeStore.swift in Sources */, 9E7CB61A287310EC00A02233 /* QRCodeGenerator.swift in Sources */, - 9E7FE0D5282D281800C374E8 /* Array+Chunked.swift in Sources */, 0DACFA8127208D940039EEA5 /* UInt+SuperscriptText.swift in Sources */, - 0DF2DC51272344E400FA31E2 /* EmptyChip.swift in Sources */, F9C165BF2740403600592F76 /* SendFlowStore.swift in Sources */, 0D4E7A0926B364170058B01E /* SecantApp.swift in Sources */, 9EB8639C2923935B003D0F8B /* WalletStorageLiveKey.swift in Sources */, 9EB8639B2923935B003D0F8B /* WalletStorageInterface.swift in Sources */, - 66DC733F271D88CC0053CBB6 /* StandardButtonStyle.swift in Sources */, - 663FAB9C271D874D00E495F8 /* ActiveButton.swift in Sources */, 9E2F1C842809B606004E65FE /* DebugMenu.swift in Sources */, - 0DF2DC5427235E3E00FA31E2 /* View+InnerShadow.swift in Sources */, - 9E153A70292167FF00112F41 /* ZcashSDKEnvironmentInterface.swift in Sources */, - 9EAFEB84280597B700199FC9 /* SecItemInterface.swift in Sources */, 9E0310CE2A24BB420021F995 /* URIParserTest.swift in Sources */, 34F682F529A7641B0022C079 /* WalletConfigProviderTestKey.swift in Sources */, 9E7FE0F628327F6F00C374E8 /* ScanUIView.swift in Sources */, - 0D185819272723FF0046B928 /* ColoredChip.swift in Sources */, 2EA11F5D27467F7700709571 /* OnboardingContentView.swift in Sources */, 9E7CB6152869E8C300A02233 /* CircularProgress.swift in Sources */, 2E58E73B274679F000B2B84B /* OnboardingHeaderView.swift in Sources */, 9E5BF64F2823E94900BA3F17 /* TransactionAddressTextField.swift in Sources */, 2E35F99227B28E7600EB79CD /* SingleLineTextField.swift in Sources */, - 0D8A43C6272B129C005A6414 /* WordChipGrid.swift in Sources */, 9E9ADA7F2938F5EC0071767B /* RootDestination.swift in Sources */, 66A0807B271993C500118B79 /* OnboardingProgressIndicator.swift in Sources */, 34BF09092927C98000222134 /* Memo+toString.swift in Sources */, - 0D7DF08C271DCC0E00530046 /* ScreenBackground.swift in Sources */, 346715A528E2027D0035F7C4 /* CheckCircleStore.swift in Sources */, F9C165C22740403600592F76 /* CreateTransactionView.swift in Sources */, F9C165B4274031F600592F76 /* Bindings.swift in Sources */, @@ -2724,16 +2228,12 @@ F9971A6627680DFE00A2DB75 /* SettingsView.swift in Sources */, 2EDA07A227EDE1AE00D6F09B /* TextFieldFooter.swift in Sources */, 0D26103C298C3E4800CC9DE9 /* CrashReporterInterface.swift in Sources */, - 9E2A07B929DAE0A900F2B086 /* ReviewRequestInterface.swift in Sources */, 346731A229AE3A5100974482 /* UIMailDialog.swift in Sources */, F9971A5427680DD000A2DB75 /* ProfileView.swift in Sources */, F9971A6027680DF600A2DB75 /* ScanStore.swift in Sources */, - 9EAB46782860A1D2002904A0 /* WalletEvent.swift in Sources */, 9EB8639D29239405003D0F8B /* WalletStorage.swift in Sources */, - 0DFE93E1272C9ECB000FCCA5 /* RecoveryPhraseBackupView.swift in Sources */, 9E69A24D27FB002800A55317 /* WelcomeStore.swift in Sources */, F9C165CB2741AB5D00592F76 /* SendFlowView.swift in Sources */, - 9E7FE0DD282D298900C374E8 /* ValidationWord.swift in Sources */, 9EB8639A2923935B003D0F8B /* WalletStorageTestKey.swift in Sources */, 0D0781C4278750E30083ACD7 /* WelcomeView.swift in Sources */, F9971A6527680DFE00A2DB75 /* SettingsStore.swift in Sources */, @@ -2746,8 +2246,6 @@ 9E7CB6212874143800A02233 /* AddressDetailsView.swift in Sources */, 9E6713FA289BE0E100A6796F /* ClearBackgroundView.swift in Sources */, F9C165C42740403600592F76 /* TransactionSentView.swift in Sources */, - 9E153A6E292167FF00112F41 /* ZcashSDKEnvironmentLiveKey.swift in Sources */, - 9E0F5747297EE5F3005304FA /* WalletLogger.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3507,6 +3005,62 @@ isa = XCSwiftPackageProductDependency; productName = DeeplinkClient; }; + 9E9075012A2681F700269308 /* Generated */ = { + isa = XCSwiftPackageProductDependency; + productName = Generated; + }; + 9E9075032A2681FF00269308 /* Generated */ = { + isa = XCSwiftPackageProductDependency; + productName = Generated; + }; + 9E9075052A2689D600269308 /* RecoveryPhraseValidationFlow */ = { + isa = XCSwiftPackageProductDependency; + productName = RecoveryPhraseValidationFlow; + }; + 9E9075072A2689DB00269308 /* RecoveryPhraseValidationFlow */ = { + isa = XCSwiftPackageProductDependency; + productName = RecoveryPhraseValidationFlow; + }; + 9E9075092A268CD700269308 /* SecItem */ = { + isa = XCSwiftPackageProductDependency; + productName = SecItem; + }; + 9E90750B2A268CDC00269308 /* SecItem */ = { + isa = XCSwiftPackageProductDependency; + productName = SecItem; + }; + 9E90750D2A26919B00269308 /* ReviewRequestClient */ = { + isa = XCSwiftPackageProductDependency; + productName = ReviewRequestClient; + }; + 9E90750F2A2691A000269308 /* ReviewRequestClient */ = { + isa = XCSwiftPackageProductDependency; + productName = ReviewRequestClient; + }; + 9E9075112A2691B200269308 /* ZcashSDKEnvironment */ = { + isa = XCSwiftPackageProductDependency; + productName = ZcashSDKEnvironment; + }; + 9E9075132A2691B700269308 /* ZcashSDKEnvironment */ = { + isa = XCSwiftPackageProductDependency; + productName = ZcashSDKEnvironment; + }; + 9E9075152A2691C600269308 /* SupportDataGeneratorClient */ = { + isa = XCSwiftPackageProductDependency; + productName = SupportDataGeneratorClient; + }; + 9E9075172A2691CB00269308 /* SupportDataGeneratorClient */ = { + isa = XCSwiftPackageProductDependency; + productName = SupportDataGeneratorClient; + }; + 9E9075192A2691D900269308 /* SDKSynchronizerClient */ = { + isa = XCSwiftPackageProductDependency; + productName = SDKSynchronizerClient; + }; + 9E90751B2A2691E200269308 /* SDKSynchronizerClient */ = { + isa = XCSwiftPackageProductDependency; + productName = SDKSynchronizerClient; + }; 9EAB466C285A0468002904A0 /* Parsing */ = { isa = XCSwiftPackageProductDependency; package = 9EAB466B285A0468002904A0 /* XCRemoteSwiftPackageReference "swift-parsing" */; diff --git a/secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizerInterface.swift b/secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizerInterface.swift deleted file mode 100644 index 07776fa..0000000 --- a/secant/Dependencies/RecoveryPhraseRandomizer/RecoveryPhraseRandomizerInterface.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// RecoveryPhraseRandomizerInterface.swift -// secant-testnet -// -// Created by Lukáš Korba on 15.11.2022. -// - -import ComposableArchitecture - -extension DependencyValues { - var randomRecoveryPhrase: RecoveryPhraseRandomizerClient { - get { self[RecoveryPhraseRandomizerClient.self] } - set { self[RecoveryPhraseRandomizerClient.self] = newValue } - } -} - -struct RecoveryPhraseRandomizerClient { - var random: (RecoveryPhrase) -> RecoveryPhraseValidationFlowReducer.State -} diff --git a/secant/Dependencies/SDKSynchronizer/SDKSynchronizerInterface.swift b/secant/Dependencies/SDKSynchronizer/SDKSynchronizerInterface.swift deleted file mode 100644 index 6701ce5..0000000 --- a/secant/Dependencies/SDKSynchronizer/SDKSynchronizerInterface.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// SDKSynchronizerClient.swift -// secant-testnet -// -// Created by Lukáš Korba on 13.04.2022. -// - -import Foundation -import Combine -import ComposableArchitecture -import ZcashLightClientKit - -extension DependencyValues { - var sdkSynchronizer: SDKSynchronizerClient { - get { self[SDKSynchronizerClient.self] } - set { self[SDKSynchronizerClient.self] = newValue } - } -} - -struct SDKSynchronizerClient { - let stateStream: () -> AnyPublisher - let eventStream: () -> AnyPublisher - let latestState: () -> SynchronizerState - let latestScannedHeight: () -> BlockHeight - - let prepareWith: ([UInt8], UnifiedFullViewingKey, BlockHeight) async throws -> Void - let start: (_ retry: Bool) async throws -> Void - let stop: () -> Void - let isSyncing: () -> Bool - let isInitialized: () -> Bool - - let rewind: (RewindPolicy) -> AnyPublisher - - let getShieldedBalance: () -> WalletBalance? - let getTransparentBalance: () -> WalletBalance? - let getAllTransactions: () async throws -> [WalletEvent] - - let getUnifiedAddress: (_ account: Int) async throws -> UnifiedAddress? - let getTransparentAddress: (_ account: Int) async throws -> TransparentAddress? - let getSaplingAddress: (_ accountIndex: Int) async throws -> SaplingAddress? - - var sendTransaction: (UnifiedSpendingKey, Zatoshi, Recipient, Memo?) async throws -> TransactionState - let shieldFunds: (UnifiedSpendingKey, Memo, Zatoshi) async throws -> TransactionState - - let wipe: () -> AnyPublisher? -} diff --git a/secant/Dependencies/SecItem/SecItemInterface.swift b/secant/Dependencies/SecItem/SecItemInterface.swift deleted file mode 100644 index d3ceef6..0000000 --- a/secant/Dependencies/SecItem/SecItemInterface.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// SecItemClient.swift -// secant-testnet -// -// Created by Lukáš Korba on 12.04.2022. -// - -import Foundation -import Security - -struct SecItemClient { - let copyMatching: (CFDictionary, inout CFTypeRef?) -> OSStatus - let add: (CFDictionary, inout CFTypeRef?) -> OSStatus - let update: (CFDictionary, CFDictionary) -> OSStatus - let delete: (CFDictionary) -> OSStatus -} diff --git a/secant/Dependencies/UserPreferencesStorage/UserPreferencesStorage.swift b/secant/Dependencies/UserPreferencesStorage/UserPreferencesStorage.swift index 7f11cb9..baa339d 100644 --- a/secant/Dependencies/UserPreferencesStorage/UserPreferencesStorage.swift +++ b/secant/Dependencies/UserPreferencesStorage/UserPreferencesStorage.swift @@ -6,6 +6,7 @@ // import Foundation +import UserDefaultsClient /// Live implementation of the `UserPreferences` using User Defaults /// according to https://developer.apple.com/documentation/foundation/userdefaults @@ -103,9 +104,9 @@ struct UserPreferencesStorage { } /// Use carefully: Deletes all user preferences from the User Defaults - func removeAll() async { + func removeAll() { for key in Constants.allCases { - await userDefaults.remove(key.rawValue) + userDefaults.remove(key.rawValue) } } } @@ -116,7 +117,6 @@ private extension UserPreferencesStorage { } func setValue(_ value: Value, forKey: String) async { - await userDefaults.setValue(value, forKey) - _ = await userDefaults.synchronize() + userDefaults.setValue(value, forKey) } } diff --git a/secant/Dependencies/WalletConfigProvider/UserDefaultsWalletConfigStorage.swift b/secant/Dependencies/WalletConfigProvider/UserDefaultsWalletConfigStorage.swift index b493b8a..c5d0ad4 100644 --- a/secant/Dependencies/WalletConfigProvider/UserDefaultsWalletConfigStorage.swift +++ b/secant/Dependencies/WalletConfigProvider/UserDefaultsWalletConfigStorage.swift @@ -6,6 +6,7 @@ // import Foundation +import Utils typealias UserDefaultsWalletConfigProvider = UserDefaultsWalletConfigStorage typealias UserDefaultsWalletConfigProviderCache = UserDefaultsWalletConfigStorage diff --git a/secant/Dependencies/WalletConfigProvider/WalletConfigProvider.swift b/secant/Dependencies/WalletConfigProvider/WalletConfigProvider.swift index a216a9f..4782b7a 100644 --- a/secant/Dependencies/WalletConfigProvider/WalletConfigProvider.swift +++ b/secant/Dependencies/WalletConfigProvider/WalletConfigProvider.swift @@ -7,6 +7,7 @@ import Foundation import Combine +import Utils struct WalletConfigProvider { /// Objects that fetches flags configuration from some source. It can be fetched from user defaults or some backend API for example. It depends diff --git a/secant/Dependencies/WalletStorage/WalletStorage.swift b/secant/Dependencies/WalletStorage/WalletStorage.swift index 6b8a150..0b5e24c 100644 --- a/secant/Dependencies/WalletStorage/WalletStorage.swift +++ b/secant/Dependencies/WalletStorage/WalletStorage.swift @@ -9,6 +9,7 @@ import Foundation import MnemonicSwift import ZcashLightClientKit import Utils +import SecItem /// Zcash implementation of the keychain that is not universal but designed to deliver functionality needed by the wallet itself. /// All the APIs should be thread safe according to official doc: diff --git a/secant/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentLiveKey.swift b/secant/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentLiveKey.swift deleted file mode 100644 index b50d1e8..0000000 --- a/secant/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentLiveKey.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// ZcashSDKEnvironmentLiveKey.swift -// secant-testnet -// -// Created by Lukáš Korba on 13.11.2022. -// - -import ComposableArchitecture -import ZcashLightClientKit - -extension ZcashSDKEnvironment: DependencyKey { - static let liveValue = Self( - endpoint: LightWalletEndpoint( - address: Self.endpoint(for: TargetConstants.zcashNetwork), - port: ZcashSDKConstants.endpointPort, - secure: true, - streamingCallTimeoutInMillis: ZcashSDKConstants.streamingCallTimeoutInMillis - ), - memoCharLimit: MemoBytes.capacity, - mnemonicWordsMaxCount: ZcashSDKConstants.mnemonicWordsMaxCount, - network: TargetConstants.zcashNetwork, - requiredTransactionConfirmations: ZcashSDKConstants.requiredTransactionConfirmations, - sdkVersion: "0.18.1-beta" - ) -} diff --git a/secant/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentTestKey.swift b/secant/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentTestKey.swift deleted file mode 100644 index ae585ed..0000000 --- a/secant/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentTestKey.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// ZcashSDKEnvironmentTestKey.swift -// secant-testnet -// -// Created by Lukáš Korba on 13.11.2022. -// - -import ComposableArchitecture -import ZcashLightClientKit -import XCTestDynamicOverlay - -extension ZcashSDKEnvironment: TestDependencyKey { - static let testnet = ZcashSDKEnvironment.liveValue - - static let testValue = Self( - endpoint: LightWalletEndpoint( - address: ZcashSDKConstants.endpointTestnetAddress, - port: ZcashSDKConstants.endpointPort, - secure: true, - streamingCallTimeoutInMillis: ZcashSDKConstants.streamingCallTimeoutInMillis - ), - memoCharLimit: MemoBytes.capacity, - mnemonicWordsMaxCount: ZcashSDKConstants.mnemonicWordsMaxCount, - network: ZcashNetworkBuilder.network(for: .testnet), - requiredTransactionConfirmations: ZcashSDKConstants.requiredTransactionConfirmations, - sdkVersion: "0.18.1-beta" - ) -} diff --git a/secant/Features/AddressDetails/AddressDetailsStore.swift b/secant/Features/AddressDetails/AddressDetailsStore.swift index 5a17d29..075687b 100644 --- a/secant/Features/AddressDetails/AddressDetailsStore.swift +++ b/secant/Features/AddressDetails/AddressDetailsStore.swift @@ -9,6 +9,7 @@ import Foundation import ComposableArchitecture import ZcashLightClientKit import PasteboardClient +import Generated typealias AddressDetailsStore = Store diff --git a/secant/Features/AddressDetails/AddressDetailsView.swift b/secant/Features/AddressDetails/AddressDetailsView.swift index 2967829..817b6ba 100644 --- a/secant/Features/AddressDetails/AddressDetailsView.swift +++ b/secant/Features/AddressDetails/AddressDetailsView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct AddressDetailsView: View { let store: AddressDetailsStore diff --git a/secant/Features/Alerts/AlertStates.swift b/secant/Features/Alerts/AlertStates.swift index f2cafa7..7878e40 100644 --- a/secant/Features/Alerts/AlertStates.swift +++ b/secant/Features/Alerts/AlertStates.swift @@ -6,6 +6,7 @@ // import ComposableArchitecture +import Generated // MARK: - Balance Breakdown diff --git a/secant/Features/BalanceBreakdown/BalanceBreakdownStore.swift b/secant/Features/BalanceBreakdown/BalanceBreakdownStore.swift index 16477d5..a977529 100644 --- a/secant/Features/BalanceBreakdown/BalanceBreakdownStore.swift +++ b/secant/Features/BalanceBreakdown/BalanceBreakdownStore.swift @@ -12,6 +12,7 @@ import DerivationToolClient import MnemonicClient import NumberFormatterClient import Utils +import Generated typealias BalanceBreakdownStore = Store typealias BalanceBreakdownViewStore = ViewStore diff --git a/secant/Features/BalanceBreakdown/BalanceBreakdownView.swift b/secant/Features/BalanceBreakdown/BalanceBreakdownView.swift index 0b55a4e..c4f12e9 100644 --- a/secant/Features/BalanceBreakdown/BalanceBreakdownView.swift +++ b/secant/Features/BalanceBreakdown/BalanceBreakdownView.swift @@ -8,6 +8,7 @@ import SwiftUI import ComposableArchitecture import ZcashLightClientKit +import Generated struct BalanceBreakdownView: View { let store: BalanceBreakdownStore diff --git a/secant/Features/ExportLogs/ExportLogsStore.swift b/secant/Features/ExportLogs/ExportLogsStore.swift index 8eb4bd0..64bca79 100644 --- a/secant/Features/ExportLogs/ExportLogsStore.swift +++ b/secant/Features/ExportLogs/ExportLogsStore.swift @@ -10,6 +10,7 @@ import ComposableArchitecture import Foundation import ZcashLightClientKit import LogsHandlerClient +import Utils typealias ExportLogsStore = Store typealias ExportLogsViewStore = ViewStore diff --git a/secant/Features/Home/HomeStore.swift b/secant/Features/Home/HomeStore.swift index ccd8e42..e9cdcb0 100644 --- a/secant/Features/Home/HomeStore.swift +++ b/secant/Features/Home/HomeStore.swift @@ -6,6 +6,9 @@ import ZcashLightClientKit import AudioServicesClient import DiskSpaceCheckerClient import Utils +import Models +import Generated +import ReviewRequestClient typealias HomeStore = Store typealias HomeViewStore = ViewStore @@ -137,7 +140,7 @@ struct HomeReducer: ReducerProtocol { case .resolveReviewRequest: if reviewRequest.canRequestReview() { state.canRequestReview = true - return .fireAndForget { await reviewRequest.reviewRequested() } + return .fireAndForget { reviewRequest.reviewRequested() } } return .none @@ -163,14 +166,14 @@ struct HomeReducer: ReducerProtocol { return EffectTask(value: .showSynchronizerErrorAlert(error.toZcashError())) case .upToDate: - return .fireAndForget { await reviewRequest.syncFinished() } + return .fireAndForget { reviewRequest.syncFinished() } default: return .none } case .foundTransactions: - return .fireAndForget { await reviewRequest.foundTransactions() } + return .fireAndForget { reviewRequest.foundTransactions() } case .updateDestination(.profile): state.profileState.destination = nil diff --git a/secant/Features/Home/HomeView.swift b/secant/Features/Home/HomeView.swift index 9f6cc69..ba4a876 100644 --- a/secant/Features/Home/HomeView.swift +++ b/secant/Features/Home/HomeView.swift @@ -1,6 +1,7 @@ import SwiftUI import ComposableArchitecture import StoreKit +import Generated struct HomeView: View { let store: Store diff --git a/secant/Features/ImportWallet/ImportBirthdayView.swift b/secant/Features/ImportWallet/ImportBirthdayView.swift index 8aaaa19..85766d0 100644 --- a/secant/Features/ImportWallet/ImportBirthdayView.swift +++ b/secant/Features/ImportWallet/ImportBirthdayView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct ImportBirthdayView: View { var store: ImportWalletStore diff --git a/secant/Features/ImportWallet/ImportWalletStore.swift b/secant/Features/ImportWallet/ImportWalletStore.swift index 684a0ea..a41a299 100644 --- a/secant/Features/ImportWallet/ImportWalletStore.swift +++ b/secant/Features/ImportWallet/ImportWalletStore.swift @@ -9,6 +9,7 @@ import ComposableArchitecture import ZcashLightClientKit import SwiftUI import Utils +import Generated typealias ImportWalletStore = Store typealias ImportWalletViewStore = ViewStore @@ -81,7 +82,7 @@ struct ImportWalletReducer: ReducerProtocol { return .none case .birthdayInputChanged(let redactedBirthday): - let saplingActivation = zcashSDKEnvironment.network.constants.saplingActivationHeight + let saplingActivation = TargetConstants.zcashNetwork.constants.saplingActivationHeight state.birthdayHeight = redactedBirthday @@ -102,7 +103,7 @@ struct ImportWalletReducer: ReducerProtocol { // store it to the keychain, if the user did not input a height, // fall back to sapling activation - let birthday = state.birthdayHeightValue ?? zcashSDKEnvironment.network.constants.saplingActivationHeight.redacted + let birthday = state.birthdayHeightValue ?? TargetConstants.zcashNetwork.constants.saplingActivationHeight.redacted try walletStorage.importWallet(state.importedSeedPhrase.data, birthday.data, .english, false) diff --git a/secant/Features/ImportWallet/ImportWalletView.swift b/secant/Features/ImportWallet/ImportWalletView.swift index 155ec30..765f660 100644 --- a/secant/Features/ImportWallet/ImportWalletView.swift +++ b/secant/Features/ImportWallet/ImportWalletView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct ImportWalletView: View { var store: ImportWalletStore @@ -58,7 +59,7 @@ extension ImportWalletView { .foregroundColor( viewStore.isValidNumberOfWords ? Asset.Colors.Text.validMnemonic.color : - Asset.Colors.Text.heading.color + Asset.Colors.Text.heading.color ) .padding(.trailing, 35) .padding(.bottom, 15) diff --git a/secant/Features/NotEnoughFreeSpace/NotEnoughFreeSpaceView.swift b/secant/Features/NotEnoughFreeSpace/NotEnoughFreeSpaceView.swift index 47a7f96..c5013e9 100644 --- a/secant/Features/NotEnoughFreeSpace/NotEnoughFreeSpaceView.swift +++ b/secant/Features/NotEnoughFreeSpace/NotEnoughFreeSpaceView.swift @@ -8,6 +8,8 @@ import Foundation import SwiftUI import ComposableArchitecture +import UIComponents +import Generated struct NotEnoughFreeSpaceView: View { let viewStore: HomeViewStore diff --git a/secant/Features/OnboardingFlow/OnboardingFlowStore.swift b/secant/Features/OnboardingFlow/OnboardingFlowStore.swift index d7a6425..d0c979b 100644 --- a/secant/Features/OnboardingFlow/OnboardingFlowStore.swift +++ b/secant/Features/OnboardingFlow/OnboardingFlowStore.swift @@ -8,6 +8,7 @@ import Foundation import SwiftUI import ComposableArchitecture +import Generated typealias OnboardingFlowStore = Store typealias OnboardingFlowViewStore = ViewStore diff --git a/secant/Features/OnboardingFlow/PlainOnboardingView.swift b/secant/Features/OnboardingFlow/PlainOnboardingView.swift index 84db953..e593007 100644 --- a/secant/Features/OnboardingFlow/PlainOnboardingView.swift +++ b/secant/Features/OnboardingFlow/PlainOnboardingView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct PlainOnboardingView: View { let store: OnboardingFlowStore diff --git a/secant/Features/OnboardingFlow/Views/OnboardingFooterView.swift b/secant/Features/OnboardingFlow/Views/OnboardingFooterView.swift index 8d44b93..90c17b1 100644 --- a/secant/Features/OnboardingFlow/Views/OnboardingFooterView.swift +++ b/secant/Features/OnboardingFlow/Views/OnboardingFooterView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct OnboardingFooterView: View { let store: Store diff --git a/secant/Features/OnboardingFlow/Views/OnboardingHeaderView.swift b/secant/Features/OnboardingFlow/Views/OnboardingHeaderView.swift index 78a48c0..a0086fc 100644 --- a/secant/Features/OnboardingFlow/Views/OnboardingHeaderView.swift +++ b/secant/Features/OnboardingFlow/Views/OnboardingHeaderView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct OnboardingHeaderView: View { struct ViewState: Equatable { diff --git a/secant/Features/Profile/ProfileStore.swift b/secant/Features/Profile/ProfileStore.swift index be8fd2b..e50f00b 100644 --- a/secant/Features/Profile/ProfileStore.swift +++ b/secant/Features/Profile/ProfileStore.swift @@ -2,6 +2,7 @@ import ComposableArchitecture import SwiftUI import ZcashLightClientKit import AppVersionClient +import Generated typealias ProfileStore = Store typealias ProfileViewStore = ViewStore diff --git a/secant/Features/Profile/ProfileView.swift b/secant/Features/Profile/ProfileView.swift index 94aa8fb..52990f3 100644 --- a/secant/Features/Profile/ProfileView.swift +++ b/secant/Features/Profile/ProfileView.swift @@ -1,5 +1,6 @@ import ComposableArchitecture import SwiftUI +import Generated struct ProfileView: View { let store: ProfileStore diff --git a/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayStore.swift b/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayStore.swift index 9757560..a1c1999 100644 --- a/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayStore.swift +++ b/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayStore.swift @@ -7,6 +7,7 @@ import Foundation import ComposableArchitecture +import Models typealias RecoveryPhraseDisplayStore = Store diff --git a/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayView.swift b/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayView.swift index 81e2f69..2eec697 100644 --- a/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayView.swift +++ b/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct RecoveryPhraseDisplayView: View { let store: RecoveryPhraseDisplayStore @@ -88,27 +89,6 @@ extension RecoveryPhraseDisplayStore { } } -// TODO: [#695] This should have a #DEBUG tag, but if so, it's not possible to compile this on release mode and submit it to testflight https://github.com/zcash/ZcashLightClientKit/issues/695 -extension RecoveryPhrase { - static let testPhrase = [ - // 1 - "bring", "salute", "thank", - "require", "spirit", "toe", - // 7 - "boil", "hill", "casino", - "trophy", "drink", "frown", - // 13 - "bird", "grit", "close", - "morning", "bind", "cancel", - // 19 - "daughter", "salon", "quit", - "pizza", "just", "garlic" - ] - - static let placeholder = RecoveryPhrase(words: testPhrase.map { $0.redacted }) - static let empty = RecoveryPhrase(words: []) -} - struct RecoveryPhraseDisplayView_Previews: PreviewProvider { static let scheduler = DispatchQueue.main static let store = RecoveryPhraseDisplayStore.demo diff --git a/secant/Features/Root/RootDebug.swift b/secant/Features/Root/RootDebug.swift index 17e6891..9ff2687 100644 --- a/secant/Features/Root/RootDebug.swift +++ b/secant/Features/Root/RootDebug.swift @@ -9,6 +9,7 @@ import Combine import ComposableArchitecture import Foundation import ZcashLightClientKit +import Generated /// In this file is a collection of helpers that control all state and action related operations /// for the `RootReducer` with a connection to the UI navigation. diff --git a/secant/Features/Root/RootInitialization.swift b/secant/Features/Root/RootInitialization.swift index 70052cf..708fdde 100644 --- a/secant/Features/Root/RootInitialization.swift +++ b/secant/Features/Root/RootInitialization.swift @@ -8,6 +8,8 @@ import ComposableArchitecture import Foundation import ZcashLightClientKit +import Models +import Utils /// In this file is a collection of helpers that control all state and action related operations /// for the `RootReducer` with a connection to the app/wallet initialization and erasure of the wallet. @@ -74,8 +76,7 @@ extension RootReducer { case .initialization(.checkWalletInitialization): let walletState = RootReducer.walletInitializationState( databaseFiles: databaseFiles, - walletStorage: walletStorage, - zcashSDKEnvironment: zcashSDKEnvironment + walletStorage: walletStorage ) return EffectTask(value: .initialization(.respondToWalletInitializationState(walletState))) @@ -115,7 +116,7 @@ extension RootReducer { return EffectTask(value: .alert(.root(.cantLoadSeedPhrase))) } - let birthday = state.storedWallet?.birthday?.value() ?? zcashSDKEnvironment.latestCheckpoint + let birthday = state.storedWallet?.birthday?.value() ?? zcashSDKEnvironment.latestCheckpoint(TargetConstants.zcashNetwork) try mnemonic.isValid(storedWallet.seedPhrase.value()) let seedBytes = try mnemonic.toSeed(storedWallet.seedPhrase.value()) @@ -162,7 +163,7 @@ extension RootReducer { do { // get the random english mnemonic let newRandomPhrase = try mnemonic.randomMnemonic() - let birthday = zcashSDKEnvironment.latestCheckpoint + let birthday = zcashSDKEnvironment.latestCheckpoint(TargetConstants.zcashNetwork) // store the wallet to the keychain try walletStorage.importWallet(newRandomPhrase, birthday, .english, !state.walletConfig.isEnabled(.testBackupPhraseFlow)) diff --git a/secant/Features/Root/RootStore.swift b/secant/Features/Root/RootStore.swift index 4bc0e2b..a74caa8 100644 --- a/secant/Features/Root/RootStore.swift +++ b/secant/Features/Root/RootStore.swift @@ -2,6 +2,8 @@ import ComposableArchitecture import ZcashLightClientKit import DatabaseFilesClient import DeeplinkClient +import RecoveryPhraseValidationFlow +import ZcashSDKEnvironment typealias RootStore = Store typealias RootViewStore = ViewStore @@ -109,14 +111,13 @@ struct RootReducer: ReducerProtocol { extension RootReducer { static func walletInitializationState( databaseFiles: DatabaseFilesClient, - walletStorage: WalletStorageClient, - zcashSDKEnvironment: ZcashSDKEnvironment + walletStorage: WalletStorageClient ) -> InitializationState { var keysPresent = false do { keysPresent = try walletStorage.areKeysPresent() let databaseFilesPresent = databaseFiles.areDbFilesPresentFor( - zcashSDKEnvironment.network + TargetConstants.zcashNetwork ) switch (keysPresent, databaseFilesPresent) { @@ -130,7 +131,7 @@ extension RootReducer { return .initialized } } catch WalletStorage.WalletStorageError.uninitializedWallet { - if databaseFiles.areDbFilesPresentFor(zcashSDKEnvironment.network) { + if databaseFiles.areDbFilesPresentFor(TargetConstants.zcashNetwork) { return .keysMissing } } catch { diff --git a/secant/Features/Root/RootView.swift b/secant/Features/Root/RootView.swift index dc26f00..a0eb0a6 100644 --- a/secant/Features/Root/RootView.swift +++ b/secant/Features/Root/RootView.swift @@ -1,11 +1,33 @@ import SwiftUI import StoreKit import ComposableArchitecture +import Generated +import RecoveryPhraseValidationFlow struct RootView: View { let store: RootStore var body: some View { + switchOverDestination() + } +} + +private struct FeatureFlagWrapper: Identifiable, Equatable, Comparable { + let name: FeatureFlag + let isEnabled: Bool + var id: String { name.rawValue } + + static func < (lhs: FeatureFlagWrapper, rhs: FeatureFlagWrapper) -> Bool { + lhs.name.rawValue < rhs.name.rawValue + } + + static func == (lhs: FeatureFlagWrapper, rhs: FeatureFlagWrapper) -> Bool { + lhs.name.rawValue == rhs.name.rawValue + } +} + +private extension RootView { + @ViewBuilder func switchOverDestination() -> some View { WithViewStore(store) { viewStore in Group { switch viewStore.destinationState.destination { @@ -19,7 +41,7 @@ struct RootView: View { ) } .navigationViewStyle(.stack) - + case .sandbox: NavigationView { SandboxView( @@ -30,7 +52,7 @@ struct RootView: View { ) } .navigationViewStyle(.stack) - + case .onboarding: NavigationView { if viewStore.walletConfig @@ -51,13 +73,13 @@ struct RootView: View { } } .navigationViewStyle(.stack) - + case .startup: ZStack(alignment: .topTrailing) { debugView(viewStore) .transition(.opacity) } - + case .phraseValidation: NavigationView { RecoveryPhraseValidationFlowView( @@ -68,7 +90,7 @@ struct RootView: View { ) } .navigationViewStyle(.stack) - + case .phraseDisplay: NavigationView { RecoveryPhraseDisplayView( @@ -78,7 +100,7 @@ struct RootView: View { ) ) } - + case .welcome: WelcomeView( store: store.scope( @@ -93,26 +115,12 @@ struct RootView: View { state: \.uniAlert, action: { _ in RootReducer.Action.dismissAlert } ), dismiss: .dismissAlert) - + shareLogsView(viewStore) } } } -private struct FeatureFlagWrapper: Identifiable, Equatable, Comparable { - let name: FeatureFlag - let isEnabled: Bool - var id: String { name.rawValue } - - static func < (lhs: FeatureFlagWrapper, rhs: FeatureFlagWrapper) -> Bool { - lhs.name.rawValue < rhs.name.rawValue - } - - static func == (lhs: FeatureFlagWrapper, rhs: FeatureFlagWrapper) -> Bool { - lhs.name.rawValue == rhs.name.rawValue - } -} - private extension RootView { @ViewBuilder func shareLogsView(_ viewStore: RootViewStore) -> some View { if viewStore.exportLogsState.isSharingLogs { diff --git a/secant/Features/Scan/ScanView.swift b/secant/Features/Scan/ScanView.swift index a46bb1f..21b624c 100644 --- a/secant/Features/Scan/ScanView.swift +++ b/secant/Features/Scan/ScanView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct ScanView: View { @Environment(\.presentationMode) var presentationMode diff --git a/secant/Features/SendFlow/SendFlowStore.swift b/secant/Features/SendFlow/SendFlowStore.swift index 9afafd1..8903ac9 100644 --- a/secant/Features/SendFlow/SendFlowStore.swift +++ b/secant/Features/SendFlow/SendFlowStore.swift @@ -170,7 +170,7 @@ struct SendFlowReducer: ReducerProtocol { memo = nil } - let recipient = try Recipient(state.address, network: zcashSDKEnvironment.network.networkType) + let recipient = try Recipient(state.address, network: TargetConstants.zcashNetwork.networkType) return .run { [state] send in do { await send(SendFlowReducer.Action.updateDestination(.inProgress)) diff --git a/secant/Features/SendFlow/SendFlowView.swift b/secant/Features/SendFlow/SendFlowView.swift index 816ba46..8351d11 100644 --- a/secant/Features/SendFlow/SendFlowView.swift +++ b/secant/Features/SendFlow/SendFlowView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct SendFlowView: View { let store: SendFlowStore diff --git a/secant/Features/SendFlow/Views/CreateTransactionView.swift b/secant/Features/SendFlow/Views/CreateTransactionView.swift index 982720e..0f644d4 100644 --- a/secant/Features/SendFlow/Views/CreateTransactionView.swift +++ b/secant/Features/SendFlow/Views/CreateTransactionView.swift @@ -1,5 +1,6 @@ import SwiftUI import ComposableArchitecture +import Generated struct CreateTransaction: View { let store: SendFlowStore diff --git a/secant/Features/SendFlow/Views/TransactionFailedView.swift b/secant/Features/SendFlow/Views/TransactionFailedView.swift index bea3f7c..5612a11 100644 --- a/secant/Features/SendFlow/Views/TransactionFailedView.swift +++ b/secant/Features/SendFlow/Views/TransactionFailedView.swift @@ -1,5 +1,6 @@ import SwiftUI import ComposableArchitecture +import Generated struct TransactionFailed: View { let viewStore: SendFlowViewStore diff --git a/secant/Features/SendFlow/Views/TransactionSendingView.swift b/secant/Features/SendFlow/Views/TransactionSendingView.swift index 0a389d4..eee06bc 100644 --- a/secant/Features/SendFlow/Views/TransactionSendingView.swift +++ b/secant/Features/SendFlow/Views/TransactionSendingView.swift @@ -8,6 +8,7 @@ import ComposableArchitecture import Foundation import SwiftUI +import Generated struct TransactionSendingView: View { let viewStore: SendFlowViewStore diff --git a/secant/Features/SendFlow/Views/TransactionSentView.swift b/secant/Features/SendFlow/Views/TransactionSentView.swift index 7baba3b..542cfe3 100644 --- a/secant/Features/SendFlow/Views/TransactionSentView.swift +++ b/secant/Features/SendFlow/Views/TransactionSentView.swift @@ -1,5 +1,6 @@ import SwiftUI import ComposableArchitecture +import Generated struct TransactionSent: View { let viewStore: SendFlowViewStore diff --git a/secant/Features/Settings/SettingsStore.swift b/secant/Features/Settings/SettingsStore.swift index 1e8e53e..2219feb 100644 --- a/secant/Features/Settings/SettingsStore.swift +++ b/secant/Features/Settings/SettingsStore.swift @@ -5,6 +5,8 @@ import AppVersionClient import MnemonicClient import LogsHandlerClient import LocalAuthenticationClient +import SupportDataGeneratorClient +import Models typealias SettingsStore = Store typealias SettingsViewStore = ViewStore @@ -57,7 +59,7 @@ struct SettingsReducer: ReducerProtocol { return .none case .backupWalletAccessRequest: return .run { send in - if await localAuthentication.authenticate(L10n.LocalAuthentication.reason) { + if await localAuthentication.authenticate() { await send(.backupWallet) } } diff --git a/secant/Features/Settings/SettingsView.swift b/secant/Features/Settings/SettingsView.swift index 92682b1..b2e73a9 100644 --- a/secant/Features/Settings/SettingsView.swift +++ b/secant/Features/Settings/SettingsView.swift @@ -1,5 +1,6 @@ import SwiftUI import ComposableArchitecture +import Generated struct SettingsView: View { let store: SettingsStore diff --git a/secant/Features/Settings/UIKitBridge/UIMailDialog.swift b/secant/Features/Settings/UIKitBridge/UIMailDialog.swift index 6093095..d225ffa 100644 --- a/secant/Features/Settings/UIKitBridge/UIMailDialog.swift +++ b/secant/Features/Settings/UIKitBridge/UIMailDialog.swift @@ -9,6 +9,7 @@ import Foundation import MessageUI import UIKit import SwiftUI +import SupportDataGeneratorClient class UIMailDialog: UIView { var completion: (() -> Void)? diff --git a/secant/Features/Settings/Views/About.swift b/secant/Features/Settings/Views/About.swift index 9f05668..48f5a19 100644 --- a/secant/Features/Settings/Views/About.swift +++ b/secant/Features/Settings/Views/About.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct About: View { let store: SettingsStore diff --git a/secant/Features/WalletEventsFlow/Views/TransactionDetailView.swift b/secant/Features/WalletEventsFlow/Views/TransactionDetailView.swift index 8e696dd..e99a6a8 100644 --- a/secant/Features/WalletEventsFlow/Views/TransactionDetailView.swift +++ b/secant/Features/WalletEventsFlow/Views/TransactionDetailView.swift @@ -2,6 +2,8 @@ import SwiftUI import ComposableArchitecture import ZcashLightClientKit import Utils +import Models +import Generated struct TransactionDetailView: View { enum RowMark { diff --git a/secant/Features/WalletEventsFlow/Views/TransactionRowView.swift b/secant/Features/WalletEventsFlow/Views/TransactionRowView.swift index 047eb5d..fa65781 100644 --- a/secant/Features/WalletEventsFlow/Views/TransactionRowView.swift +++ b/secant/Features/WalletEventsFlow/Views/TransactionRowView.swift @@ -7,6 +7,8 @@ import SwiftUI import ZcashLightClientKit +import Models +import Generated struct TransactionRowView: View { var transaction: TransactionState diff --git a/secant/Models/WalletEvent.swift b/secant/Features/WalletEventsFlow/Views/WalletEvent+View.swift similarity index 86% rename from secant/Models/WalletEvent.swift rename to secant/Features/WalletEventsFlow/Views/WalletEvent+View.swift index 8485ca4..da637c4 100644 --- a/secant/Models/WalletEvent.swift +++ b/secant/Features/WalletEventsFlow/Views/WalletEvent+View.swift @@ -1,29 +1,15 @@ // -// WalletEvent.swift -// secant-testnet +// WalletEvent+View.swift +// secant // -// Created by Lukáš Korba on 20.06.2022. +// Created by Lukáš Korba on 30.05.2023. // -import Foundation import ComposableArchitecture +import Models +import Generated import SwiftUI import ZcashLightClientKit -import Utils - -// MARK: - Model - -struct WalletEvent: Equatable, Identifiable, Redactable { - enum WalletEventState: Equatable { - case transaction(TransactionState) - case shielded(Zatoshi) - case walletImport(BlockHeight) - } - - let id: String - let state: WalletEventState - var timestamp: TimeInterval? -} // MARK: - Rows diff --git a/secant/Features/WalletEventsFlow/WalletEventsFlowStore.swift b/secant/Features/WalletEventsFlow/WalletEventsFlowStore.swift index e9ae093..9ed69a3 100644 --- a/secant/Features/WalletEventsFlow/WalletEventsFlowStore.swift +++ b/secant/Features/WalletEventsFlow/WalletEventsFlowStore.swift @@ -2,6 +2,7 @@ import ComposableArchitecture import SwiftUI import ZcashLightClientKit import Utils +import Models typealias WalletEventsFlowStore = Store typealias WalletEventsFlowViewStore = ViewStore diff --git a/secant/Features/WalletEventsFlow/WalletEventsFlowView.swift b/secant/Features/WalletEventsFlow/WalletEventsFlowView.swift index 39871af..dd73d8f 100644 --- a/secant/Features/WalletEventsFlow/WalletEventsFlowView.swift +++ b/secant/Features/WalletEventsFlow/WalletEventsFlowView.swift @@ -1,5 +1,6 @@ import SwiftUI import ComposableArchitecture +import Generated struct WalletEventsFlowView: View { let store: WalletEventsFlowStore diff --git a/secant/Features/Welcome/WelcomeView.swift b/secant/Features/Welcome/WelcomeView.swift index ae8d979..ed6bacf 100644 --- a/secant/Features/Welcome/WelcomeView.swift +++ b/secant/Features/Welcome/WelcomeView.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct WelcomeView: View { var store: WelcomeStore diff --git a/secant/Models/RecoveryPhrase.swift b/secant/Models/RecoveryPhrase.swift deleted file mode 100644 index 8e8945f..0000000 --- a/secant/Models/RecoveryPhrase.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// RecoveryPhrase.swift -// secant-testnet -// -// Created by Lukáš Korba on 12.05.2022. -// - -import Foundation -import ZcashLightClientKit -import Utils - -enum RecoveryPhraseError: Error { - /// This error is thrown then the Recovery Phrase can't be generated - case unableToGeneratePhrase -} - -struct RecoveryPhrase: Equatable, Redactable { - struct Group: Hashable { - var startIndex: Int - var words: [RedactableString] - } - - let words: [RedactableString] - - private let groupSize = 6 - - func toGroups(groupSizeOverride: Int? = nil) -> [Group] { - let internalGroupSize = groupSizeOverride ?? groupSize - let chunks = words.count / internalGroupSize - return zip(0 ..< chunks, words.chunked(into: internalGroupSize)).map { - Group(startIndex: $0 * internalGroupSize + 1, words: $1) - } - } - - func toString() -> RedactableString { - let result = words - .map { $0.data } - .joined(separator: " ") - return result.redacted - } - - func words(fromMissingIndices indices: [Int]) -> [PhraseChip.Kind] { - assert((indices.count - 1) * groupSize <= self.words.count) - - return indices.enumerated().map { index, position in - .unassigned(word: self.words[(index * groupSize) + position]) - } - } -} diff --git a/secant/Models/StoredWallet.swift b/secant/Models/StoredWallet.swift index 9aca25b..2b68bfa 100644 --- a/secant/Models/StoredWallet.swift +++ b/secant/Models/StoredWallet.swift @@ -9,6 +9,7 @@ import Foundation import ZcashLightClientKit import MnemonicSwift import Utils +import Models /// Representation of the wallet stored in the persistent storage (typically keychain, handled by `WalletStorage`). struct StoredWallet: Codable, Equatable { diff --git a/secant/Models/SyncStatusSnapshot.swift b/secant/Models/SyncStatusSnapshot.swift index 0a74e11..627a8d2 100644 --- a/secant/Models/SyncStatusSnapshot.swift +++ b/secant/Models/SyncStatusSnapshot.swift @@ -7,6 +7,7 @@ import Foundation import ZcashLightClientKit +import Generated struct SyncStatusSnapshot: Equatable { let message: String diff --git a/secant/Resources/Generated/Fonts+Generated.swift b/secant/Resources/Generated/Fonts+Generated.swift deleted file mode 100644 index 518048b..0000000 --- a/secant/Resources/Generated/Fonts+Generated.swift +++ /dev/null @@ -1,165 +0,0 @@ -// swiftlint:disable all -// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen - -import SwiftUI -#if os(OSX) - import AppKit.NSFont -#elseif os(iOS) || os(tvOS) || os(watchOS) - import UIKit.UIFont -#endif - -// Deprecated typealiases -@available(*, deprecated, renamed: "FontConvertible.Font", message: "This typealias will be removed in SwiftGen 7.0") -internal typealias SystemFont = FontConvertible.SystemFont - -// swiftlint:disable superfluous_disable_command -// swiftlint:disable file_length - -// MARK: - Fonts - -// swiftlint:disable identifier_name line_length type_body_length -internal enum FontFamily { - internal enum Roboto { - internal static let black = FontConvertible(name: "Roboto-Black", family: "Roboto", path: "Roboto-Black.ttf") - internal static let blackItalic = FontConvertible(name: "Roboto-BlackItalic", family: "Roboto", path: "Roboto-BlackItalic.ttf") - internal static let bold = FontConvertible(name: "Roboto-Bold", family: "Roboto", path: "Roboto-Bold.ttf") - internal static let boldItalic = FontConvertible(name: "Roboto-BoldItalic", family: "Roboto", path: "Roboto-BoldItalic.ttf") - internal static let italic = FontConvertible(name: "Roboto-Italic", family: "Roboto", path: "Roboto-Italic.ttf") - internal static let light = FontConvertible(name: "Roboto-Light", family: "Roboto", path: "Roboto-Light.ttf") - internal static let lightItalic = FontConvertible(name: "Roboto-LightItalic", family: "Roboto", path: "Roboto-LightItalic.ttf") - internal static let medium = FontConvertible(name: "Roboto-Medium", family: "Roboto", path: "Roboto-Medium.ttf") - internal static let mediumItalic = FontConvertible(name: "Roboto-MediumItalic", family: "Roboto", path: "Roboto-MediumItalic.ttf") - internal static let regular = FontConvertible(name: "Roboto-Regular", family: "Roboto", path: "Roboto-Regular.ttf") - internal static let thin = FontConvertible(name: "Roboto-Thin", family: "Roboto", path: "Roboto-Thin.ttf") - internal static let thinItalic = FontConvertible(name: "Roboto-ThinItalic", family: "Roboto", path: "Roboto-ThinItalic.ttf") - internal static let all: [FontConvertible] = [black, blackItalic, bold, boldItalic, italic, light, lightItalic, medium, mediumItalic, regular, thin, thinItalic] - } - internal enum Rubik { - internal static let light = FontConvertible(name: "Rubik-Light", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") - internal static let lightItalic = FontConvertible(name: "Rubik-LightItalic", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") - internal static let blackItalic = FontConvertible(name: "RubikItalic-Black", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") - internal static let boldItalic = FontConvertible(name: "RubikItalic-Bold", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") - internal static let extraBoldItalic = FontConvertible(name: "RubikItalic-ExtraBold", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") - internal static let mediumItalic = FontConvertible(name: "RubikItalic-Medium", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") - internal static let italic = FontConvertible(name: "RubikItalic-Regular", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") - internal static let semiBoldItalic = FontConvertible(name: "RubikItalic-SemiBold", family: "Rubik", path: "Rubik-Italic-VariableFont_wght.ttf") - internal static let black = FontConvertible(name: "RubikRoman-Black", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") - internal static let bold = FontConvertible(name: "RubikRoman-Bold", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") - internal static let extraBold = FontConvertible(name: "RubikRoman-ExtraBold", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") - internal static let medium = FontConvertible(name: "RubikRoman-Medium", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") - internal static let regular = FontConvertible(name: "RubikRoman-Regular", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") - internal static let semiBold = FontConvertible(name: "RubikRoman-SemiBold", family: "Rubik", path: "Rubik-VariableFont_wght.ttf") - internal static let all: [FontConvertible] = [light, lightItalic, blackItalic, boldItalic, extraBoldItalic, mediumItalic, italic, semiBoldItalic, black, bold, extraBold, medium, regular, semiBold] - } - internal enum Zboto { - internal static let regular = FontConvertible(name: "ZbotoRegular", family: "Zboto", path: "Zboto.otf") - internal static let all: [FontConvertible] = [regular] - } - internal static let allCustomFonts: [FontConvertible] = [Roboto.all, Rubik.all, Zboto.all].flatMap { $0 } - internal static func registerAllCustomFonts() { - allCustomFonts.forEach { $0.register() } - } -} -// swiftlint:enable identifier_name line_length type_body_length - -// MARK: - Implementation Details - -internal struct FontConvertible { - internal let name: String - internal let family: String - internal let path: String - - #if os(OSX) - internal typealias SystemFont = NSFont - #elseif os(iOS) || os(tvOS) || os(watchOS) - internal typealias SystemFont = UIFont - #endif - - internal func font(size: CGFloat) -> SystemFont { - guard let font = SystemFont(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - return font - } - - internal func textStyle(_ textStyle: Font.TextStyle) -> Font { - Font.mappedFont(name, textStyle: textStyle) - } - - internal func register() { - // swiftlint:disable:next conditional_returns_on_newline - guard let url = url else { return } - CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) - } - - fileprivate var url: URL? { - // swiftlint:disable:next implicit_return - return BundleToken.bundle.url(forResource: path, withExtension: nil) - } -} - -internal extension FontConvertible.SystemFont { - convenience init?(font: FontConvertible, size: CGFloat) { - #if os(iOS) || os(tvOS) || os(watchOS) - if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) { - font.register() - } - #elseif os(OSX) - if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none { - font.register() - } - #endif - - self.init(name: font.name, size: size) - } -} - -// swiftlint:disable convenience_type -private final class BundleToken { - static let bundle: Bundle = { - #if SWIFT_PACKAGE - return Bundle.module - #else - return Bundle(for: BundleToken.self) - #endif - }() -} - -fileprivate extension Font { - static func mappedFont(_ name: String, textStyle: TextStyle) -> Font { - let fontSize = UIFont.preferredFont(forTextStyle: self.mapToUIFontTextStyle(textStyle)).pointSize - return Font.custom(name, size: fontSize, relativeTo: textStyle) - } - - // swiftlint:disable:next cyclomatic_complexity - static func mapToUIFontTextStyle(_ textStyle: SwiftUI.Font.TextStyle) -> UIFont.TextStyle { - switch textStyle { - case .largeTitle: - return .largeTitle - case .title: - return .title1 - case .title2: - return .title2 - case .title3: - return .title3 - case .headline: - return .headline - case .subheadline: - return .subheadline - case .callout: - return .callout - case .body: - return .body - case .caption: - return .caption1 - case .caption2: - return .caption2 - case .footnote: - return .footnote - @unknown default: - fatalError("Missing a TextStyle mapping") - } - } -} - -// swiftlint:enable convenience_type diff --git a/secant/Resources/Generated/L10n.swift b/secant/Resources/Generated/L10n.swift deleted file mode 100644 index 7d617ef..0000000 --- a/secant/Resources/Generated/L10n.swift +++ /dev/null @@ -1,727 +0,0 @@ -// swiftlint:disable all -// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen - -import Foundation - -// swiftlint:disable superfluous_disable_command file_length implicit_return prefer_self_in_static_references - -// MARK: - Strings - -// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length -// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces -internal enum L10n { - /// %@ %@ - internal static func balance(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "balance", String(describing: p1), String(describing: p2), fallback: "%@ %@") - } - /// QR Code for %@ - internal static func qrCodeFor(_ p1: Any) -> String { - return L10n.tr("Localizable", "qrCodeFor", String(describing: p1), fallback: "QR Code for %@") - } - internal enum AddressDetails { - /// Sapling Address - internal static let sa = L10n.tr("Localizable", "addressDetails.sa", fallback: "Sapling Address") - /// Transparent Address - internal static let ta = L10n.tr("Localizable", "addressDetails.ta", fallback: "Transparent Address") - /// Unified Address - internal static let ua = L10n.tr("Localizable", "addressDetails.ua", fallback: "Unified Address") - internal enum Error { - /// could not extract sapling receiver from UA - internal static let cantExtractSaplingAddress = L10n.tr("Localizable", "addressDetails.error.cantExtractSaplingAddress", fallback: "could not extract sapling receiver from UA") - /// could not extract transparent receiver from UA - internal static let cantExtractTransparentAddress = L10n.tr("Localizable", "addressDetails.error.cantExtractTransparentAddress", fallback: "could not extract transparent receiver from UA") - /// could not extract UA - internal static let cantExtractUnifiedAddress = L10n.tr("Localizable", "addressDetails.error.cantExtractUnifiedAddress", fallback: "could not extract UA") - } - } - internal enum Balance { - /// %@ %@ Available - internal static func available(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "balance.available", String(describing: p1), String(describing: p2), fallback: "%@ %@ Available") - } - } - internal enum BalanceBreakdown { - /// Shielding Threshold: %@ %@ - internal static func autoShieldingThreshold(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "balanceBreakdown.autoShieldingThreshold", String(describing: p1), String(describing: p2), fallback: "Shielding Threshold: %@ %@") - } - /// Block: %@ - internal static func blockId(_ p1: Any) -> String { - return L10n.tr("Localizable", "balanceBreakdown.blockId", String(describing: p1), fallback: "Block: %@") - } - /// SHIELDED %@ (SPENDABLE) - internal static func shieldedZec(_ p1: Any) -> String { - return L10n.tr("Localizable", "balanceBreakdown.shieldedZec", String(describing: p1), fallback: "SHIELDED %@ (SPENDABLE)") - } - /// Shield funds - internal static let shieldFunds = L10n.tr("Localizable", "balanceBreakdown.shieldFunds", fallback: "Shield funds") - /// Shielding funds - internal static let shieldingFunds = L10n.tr("Localizable", "balanceBreakdown.shieldingFunds", fallback: "Shielding funds") - /// TOTAL BALANCE - internal static let totalSpendableBalance = L10n.tr("Localizable", "balanceBreakdown.totalSpendableBalance", fallback: "TOTAL BALANCE") - /// TRANSPARENT BALANCE - internal static let transparentBalance = L10n.tr("Localizable", "balanceBreakdown.transparentBalance", fallback: "TRANSPARENT BALANCE") - internal enum Alert { - internal enum ShieldFunds { - internal enum Failure { - /// Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "balanceBreakdown.alert.shieldFunds.failure.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") - } - /// Failed to shield funds - internal static let title = L10n.tr("Localizable", "balanceBreakdown.alert.shieldFunds.failure.title", fallback: "Failed to shield funds") - } - internal enum Success { - /// Shielding transaction created - internal static let message = L10n.tr("Localizable", "balanceBreakdown.alert.shieldFunds.success.message", fallback: "Shielding transaction created") - /// Done - internal static let title = L10n.tr("Localizable", "balanceBreakdown.alert.shieldFunds.success.title", fallback: "Done") - } - } - } - } - internal enum Error { - /// possible roll back - internal static let rollBack = L10n.tr("Localizable", "error.rollBack", fallback: "possible roll back") - } - internal enum ExportLogs { - internal enum Alert { - internal enum Failed { - /// Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "exportLogs.alert.failed.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") - } - /// Error when exporting logs - internal static let title = L10n.tr("Localizable", "exportLogs.alert.failed.title", fallback: "Error when exporting logs") - } - } - } - internal enum Field { - internal enum Multiline { - /// char limit exceeded - internal static let charLimitExceeded = L10n.tr("Localizable", "field.multiline.charLimitExceeded", fallback: "char limit exceeded") - } - internal enum TransactionAddress { - /// To: - internal static let to = L10n.tr("Localizable", "field.transactionAddress.to", fallback: "To:") - /// Valid Zcash Address - internal static let validZcashAddress = L10n.tr("Localizable", "field.transactionAddress.validZcashAddress", fallback: "Valid Zcash Address") - } - internal enum TransactionAmount { - /// Amount: - internal static let amount = L10n.tr("Localizable", "field.transactionAmount.amount", fallback: "Amount:") - /// %@ Amount - internal static func zecAmount(_ p1: Any) -> String { - return L10n.tr("Localizable", "field.transactionAmount.zecAmount", String(describing: p1), fallback: "%@ Amount") - } - } - } - internal enum General { - /// Back - internal static let back = L10n.tr("Localizable", "general.back", fallback: "Back") - /// Cancel - internal static let cancel = L10n.tr("Localizable", "general.cancel", fallback: "Cancel") - /// Clear - internal static let clear = L10n.tr("Localizable", "general.clear", fallback: "Clear") - /// Close - internal static let close = L10n.tr("Localizable", "general.close", fallback: "Close") - /// date not available - internal static let dateNotAvailable = L10n.tr("Localizable", "general.dateNotAvailable", fallback: "date not available") - /// Max - internal static let max = L10n.tr("Localizable", "general.max", fallback: "Max") - /// Next - internal static let next = L10n.tr("Localizable", "general.next", fallback: "Next") - /// No - internal static let no = L10n.tr("Localizable", "general.no", fallback: "No") - /// Ok - internal static let ok = L10n.tr("Localizable", "general.ok", fallback: "Ok") - /// Send - internal static let send = L10n.tr("Localizable", "general.send", fallback: "Send") - /// Skip - internal static let skip = L10n.tr("Localizable", "general.skip", fallback: "Skip") - /// Success - internal static let success = L10n.tr("Localizable", "general.success", fallback: "Success") - /// Unknown - internal static let unknown = L10n.tr("Localizable", "general.unknown", fallback: "Unknown") - /// Yes - internal static let yes = L10n.tr("Localizable", "general.yes", fallback: "Yes") - } - internal enum Home { - /// Receive %@ - internal static func receiveZec(_ p1: Any) -> String { - return L10n.tr("Localizable", "home.receiveZec", String(describing: p1), fallback: "Receive %@") - } - /// Send %@ - internal static func sendZec(_ p1: Any) -> String { - return L10n.tr("Localizable", "home.sendZec", String(describing: p1), fallback: "Send %@") - } - /// Secant Wallet - internal static let title = L10n.tr("Localizable", "home.title", fallback: "Secant Wallet") - /// See transaction history - internal static let transactionHistory = L10n.tr("Localizable", "home.transactionHistory", fallback: "See transaction history") - internal enum SyncFailed { - /// Dismiss - internal static let dismiss = L10n.tr("Localizable", "home.syncFailed.dismiss", fallback: "Dismiss") - /// Retry - internal static let retry = L10n.tr("Localizable", "home.syncFailed.retry", fallback: "Retry") - /// Sync failed! - internal static let title = L10n.tr("Localizable", "home.syncFailed.title", fallback: "Sync failed!") - } - } - internal enum ImportWallet { - /// Enter your secret backup seed phrase. - internal static let description = L10n.tr("Localizable", "importWallet.description", fallback: "Enter your secret backup seed phrase.") - /// Wallet Import - internal static let title = L10n.tr("Localizable", "importWallet.title", fallback: "Wallet Import") - internal enum Alert { - internal enum Failed { - /// Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "importWallet.alert.failed.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") - } - /// Failed to restore wallet - internal static let title = L10n.tr("Localizable", "importWallet.alert.failed.title", fallback: "Failed to restore wallet") - } - internal enum Success { - /// The wallet has been successfully recovered. - internal static let message = L10n.tr("Localizable", "importWallet.alert.success.message", fallback: "The wallet has been successfully recovered.") - /// Success - internal static let title = L10n.tr("Localizable", "importWallet.alert.success.title", fallback: "Success") - } - } - internal enum Birthday { - /// Do you know the wallet's creation date? This will allow a faster sync. If you don't know the wallet's birthday, don't worry! - internal static let description = L10n.tr("Localizable", "importWallet.birthday.description", fallback: "Do you know the wallet's creation date? This will allow a faster sync. If you don't know the wallet's birthday, don't worry!") - /// Enter birthday height - internal static let placeholder = L10n.tr("Localizable", "importWallet.birthday.placeholder", fallback: "Enter birthday height") - } - internal enum Button { - /// Import a private or viewing key - internal static let importPrivateKey = L10n.tr("Localizable", "importWallet.button.importPrivateKey", fallback: "Import a private or viewing key") - /// Restore wallet - internal static let restoreWallet = L10n.tr("Localizable", "importWallet.button.restoreWallet", fallback: "Restore wallet") - } - internal enum Seed { - /// VALID SEED PHRASE - internal static let valid = L10n.tr("Localizable", "importWallet.seed.valid", fallback: "VALID SEED PHRASE") - } - } - internal enum LocalAuthentication { - /// The Following content requires authentication. - internal static let reason = L10n.tr("Localizable", "localAuthentication.reason", fallback: "The Following content requires authentication.") - } - internal enum Nefs { - /// Not enough space on disk to do synchronisation! - internal static let message = L10n.tr("Localizable", "nefs.message", fallback: "Not enough space on disk to do synchronisation!") - } - internal enum Onboarding { - internal enum Button { - /// Import an Existing Wallet - internal static let importWallet = L10n.tr("Localizable", "onboarding.button.importWallet", fallback: "Import an Existing Wallet") - /// Create New Wallet - internal static let newWallet = L10n.tr("Localizable", "onboarding.button.newWallet", fallback: "Create New Wallet") - } - internal enum Step1 { - /// As a privacy focused wallet, we shield by default. Your wallet uses the shielded address for sending and moves transparent funds to that address automatically. - /// - /// In other words, the 'privacy-please' sign is on the knob. - internal static let description = L10n.tr("Localizable", "onboarding.step1.description", fallback: "As a privacy focused wallet, we shield by default. Your wallet uses the shielded address for sending and moves transparent funds to that address automatically.\n\nIn other words, the 'privacy-please' sign is on the knob.") - /// Welcome! - internal static let title = L10n.tr("Localizable", "onboarding.step1.title", fallback: "Welcome!") - } - internal enum Step2 { - /// You now have a unified address that includes and up-to-date shielded address for legacy systems. - /// - /// This makes your wallet friendlier, and gives you and address that you won't have to upgrade again. - internal static let description = L10n.tr("Localizable", "onboarding.step2.description", fallback: "You now have a unified address that includes and up-to-date shielded address for legacy systems.\n\nThis makes your wallet friendlier, and gives you and address that you won't have to upgrade again.") - /// Unified Addresses - internal static let title = L10n.tr("Localizable", "onboarding.step2.title", fallback: "Unified Addresses") - } - internal enum Step3 { - /// Due to Zcash's increased popularity, we are optimizing our syncing schemes to be faster and more efficient! - /// - /// The future is fast! - internal static let description = L10n.tr("Localizable", "onboarding.step3.description", fallback: "Due to Zcash's increased popularity, we are optimizing our syncing schemes to be faster and more efficient!\n\nThe future is fast!") - /// And so much more... - internal static let title = L10n.tr("Localizable", "onboarding.step3.title", fallback: "And so much more...") - } - internal enum Step4 { - /// Choose between creating a new wallet and importing and existing Secret Recovery Phrase - internal static let description = L10n.tr("Localizable", "onboarding.step4.description", fallback: "Choose between creating a new wallet and importing and existing Secret Recovery Phrase") - /// Let's get started - internal static let title = L10n.tr("Localizable", "onboarding.step4.title", fallback: "Let's get started") - } - } - internal enum PlainOnboarding { - /// We need to create a new wallet or restore an existing one. Select your path: - internal static let caption = L10n.tr("Localizable", "plainOnboarding.caption", fallback: "We need to create a new wallet or restore an existing one. Select your path:") - /// It's time to setup your Secant, powered by Zcash, no-frills wallet. - internal static let title = L10n.tr("Localizable", "plainOnboarding.title", fallback: "It's time to setup your Secant, powered by Zcash, no-frills wallet.") - internal enum Button { - /// Create a new Wallet - internal static let createNewWallet = L10n.tr("Localizable", "plainOnboarding.button.createNewWallet", fallback: "Create a new Wallet") - /// Restore an existing wallet - internal static let restoreWallet = L10n.tr("Localizable", "plainOnboarding.button.restoreWallet", fallback: "Restore an existing wallet") - } - } - internal enum ReceiveZec { - /// Your Address - internal static let yourAddress = L10n.tr("Localizable", "receiveZec.yourAddress", fallback: "Your Address") - internal enum Error { - /// could not extract UA - internal static let cantExtractUnifiedAddress = L10n.tr("Localizable", "receiveZec.error.cantExtractUnifiedAddress", fallback: "could not extract UA") - } - } - internal enum RecoveryPhraseBackupValidation { - /// Drag the words below to match your backed-up copy. - internal static let description = L10n.tr("Localizable", "recoveryPhraseBackupValidation.description", fallback: "Drag the words below to match your backed-up copy.") - /// Your placed words did not match your secret recovery phrase - internal static let failedResult = L10n.tr("Localizable", "recoveryPhraseBackupValidation.failedResult", fallback: "Your placed words did not match your secret recovery phrase") - /// Congratulations! You validated your secret recovery phrase. - internal static let successResult = L10n.tr("Localizable", "recoveryPhraseBackupValidation.successResult", fallback: "Congratulations! You validated your secret recovery phrase.") - /// Verify Your Backup - internal static let title = L10n.tr("Localizable", "recoveryPhraseBackupValidation.title", fallback: "Verify Your Backup") - } - internal enum RecoveryPhraseDisplay { - /// The following 24 words represent your funds and the security used to protect them. Back them up now! - internal static let description = L10n.tr("Localizable", "recoveryPhraseDisplay.description", fallback: "The following 24 words represent your funds and the security used to protect them. Back them up now!") - /// Oops no words - internal static let noWords = L10n.tr("Localizable", "recoveryPhraseDisplay.noWords", fallback: "Oops no words") - /// Your Secret Recovery Phrase - internal static let title = L10n.tr("Localizable", "recoveryPhraseDisplay.title", fallback: "Your Secret Recovery Phrase") - internal enum Button { - /// Copy To Buffer - internal static let copyToBuffer = L10n.tr("Localizable", "recoveryPhraseDisplay.button.copyToBuffer", fallback: "Copy To Buffer") - /// I wrote it down! - internal static let wroteItDown = L10n.tr("Localizable", "recoveryPhraseDisplay.button.wroteItDown", fallback: "I wrote it down!") - } - } - internal enum RecoveryPhraseTestPreamble { - /// It is important to understand that you are in charge here. Great, right? YOU get to be the bank! - internal static let paragraph1 = L10n.tr("Localizable", "recoveryPhraseTestPreamble.paragraph1", fallback: "It is important to understand that you are in charge here. Great, right? YOU get to be the bank!") - /// But it also means that YOU are the customer, and you need to be self-reliant. - internal static let paragraph2 = L10n.tr("Localizable", "recoveryPhraseTestPreamble.paragraph2", fallback: "But it also means that YOU are the customer, and you need to be self-reliant.") - /// So how do you recover funds that you've hidden on a completely decentralized and private block-chain? - internal static let paragraph3 = L10n.tr("Localizable", "recoveryPhraseTestPreamble.paragraph3", fallback: "So how do you recover funds that you've hidden on a completely decentralized and private block-chain?") - /// First things first - internal static let title = L10n.tr("Localizable", "recoveryPhraseTestPreamble.title", fallback: "First things first") - internal enum Button { - /// By understanding and preparing - internal static let goNext = L10n.tr("Localizable", "recoveryPhraseTestPreamble.button.goNext", fallback: "By understanding and preparing") - } - } - internal enum Root { - internal enum Debug { - /// Feature flags - internal static let featureFlags = L10n.tr("Localizable", "root.debug.featureFlags", fallback: "Feature flags") - /// Startup - internal static let navigationTitle = L10n.tr("Localizable", "root.debug.navigationTitle", fallback: "Startup") - /// Debug options - internal static let title = L10n.tr("Localizable", "root.debug.title", fallback: "Debug options") - internal enum Alert { - internal enum Rewind { - internal enum CantStartSync { - /// Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "root.debug.alert.rewind.cantStartSync.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") - } - /// Can't start sync process after rewind - internal static let title = L10n.tr("Localizable", "root.debug.alert.rewind.cantStartSync.title", fallback: "Can't start sync process after rewind") - } - internal enum Failed { - /// Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "root.debug.alert.rewind.failed.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") - } - /// Rewind failed - internal static let title = L10n.tr("Localizable", "root.debug.alert.rewind.failed.title", fallback: "Rewind failed") - } - } - } - internal enum Dialog { - internal enum Rescan { - /// Select the rescan you want - internal static let message = L10n.tr("Localizable", "root.debug.dialog.rescan.message", fallback: "Select the rescan you want") - /// Rescan - internal static let title = L10n.tr("Localizable", "root.debug.dialog.rescan.title", fallback: "Rescan") - internal enum Option { - /// Full rescan - internal static let full = L10n.tr("Localizable", "root.debug.dialog.rescan.option.full", fallback: "Full rescan") - /// Quick rescan - internal static let quick = L10n.tr("Localizable", "root.debug.dialog.rescan.option.quick", fallback: "Quick rescan") - } - } - } - internal enum Option { - /// Rate the app - internal static let appReview = L10n.tr("Localizable", "root.debug.option.appReview", fallback: "Rate the app") - /// Export logs - internal static let exportLogs = L10n.tr("Localizable", "root.debug.option.exportLogs", fallback: "Export logs") - /// Go To Onboarding - internal static let gotoOnboarding = L10n.tr("Localizable", "root.debug.option.gotoOnboarding", fallback: "Go To Onboarding") - /// Go To Phrase Validation Demo - internal static let gotoPhraseValidationDemo = L10n.tr("Localizable", "root.debug.option.gotoPhraseValidationDemo", fallback: "Go To Phrase Validation Demo") - /// Go To Sandbox (navigation proof) - internal static let gotoSandbox = L10n.tr("Localizable", "root.debug.option.gotoSandbox", fallback: "Go To Sandbox (navigation proof)") - /// [Be careful] Nuke Wallet - internal static let nukeWallet = L10n.tr("Localizable", "root.debug.option.nukeWallet", fallback: "[Be careful] Nuke Wallet") - /// Rescan Blockchain - internal static let rescanBlockchain = L10n.tr("Localizable", "root.debug.option.rescanBlockchain", fallback: "Rescan Blockchain") - /// Restart the app - internal static let restartApp = L10n.tr("Localizable", "root.debug.option.restartApp", fallback: "Restart the app") - /// Test Crash Reporter - internal static let testCrashReporter = L10n.tr("Localizable", "root.debug.option.testCrashReporter", fallback: "Test Crash Reporter") - } - } - internal enum Destination { - internal enum Alert { - internal enum FailedToProcessDeeplink { - /// Deeplink: (%@)) - /// Error: (%@) (code: %@) - internal static func message(_ p1: Any, _ p2: Any, _ p3: Any) -> String { - return L10n.tr("Localizable", "root.destination.alert.failedToProcessDeeplink.message", String(describing: p1), String(describing: p2), String(describing: p3), fallback: "Deeplink: (%@))\nError: (%@) (code: %@)") - } - /// Failed to process deeplink. - internal static let title = L10n.tr("Localizable", "root.destination.alert.failedToProcessDeeplink.title", fallback: "Failed to process deeplink.") - } - } - } - internal enum Initialization { - internal enum Alert { - internal enum CantCreateNewWallet { - /// Can't create new wallet. Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "root.initialization.alert.cantCreateNewWallet.message", String(describing: p1), String(describing: p2), fallback: "Can't create new wallet. Error: %@ (code: %@)") - } - } - internal enum CantLoadSeedPhrase { - /// Can't load seed phrase from local storage. - internal static let message = L10n.tr("Localizable", "root.initialization.alert.cantLoadSeedPhrase.message", fallback: "Can't load seed phrase from local storage.") - } - internal enum CantStoreThatUserPassedPhraseBackupTest { - /// Can't store information that user passed phrase backup test. Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "root.initialization.alert.cantStoreThatUserPassedPhraseBackupTest.message", String(describing: p1), String(describing: p2), fallback: "Can't store information that user passed phrase backup test. Error: %@ (code: %@)") - } - } - internal enum Error { - /// Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "root.initialization.alert.error.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") - } - } - internal enum Failed { - /// Wallet initialisation failed. - internal static let title = L10n.tr("Localizable", "root.initialization.alert.failed.title", fallback: "Wallet initialisation failed.") - } - internal enum SdkInitFailed { - /// Failed to initialize the SDK - internal static let title = L10n.tr("Localizable", "root.initialization.alert.sdkInitFailed.title", fallback: "Failed to initialize the SDK") - } - internal enum WalletStateFailed { - /// App initialisation state: %@. - internal static func message(_ p1: Any) -> String { - return L10n.tr("Localizable", "root.initialization.alert.walletStateFailed.message", String(describing: p1), fallback: "App initialisation state: %@.") - } - } - internal enum Wipe { - /// Are you sure? - internal static let message = L10n.tr("Localizable", "root.initialization.alert.wipe.message", fallback: "Are you sure?") - /// Wipe of the wallet - internal static let title = L10n.tr("Localizable", "root.initialization.alert.wipe.title", fallback: "Wipe of the wallet") - } - internal enum WipeFailed { - /// Nuke of the wallet failed - internal static let title = L10n.tr("Localizable", "root.initialization.alert.wipeFailed.title", fallback: "Nuke of the wallet failed") - } - } - } - } - internal enum Scan { - /// We will validate any Zcash URI and take you to the appropriate action. - internal static let info = L10n.tr("Localizable", "scan.info", fallback: "We will validate any Zcash URI and take you to the appropriate action.") - /// Scanning... - internal static let scanning = L10n.tr("Localizable", "scan.scanning", fallback: "Scanning...") - internal enum Alert { - internal enum CantInitializeCamera { - /// Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "scan.alert.cantInitializeCamera.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") - } - /// Can't initialize the camera - internal static let title = L10n.tr("Localizable", "scan.alert.cantInitializeCamera.title", fallback: "Can't initialize the camera") - } - } - } - internal enum Send { - /// address: %@ - internal static func address(_ p1: Any) -> String { - return L10n.tr("Localizable", "send.address", String(describing: p1), fallback: " address: %@") - } - /// amount: %@ - internal static func amount(_ p1: Any) -> String { - return L10n.tr("Localizable", "send.amount", String(describing: p1), fallback: "amount: %@") - } - /// Memo included. Tap to edit. - internal static let editMemo = L10n.tr("Localizable", "send.editMemo", fallback: "Memo included. Tap to edit.") - /// Sending transaction failed - internal static let failed = L10n.tr("Localizable", "send.failed", fallback: "Sending transaction failed") - /// Aditional funds may be in transit - internal static let fundsInfo = L10n.tr("Localizable", "send.fundsInfo", fallback: "Aditional funds may be in transit") - /// Want to include memo? Tap here. - internal static let includeMemo = L10n.tr("Localizable", "send.includeMemo", fallback: "Want to include memo? Tap here.") - /// memo: %@ - internal static func memo(_ p1: Any) -> String { - return L10n.tr("Localizable", "send.memo", String(describing: p1), fallback: " memo: %@") - } - /// Write a private message here - internal static let memoPlaceholder = L10n.tr("Localizable", "send.memoPlaceholder", fallback: "Write a private message here") - /// Sending %@ %@ to - internal static func sendingTo(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "send.sendingTo", String(describing: p1), String(describing: p2), fallback: "Sending %@ %@ to") - } - /// Sending transaction succeeded - internal static let succeeded = L10n.tr("Localizable", "send.succeeded", fallback: "Sending transaction succeeded") - /// Send Zcash - internal static let title = L10n.tr("Localizable", "send.title", fallback: "Send Zcash") - } - internal enum Settings { - /// About - internal static let about = L10n.tr("Localizable", "settings.about", fallback: "About") - /// Backup Wallet - internal static let backupWallet = L10n.tr("Localizable", "settings.backupWallet", fallback: "Backup Wallet") - /// Enable Crash Reporting - internal static let crashReporting = L10n.tr("Localizable", "settings.crashReporting", fallback: "Enable Crash Reporting") - /// Exporting... - internal static let exporting = L10n.tr("Localizable", "settings.exporting", fallback: "Exporting...") - /// Export & share logs - internal static let exportLogs = L10n.tr("Localizable", "settings.exportLogs", fallback: "Export & share logs") - /// Send us feedback! - internal static let feedback = L10n.tr("Localizable", "settings.feedback", fallback: "Send us feedback!") - /// Settings - internal static let title = L10n.tr("Localizable", "settings.title", fallback: "Settings") - /// Version %@ (%@) - internal static func version(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "settings.version", String(describing: p1), String(describing: p2), fallback: "Version %@ (%@)") - } - internal enum Alert { - internal enum CantBackupWallet { - /// Error: %@ (code: %@) - internal static func message(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "settings.alert.cantBackupWallet.message", String(describing: p1), String(describing: p2), fallback: "Error: %@ (code: %@)") - } - /// Can't backup wallet - internal static let title = L10n.tr("Localizable", "settings.alert.cantBackupWallet.title", fallback: "Can't backup wallet") - } - internal enum CantSendEmail { - /// It looks like that you don't have any email account configured on your device. Therefore it's not possible to send a support email. - internal static let message = L10n.tr("Localizable", "settings.alert.cantSendEmail.message", fallback: "It looks like that you don't have any email account configured on your device. Therefore it's not possible to send a support email.") - /// Can't send email - internal static let title = L10n.tr("Localizable", "settings.alert.cantSendEmail.title", fallback: "Can't send email") - } - } - } - internal enum SupportData { - internal enum AppVersionItem { - /// App identifier - internal static let bundleIdentifier = L10n.tr("Localizable", "supportData.appVersionItem.bundleIdentifier", fallback: "App identifier") - /// App version - internal static let version = L10n.tr("Localizable", "supportData.appVersionItem.version", fallback: "App version") - } - internal enum DeviceModelItem { - /// Device - internal static let device = L10n.tr("Localizable", "supportData.deviceModelItem.device", fallback: "Device") - } - internal enum FreeDiskSpaceItem { - /// Usable storage - internal static let freeDiskSpace = L10n.tr("Localizable", "supportData.freeDiskSpaceItem.freeDiskSpace", fallback: "Usable storage") - } - internal enum LocaleItem { - /// Currency decimal separator - internal static let decimalSeparator = L10n.tr("Localizable", "supportData.localeItem.decimalSeparator", fallback: "Currency decimal separator") - /// Currency grouping separator - internal static let groupingSeparator = L10n.tr("Localizable", "supportData.localeItem.groupingSeparator", fallback: "Currency grouping separator") - /// Locale - internal static let locale = L10n.tr("Localizable", "supportData.localeItem.locale", fallback: "Locale") - } - internal enum PermissionItem { - /// Camera access - internal static let camera = L10n.tr("Localizable", "supportData.permissionItem.camera", fallback: "Camera access") - /// FaceID available - internal static let faceID = L10n.tr("Localizable", "supportData.permissionItem.faceID", fallback: "FaceID available") - /// Permissions - internal static let permissions = L10n.tr("Localizable", "supportData.permissionItem.permissions", fallback: "Permissions") - /// TouchID available - internal static let touchID = L10n.tr("Localizable", "supportData.permissionItem.touchID", fallback: "TouchID available") - } - internal enum SystemVersionItem { - /// iOS version - internal static let version = L10n.tr("Localizable", "supportData.systemVersionItem.version", fallback: "iOS version") - } - internal enum TimeItem { - /// Current time - internal static let time = L10n.tr("Localizable", "supportData.timeItem.time", fallback: "Current time") - } - } - internal enum Sync { - internal enum Message { - /// Error: %@ - internal static func error(_ p1: Any) -> String { - return L10n.tr("Localizable", "sync.message.error", String(describing: p1), fallback: "Error: %@") - } - /// %@%% Synced - internal static func sync(_ p1: Any) -> String { - return L10n.tr("Localizable", "sync.message.sync", String(describing: p1), fallback: "%@%% Synced") - } - /// Unprepared - internal static let unprepared = L10n.tr("Localizable", "sync.message.unprepared", fallback: "Unprepared") - /// Up-To-Date - internal static let uptodate = L10n.tr("Localizable", "sync.message.uptodate", fallback: "Up-To-Date") - } - } - internal enum Transaction { - /// Confirmed - internal static let confirmed = L10n.tr("Localizable", "transaction.confirmed", fallback: "Confirmed") - /// %@ times - internal static func confirmedTimes(_ p1: Any) -> String { - return L10n.tr("Localizable", "transaction.confirmedTimes", String(describing: p1), fallback: "%@ times") - } - /// Confirming ~%@mins - internal static func confirming(_ p1: Any) -> String { - return L10n.tr("Localizable", "transaction.confirming", String(describing: p1), fallback: "Confirming ~%@mins") - } - /// Failed - internal static let failed = L10n.tr("Localizable", "transaction.failed", fallback: "Failed") - /// Received - internal static let received = L10n.tr("Localizable", "transaction.received", fallback: "Received") - /// RECEIVING - internal static let receiving = L10n.tr("Localizable", "transaction.receiving", fallback: "RECEIVING") - /// SENDING - internal static let sending = L10n.tr("Localizable", "transaction.sending", fallback: "SENDING") - /// Sent - internal static let sent = L10n.tr("Localizable", "transaction.sent", fallback: "Sent") - /// to - internal static let to = L10n.tr("Localizable", "transaction.to", fallback: "to") - /// unconfirmed - internal static let unconfirmed = L10n.tr("Localizable", "transaction.unconfirmed", fallback: "unconfirmed") - /// With memo: - internal static let withMemo = L10n.tr("Localizable", "transaction.withMemo", fallback: "With memo:") - /// You are receiving %@ %@ - internal static func youAreReceiving(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "transaction.youAreReceiving", String(describing: p1), String(describing: p2), fallback: "You are receiving %@ %@") - } - /// You are sending %@ %@ - internal static func youAreSending(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "transaction.youAreSending", String(describing: p1), String(describing: p2), fallback: "You are sending %@ %@") - } - /// You DID NOT send %@ %@ - internal static func youDidNotSent(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "transaction.youDidNotSent", String(describing: p1), String(describing: p2), fallback: "You DID NOT send %@ %@") - } - /// You received %@ %@ - internal static func youReceived(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "transaction.youReceived", String(describing: p1), String(describing: p2), fallback: "You received %@ %@") - } - /// You sent %@ %@ - internal static func youSent(_ p1: Any, _ p2: Any) -> String { - return L10n.tr("Localizable", "transaction.youSent", String(describing: p1), String(describing: p2), fallback: "You sent %@ %@") - } - } - internal enum TransactionDetail { - /// Error: %@ - internal static func error(_ p1: Any) -> String { - return L10n.tr("Localizable", "transactionDetail.error", String(describing: p1), fallback: "Error: %@") - } - /// Transaction detail - internal static let title = L10n.tr("Localizable", "transactionDetail.title", fallback: "Transaction detail") - } - internal enum Transactions { - /// Transactions - internal static let title = L10n.tr("Localizable", "transactions.title", fallback: "Transactions") - } - internal enum ValidationFailed { - /// Your placed words did not match your secret recovery phrase. - internal static let description = L10n.tr("Localizable", "validationFailed.description", fallback: "Your placed words did not match your secret recovery phrase.") - /// Remember, you can't recover your funds if you lose (or incorrectly save) these 24 words. - internal static let incorrectBackupDescription = L10n.tr("Localizable", "validationFailed.incorrectBackupDescription", fallback: "Remember, you can't recover your funds if you lose (or incorrectly save) these 24 words.") - /// Ouch, sorry, no. - internal static let title = L10n.tr("Localizable", "validationFailed.title", fallback: "Ouch, sorry, no.") - internal enum Button { - /// Try again - internal static let tryAgain = L10n.tr("Localizable", "validationFailed.button.tryAgain", fallback: "Try again") - } - } - internal enum ValidationSuccess { - /// Place that backup somewhere safe and venture forth in security. - internal static let description = L10n.tr("Localizable", "validationSuccess.description", fallback: "Place that backup somewhere safe and venture forth in security.") - /// Success! - internal static let title = L10n.tr("Localizable", "validationSuccess.title", fallback: "Success!") - internal enum Button { - /// Take me to my wallet! - internal static let goToWallet = L10n.tr("Localizable", "validationSuccess.button.goToWallet", fallback: "Take me to my wallet!") - /// Show me my phrase again - internal static let phraseAgain = L10n.tr("Localizable", "validationSuccess.button.phraseAgain", fallback: "Show me my phrase again") - } - } - internal enum WalletEvent { - internal enum Alert { - internal enum LeavingApp { - /// While usually an acceptable risk, you will possibly exposing your behavior and interest in this transaction by going online. OH NOES! What will you do? - internal static let message = L10n.tr("Localizable", "walletEvent.alert.leavingApp.message", fallback: "While usually an acceptable risk, you will possibly exposing your behavior and interest in this transaction by going online. OH NOES! What will you do?") - /// You are exiting your wallet - internal static let title = L10n.tr("Localizable", "walletEvent.alert.leavingApp.title", fallback: "You are exiting your wallet") - internal enum Button { - /// NEVERMIND - internal static let nevermind = L10n.tr("Localizable", "walletEvent.alert.leavingApp.button.nevermind", fallback: "NEVERMIND") - /// SEE TX ONLINE - internal static let seeOnline = L10n.tr("Localizable", "walletEvent.alert.leavingApp.button.seeOnline", fallback: "SEE TX ONLINE") - } - } - } - internal enum Detail { - /// wallet import wallet event - internal static let `import` = L10n.tr("Localizable", "walletEvent.detail.import", fallback: "wallet import wallet event") - /// shielded %@ detail - internal static func shielded(_ p1: Any) -> String { - return L10n.tr("Localizable", "walletEvent.detail.shielded", String(describing: p1), fallback: "shielded %@ detail") - } - } - internal enum Row { - /// wallet import wallet event - internal static let `import` = L10n.tr("Localizable", "walletEvent.row.import", fallback: "wallet import wallet event") - /// shielded wallet event %@ - internal static func shielded(_ p1: Any) -> String { - return L10n.tr("Localizable", "walletEvent.row.shielded", String(describing: p1), fallback: "shielded wallet event %@") - } - } - } - internal enum WelcomeScreen { - /// Just Loading, one sec - internal static let subtitle = L10n.tr("Localizable", "welcomeScreen.subtitle", fallback: "Just Loading, one sec") - /// Powered by Zcash - internal static let title = L10n.tr("Localizable", "welcomeScreen.title", fallback: "Powered by Zcash") - } -} -// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length -// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces - -// MARK: - Implementation Details - -extension L10n { - private static func tr(_ table: String, _ key: String, _ args: CVarArg..., fallback value: String) -> String { - let format = BundleToken.bundle.localizedString(forKey: key, value: value, table: table) - return String(format: format, locale: Locale.current, arguments: args) - } -} - -// swiftlint:disable convenience_type -private final class BundleToken { - static let bundle: Bundle = { - #if SWIFT_PACKAGE - return Bundle.module - #else - return Bundle(for: BundleToken.self) - #endif - }() -} -// swiftlint:enable convenience_type diff --git a/secant/Resources/Generated/XCAssets+Generated.swift b/secant/Resources/Generated/XCAssets+Generated.swift deleted file mode 100644 index 814f5a3..0000000 --- a/secant/Resources/Generated/XCAssets+Generated.swift +++ /dev/null @@ -1,269 +0,0 @@ -// swiftlint:disable all -// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen - -import SwiftUI -#if os(macOS) - import AppKit -#elseif os(iOS) - import UIKit -#elseif os(tvOS) || os(watchOS) - import UIKit -#endif - -// Deprecated typealiases -@available(*, deprecated, renamed: "ColorAsset.SystemColor", message: "This typealias will be removed in SwiftGen 7.0") -internal typealias AssetColorTypeAlias = ColorAsset.SystemColor -@available(*, deprecated, renamed: "ImageAsset.UniversalImage", message: "This typealias will be removed in SwiftGen 7.0") -internal typealias AssetImageTypeAlias = ImageAsset.UniversalImage - -// swiftlint:disable superfluous_disable_command file_length implicit_return - -// MARK: - Asset Catalogs - -// swiftlint:disable identifier_name line_length nesting type_body_length type_name -internal enum Asset { - internal enum Assets { - internal enum Backgrounds { - internal static let callout0 = ImageAsset(name: "callout0") - internal static let callout1 = ImageAsset(name: "callout1") - internal static let callout2 = ImageAsset(name: "callout2") - internal static let callout3 = ImageAsset(name: "callout3") - internal static let callout4 = ImageAsset(name: "callout4") - internal static let calloutBackupFailed = ImageAsset(name: "calloutBackupFailed") - internal static let calloutBackupFlow1 = ImageAsset(name: "calloutBackupFlow1") - internal static let calloutBackupSucceeded = ImageAsset(name: "calloutBackupSucceeded") - } - internal enum Icons { - internal static let qrCode = ImageAsset(name: "qrCode") - } - internal static let welcomeScreenLogo = ImageAsset(name: "WelcomeScreenLogo") - } - internal enum Colors { - internal enum BackgroundColors { - internal static let numberedChip = ColorAsset(name: "numberedChip") - internal static let phraseGridDarkGray = ColorAsset(name: "phraseGridDarkGray") - internal static let red = ColorAsset(name: "red") - internal static let staticWelcomeScreen = ColorAsset(name: "staticWelcomeScreen") - } - internal enum Buttons { - internal static let activeButton = ColorAsset(name: "ActiveButton") - internal static let activeButtonDisabled = ColorAsset(name: "ActiveButtonDisabled") - internal static let activeButtonPressed = ColorAsset(name: "ActiveButtonPressed") - internal static let buttonsTitleShadow = ColorAsset(name: "ButtonsTitleShadow") - internal static let neumorphicButtonDarkSide = ColorAsset(name: "NeumorphicButtonDarkSide") - internal static let neumorphicButtonLightSide = ColorAsset(name: "NeumorphicButtonLightSide") - internal static let onboardingNavigation = ColorAsset(name: "OnboardingNavigation") - internal static let onboardingNavigationPressed = ColorAsset(name: "OnboardingNavigationPressed") - internal static let primaryButton = ColorAsset(name: "PrimaryButton") - internal static let primaryButtonDisabled = ColorAsset(name: "PrimaryButtonDisabled") - internal static let primaryButtonPressed = ColorAsset(name: "PrimaryButtonPressed") - internal static let secondaryButton = ColorAsset(name: "SecondaryButton") - internal static let secondaryButtonPressed = ColorAsset(name: "SecondaryButtonPressed") - } - internal enum CheckCircle { - internal static let externalRing = ColorAsset(name: "externalRing") - internal static let internalRing = ColorAsset(name: "internalRing") - } - internal enum Cursor { - internal static let bar = ColorAsset(name: "Bar") - } - internal enum Mfp { - internal static let background = ColorAsset(name: "background") - internal static let fontDark = ColorAsset(name: "fontDark") - internal static let fontLight = ColorAsset(name: "fontLight") - internal static let primary = ColorAsset(name: "primary") - } - internal enum Onboarding { - internal static let badgeShadow = ColorAsset(name: "BadgeShadow") - internal static let circularFrameDarkOutlineGradientEnd = ColorAsset(name: "CircularFrameDarkOutlineGradientEnd") - internal static let circularFrameDarkOutlineGradientStart = ColorAsset(name: "CircularFrameDarkOutlineGradientStart") - internal static let circularFrameGradientEnd = ColorAsset(name: "CircularFrameGradientEnd") - internal static let circularFrameGradientStart = ColorAsset(name: "CircularFrameGradientStart") - internal static let navigationButtonDisabled = ColorAsset(name: "NavigationButtonDisabled") - internal static let navigationButtonEnabled = ColorAsset(name: "NavigationButtonEnabled") - internal static let neumorphicDarkSide = ColorAsset(name: "NeumorphicDarkSide") - internal static let neumorphicLightSide = ColorAsset(name: "NeumorphicLightSide") - internal static let badgeBackground = ColorAsset(name: "badgeBackground") - } - internal enum ProgressIndicator { - internal static let gradientLeft = ColorAsset(name: "GradientLeft") - internal static let gradientRight = ColorAsset(name: "GradientRight") - internal static let negativeSpace = ColorAsset(name: "NegativeSpace") - internal static let holdToSendButton = ColorAsset(name: "holdToSendButton") - } - internal enum QRScan { - internal static let frame = ColorAsset(name: "frame") - } - internal enum ScreenBackground { - internal static let amberGradientEnd = ColorAsset(name: "amberGradientEnd") - internal static let amberGradientMiddle = ColorAsset(name: "amberGradientMiddle") - internal static let amberGradientStart = ColorAsset(name: "amberGradientStart") - internal static let gradientDarkEnd = ColorAsset(name: "gradientDarkEnd") - internal static let gradientDarkStart = ColorAsset(name: "gradientDarkStart") - internal static let gradientEnd = ColorAsset(name: "gradientEnd") - internal static let gradientStart = ColorAsset(name: "gradientStart") - internal static let greenGradientEnd = ColorAsset(name: "greenGradientEnd") - internal static let greenGradientStart = ColorAsset(name: "greenGradientStart") - internal static let modalDialog = ColorAsset(name: "modalDialog") - internal static let redGradientEnd = ColorAsset(name: "redGradientEnd") - internal static let redGradientStart = ColorAsset(name: "redGradientStart") - internal static let semiTransparentGradientEnd = ColorAsset(name: "semiTransparentGradientEnd") - internal static let semiTransparentGradientStart = ColorAsset(name: "semiTransparentGradientStart") - } - internal enum Shadow { - internal static let drawerShadow = ColorAsset(name: "drawerShadow") - internal static let emptyChipInnerShadow = ColorAsset(name: "emptyChipInnerShadow") - internal static let holdToSendButtonShadow = ColorAsset(name: "holdToSendButtonShadow") - internal static let numberedTextShadow = ColorAsset(name: "numberedTextShadow") - } - internal enum Text { - internal static let activeButtonText = ColorAsset(name: "ActiveButtonText") - internal static let body = ColorAsset(name: "Body") - internal static let button = ColorAsset(name: "Button") - internal static let drawerTabsText = ColorAsset(name: "DrawerTabsText") - internal static let heading = ColorAsset(name: "Heading") - internal static let importSeedEditor = ColorAsset(name: "ImportSeedEditor") - internal static let invalidEntry = ColorAsset(name: "InvalidEntry") - internal static let medium = ColorAsset(name: "Medium") - internal static let regular = ColorAsset(name: "Regular") - internal static let secondaryButtonText = ColorAsset(name: "SecondaryButtonText") - internal static let titleText = ColorAsset(name: "TitleText") - internal static let transactionDetailText = ColorAsset(name: "TransactionDetailText") - internal static let transactionRowSubtitle = ColorAsset(name: "TransactionRowSubtitle") - internal static let validMnemonic = ColorAsset(name: "ValidMnemonic") - internal static let balanceText = ColorAsset(name: "balanceText") - internal static let captionText = ColorAsset(name: "captionText") - internal static let captionTextShadow = ColorAsset(name: "captionTextShadow") - internal static let forDarkBackground = ColorAsset(name: "forDarkBackground") - internal static let highlightedSuperscriptText = ColorAsset(name: "highlightedSuperscriptText") - internal static let moreInfoText = ColorAsset(name: "moreInfoText") - } - internal enum TextField { - internal static let multilineOutline = ColorAsset(name: "MultilineOutline") - internal static let titleAccessoryButton = ColorAsset(name: "TitleAccessoryButton") - internal static let titleAccessoryButtonPressed = ColorAsset(name: "TitleAccessoryButtonPressed") - internal enum Underline { - internal static let gray = ColorAsset(name: "Gray") - internal static let purple = ColorAsset(name: "Purple") - } - } - internal enum TransactionDetail { - internal static let failedMark = ColorAsset(name: "FailedMark") - internal static let highlightMark = ColorAsset(name: "HighlightMark") - internal static let inactiveMark = ColorAsset(name: "InactiveMark") - internal static let neutralMark = ColorAsset(name: "NeutralMark") - internal static let succeededMark = ColorAsset(name: "SucceededMark") - } - internal enum ZcashBadge { - internal static let zcashLogoFill = ColorAsset(name: "ZcashLogoFill") - internal static let innerCircle = ColorAsset(name: "innerCircle") - internal static let outerRingGradientEnd = ColorAsset(name: "outerRingGradientEnd") - internal static let outerRingGradientStart = ColorAsset(name: "outerRingGradientStart") - internal static let shadowColor = ColorAsset(name: "shadowColor") - internal static let thickRing = ColorAsset(name: "thickRing") - internal static let thinRing = ColorAsset(name: "thinRing") - } - } -} -// swiftlint:enable identifier_name line_length nesting type_body_length type_name - -// MARK: - Implementation Details - -internal final class ColorAsset { - internal fileprivate(set) var name: String - - #if os(macOS) - internal typealias SystemColor = NSColor - #elseif os(iOS) || os(tvOS) || os(watchOS) - internal typealias SystemColor = UIColor - #endif - - @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *) - internal private(set) lazy var systemColor: SystemColor = { - guard let color = SystemColor(asset: self) else { - fatalError("Unable to load color asset named \(name).") - } - return color - }() - - internal private(set) lazy var color: Color = { - Color(systemColor) - }() - - fileprivate init(name: String) { - self.name = name - } -} - -internal extension ColorAsset.SystemColor { - @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *) - convenience init?(asset: ColorAsset) { - let bundle = BundleToken.bundle - #if os(iOS) || os(tvOS) - self.init(named: asset.name, in: bundle, compatibleWith: nil) - #elseif os(macOS) - self.init(named: NSColor.Name(asset.name), bundle: bundle) - #elseif os(watchOS) - self.init(named: asset.name) - #endif - } -} - -internal struct ImageAsset { - internal fileprivate(set) var name: String - - #if os(macOS) - internal typealias UniversalImage = NSImage - #elseif os(iOS) || os(tvOS) || os(watchOS) - internal typealias UniversalImage = UIImage - #endif - - internal var systemImage: UniversalImage { - let bundle = BundleToken.bundle - #if os(iOS) || os(tvOS) - let image = UniversalImage(named: name, in: bundle, compatibleWith: nil) - #elseif os(macOS) - let name = NSImage.Name(self.name) - let image = (bundle == .main) ? NSImage(named: name) : bundle.image(forResource: name) - #elseif os(watchOS) - let image = UniversalImage(named: name) - #endif - guard let result = image else { - fatalError("Unable to load image asset named \(name).") - } - return result - } - - internal var image: Image { - let bundle = BundleToken.bundle - return Image(name, bundle: bundle) - } -} - -internal extension ImageAsset.UniversalImage { - @available(macOS, deprecated, - message: "This initializer is unsafe on macOS, please use the ImageAsset.image property") - convenience init?(asset: ImageAsset) { - #if os(iOS) || os(tvOS) - let bundle = BundleToken.bundle - self.init(named: asset.name, in: bundle, compatibleWith: nil) - #elseif os(macOS) - self.init(named: NSImage.Name(asset.name)) - #elseif os(watchOS) - self.init(named: asset.name) - #endif - } -} - -// swiftlint:disable convenience_type -private final class BundleToken { - static let bundle: Bundle = { - #if SWIFT_PACKAGE - return Bundle.module - #else - return Bundle(for: BundleToken.self) - #endif - }() -} - -// swiftlint:enable convenience_type diff --git a/secant/SecantApp.swift b/secant/SecantApp.swift index 8f89cfc..9d2d3ed 100644 --- a/secant/SecantApp.swift +++ b/secant/SecantApp.swift @@ -8,6 +8,8 @@ import SwiftUI import ComposableArchitecture import ZcashLightClientKit +import SDKSynchronizerClient +import Utils final class AppDelegate: NSObject, UIApplicationDelegate { var rootStore: RootStore = .placeholder @@ -73,3 +75,7 @@ public enum TargetConstants { #endif } } + +extension SDKSynchronizerClient: DependencyKey { + public static let liveValue: SDKSynchronizerClient = Self.live(network: TargetConstants.zcashNetwork) +} diff --git a/secant/UI Components/CheckCircle/CheckCircle.swift b/secant/UI Components/CheckCircle/CheckCircle.swift index b032d07..e352a69 100644 --- a/secant/UI Components/CheckCircle/CheckCircle.swift +++ b/secant/UI Components/CheckCircle/CheckCircle.swift @@ -8,6 +8,7 @@ import ComposableArchitecture import SwiftUI +import Generated struct CheckCircle: View { let viewStore: CheckCircleViewStore diff --git a/secant/UI Components/CircularProgress/CircularProgress.swift b/secant/UI Components/CircularProgress/CircularProgress.swift index de99917..4bca5f3 100644 --- a/secant/UI Components/CircularProgress/CircularProgress.swift +++ b/secant/UI Components/CircularProgress/CircularProgress.swift @@ -6,6 +6,7 @@ // import SwiftUI +import Generated struct CircularProgress: View { let outerCircleProgress: Float diff --git a/secant/UI Components/DesignGuide.swift b/secant/UI Components/DesignGuide.swift index e912ec8..a2dd83d 100644 --- a/secant/UI Components/DesignGuide.swift +++ b/secant/UI Components/DesignGuide.swift @@ -5,6 +5,8 @@ // Created by Francisco Gindre on 10/18/21. import SwiftUI +import Generated +import UIComponents struct DesignGuide: View { let columns = [GridItem(.adaptive(minimum: 320, maximum: .infinity))] diff --git a/secant/UI Components/Drawer/Drawer.swift b/secant/UI Components/Drawer/Drawer.swift index dc3a510..8bb2c9e 100644 --- a/secant/UI Components/Drawer/Drawer.swift +++ b/secant/UI Components/Drawer/Drawer.swift @@ -6,6 +6,7 @@ // import SwiftUI +import Generated enum DrawerOverlay { case full diff --git a/secant/UI Components/ImportSeedEditor/ImportSeedEditor.swift b/secant/UI Components/ImportSeedEditor/ImportSeedEditor.swift index 4cf1deb..136d00c 100644 --- a/secant/UI Components/ImportSeedEditor/ImportSeedEditor.swift +++ b/secant/UI Components/ImportSeedEditor/ImportSeedEditor.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct ImportSeedEditor: View { var store: ImportWalletStore diff --git a/secant/UI Components/ProgressIndicators/OnboardingProgressIndicator.swift b/secant/UI Components/ProgressIndicators/OnboardingProgressIndicator.swift index 8f2fd27..8664f53 100644 --- a/secant/UI Components/ProgressIndicators/OnboardingProgressIndicator.swift +++ b/secant/UI Components/ProgressIndicators/OnboardingProgressIndicator.swift @@ -6,6 +6,7 @@ // import SwiftUI +import Generated struct OnboardingProgressStyle: ProgressViewStyle { let height: CGFloat = 3 diff --git a/secant/UI Components/TextFields/Components/TextFieldFooter.swift b/secant/UI Components/TextFields/Components/TextFieldFooter.swift index afd8e7b..4ff58b0 100644 --- a/secant/UI Components/TextFields/Components/TextFieldFooter.swift +++ b/secant/UI Components/TextFields/Components/TextFieldFooter.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct TextFieldFooter: View { var body: some View { diff --git a/secant/UI Components/TextFields/Components/TextFieldTitleAccessoryButtonStyle.swift b/secant/UI Components/TextFields/Components/TextFieldTitleAccessoryButtonStyle.swift index 50dd045..5f28629 100644 --- a/secant/UI Components/TextFields/Components/TextFieldTitleAccessoryButtonStyle.swift +++ b/secant/UI Components/TextFields/Components/TextFieldTitleAccessoryButtonStyle.swift @@ -6,6 +6,7 @@ // import SwiftUI +import Generated struct TextFieldTitleAccessoryButtonStyle: ButtonStyle { func makeBody(configuration: Configuration) -> some View { diff --git a/secant/UI Components/TextFields/MultiLineTextField/MultiLineTextFieldStore.swift b/secant/UI Components/TextFields/MultiLineTextField/MultiLineTextFieldStore.swift index ec76287..87ae740 100644 --- a/secant/UI Components/TextFields/MultiLineTextField/MultiLineTextFieldStore.swift +++ b/secant/UI Components/TextFields/MultiLineTextField/MultiLineTextFieldStore.swift @@ -9,6 +9,7 @@ import Foundation import ComposableArchitecture import SwiftUI import Utils +import Generated typealias MultiLineTextFieldStore = Store typealias MultiLineTextFieldViewStore = ViewStore diff --git a/secant/UI Components/TextFields/MultiLineTextField/MultipleLineTextField.swift b/secant/UI Components/TextFields/MultiLineTextField/MultipleLineTextField.swift index 5e25b6f..6ff0145 100644 --- a/secant/UI Components/TextFields/MultiLineTextField/MultipleLineTextField.swift +++ b/secant/UI Components/TextFields/MultiLineTextField/MultipleLineTextField.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct MultipleLineTextField: View where TitleAccessoryContent: View { diff --git a/secant/UI Components/TextFields/SingleLineTextField.swift b/secant/UI Components/TextFields/SingleLineTextField.swift index 267f2a4..0bb1efb 100644 --- a/secant/UI Components/TextFields/SingleLineTextField.swift +++ b/secant/UI Components/TextFields/SingleLineTextField.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct SingleLineTextField: View where TitleAccessoryContent: View, InputPrefixContent: View, InputAccessoryContent: View { diff --git a/secant/UI Components/TextFields/TCATextField/TCATextField.swift b/secant/UI Components/TextFields/TCATextField/TCATextField.swift index 364bb92..e0e259a 100644 --- a/secant/UI Components/TextFields/TCATextField/TCATextField.swift +++ b/secant/UI Components/TextFields/TCATextField/TCATextField.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct TCATextField: View { let placeholder: String diff --git a/secant/UI Components/TextFields/TransactionAddress/TransactionAddressTextField.swift b/secant/UI Components/TextFields/TransactionAddress/TransactionAddressTextField.swift index da762d3..7720104 100644 --- a/secant/UI Components/TextFields/TransactionAddress/TransactionAddressTextField.swift +++ b/secant/UI Components/TextFields/TransactionAddress/TransactionAddressTextField.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct TransactionAddressTextField: View { let store: TransactionAddressTextFieldStore diff --git a/secant/UI Components/TextFields/TransactionAmount/TransactionAmountTextField.swift b/secant/UI Components/TextFields/TransactionAmount/TransactionAmountTextField.swift index f13406c..0286886 100644 --- a/secant/UI Components/TextFields/TransactionAmount/TransactionAmountTextField.swift +++ b/secant/UI Components/TextFields/TransactionAmount/TransactionAmountTextField.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Generated struct TransactionAmountTextField: View { let store: TransactionAmountTextFieldStore diff --git a/secant/UI Components/ZcashBadge/ZcashBadge.swift b/secant/UI Components/ZcashBadge/ZcashBadge.swift index 106cf60..0fc8519 100644 --- a/secant/UI Components/ZcashBadge/ZcashBadge.swift +++ b/secant/UI Components/ZcashBadge/ZcashBadge.swift @@ -6,6 +6,7 @@ // import SwiftUI +import Generated struct ZcashBadge: View { @Environment(\.colorScheme) var colorScheme diff --git a/secant/Utils/Logging/TCALogging.swift b/secant/Utils/Logging/TCALogging.swift index 13c07ba..bf7176d 100644 --- a/secant/Utils/Logging/TCALogging.swift +++ b/secant/Utils/Logging/TCALogging.swift @@ -8,6 +8,7 @@ import Foundation import os import ZcashLightClientKit +import Utils extension OSLogger { static let live = OSLogger(logLevel: .debug, category: LoggerConstants.tcaLogs) diff --git a/secant/Utils/Logging/WalletLogger.swift b/secant/Utils/Logging/WalletLogger.swift deleted file mode 100644 index baab59d..0000000 --- a/secant/Utils/Logging/WalletLogger.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// WalletLogger.swift -// secant-testnet -// -// Created by Lukáš Korba on 23.01.2023. -// - -import Foundation -import ZcashLightClientKit -import os - -enum LoggerConstants { - static let sdkLogs = "sdkLogs" - static let tcaLogs = "tcaLogs" - static let walletLogs = "walletLogs" -} - -var walletLogger: ZcashLightClientKit.Logger? - -enum LoggerProxy { - static func debug(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { - walletLogger?.debug(message, file: file, function: function, line: line) - } - - static func info(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { - walletLogger?.info(message, file: file, function: function, line: line) - } - - static func event(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { - walletLogger?.event(message, file: file, function: function, line: line) - } - - static func warn(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { - walletLogger?.warn(message, file: file, function: function, line: line) - } - - static func error(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) { - walletLogger?.error(message, file: file, function: function, line: line) - } -} diff --git a/secantTests/BackupFlowTests/RecoveryPhraseBackupTests.swift b/secantTests/BackupFlowTests/RecoveryPhraseBackupTests.swift index 15b0cc9..324695f 100644 --- a/secantTests/BackupFlowTests/RecoveryPhraseBackupTests.swift +++ b/secantTests/BackupFlowTests/RecoveryPhraseBackupTests.swift @@ -6,6 +6,7 @@ // import XCTest +import Models @testable import secant_testnet class RecoveryPhraseBackupTests: XCTestCase { diff --git a/secantTests/BackupFlowTests/RecoveryPhraseDisplayReducerTests.swift b/secantTests/BackupFlowTests/RecoveryPhraseDisplayReducerTests.swift index 9272b64..1c5a219 100644 --- a/secantTests/BackupFlowTests/RecoveryPhraseDisplayReducerTests.swift +++ b/secantTests/BackupFlowTests/RecoveryPhraseDisplayReducerTests.swift @@ -8,6 +8,7 @@ import XCTest import ComposableArchitecture import PasteboardClient +import Models @testable import secant_testnet class RecoveryPhraseDisplayReducerTests: XCTestCase { diff --git a/secantTests/BalanceBreakdownTests/BalanceBreakdownTests.swift b/secantTests/BalanceBreakdownTests/BalanceBreakdownTests.swift index 71d095f..8113a0c 100644 --- a/secantTests/BalanceBreakdownTests/BalanceBreakdownTests.swift +++ b/secantTests/BalanceBreakdownTests/BalanceBreakdownTests.swift @@ -10,6 +10,7 @@ import ComposableArchitecture import ZcashLightClientKit import Combine import Utils +import Generated @testable import secant_testnet class BalanceBreakdownTests: XCTestCase { diff --git a/secantTests/DeeplinkTests/DeeplinkTests.swift b/secantTests/DeeplinkTests/DeeplinkTests.swift index 72dccf6..6ec6f5a 100644 --- a/secantTests/DeeplinkTests/DeeplinkTests.swift +++ b/secantTests/DeeplinkTests/DeeplinkTests.swift @@ -10,6 +10,7 @@ import XCTest import ComposableArchitecture import ZcashLightClientKit import DeeplinkClient +import SDKSynchronizerClient @testable import secant_testnet @MainActor diff --git a/secantTests/RecoveryPhraseValidationTests/RecoveryPhraseValidationFlowFeatureFlagTests.swift b/secantTests/RecoveryPhraseValidationTests/RecoveryPhraseValidationFlowFeatureFlagTests.swift index 626a2c6..afe7d17 100644 --- a/secantTests/RecoveryPhraseValidationTests/RecoveryPhraseValidationFlowFeatureFlagTests.swift +++ b/secantTests/RecoveryPhraseValidationTests/RecoveryPhraseValidationFlowFeatureFlagTests.swift @@ -8,6 +8,10 @@ import XCTest import ComposableArchitecture import MnemonicClient +import RecoveryPhraseValidationFlow +import Models +import UIComponents +import Generated @testable import secant_testnet // swiftlint:disable:next type_name diff --git a/secantTests/RecoveryPhraseValidationTests/RecoveryPhraseValidationTests.swift b/secantTests/RecoveryPhraseValidationTests/RecoveryPhraseValidationTests.swift index 3d48f9f..d18e3cb 100644 --- a/secantTests/RecoveryPhraseValidationTests/RecoveryPhraseValidationTests.swift +++ b/secantTests/RecoveryPhraseValidationTests/RecoveryPhraseValidationTests.swift @@ -7,6 +7,9 @@ // swiftlint:disable type_body_length import XCTest import ComposableArchitecture +import Models +import UIComponents +import RecoveryPhraseValidationFlow @testable import secant_testnet class RecoveryPhraseValidationTests: XCTestCase { diff --git a/secantTests/ReviewRequestTests/ReviewRequestTests.swift b/secantTests/ReviewRequestTests/ReviewRequestTests.swift index 25bcdd2..91d3695 100644 --- a/secantTests/ReviewRequestTests/ReviewRequestTests.swift +++ b/secantTests/ReviewRequestTests/ReviewRequestTests.swift @@ -10,6 +10,8 @@ import ComposableArchitecture import ZcashLightClientKit import DateClient import AppVersionClient +import UserDefaultsClient +import ReviewRequestClient @testable import secant_testnet @MainActor @@ -63,7 +65,7 @@ final class ReviewRequestTests: XCTestCase { let now = Date.now let userDefaultsClient: UserDefaultsClient = .live(userDefaults: userDefaults) - await userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) + userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) store.dependencies.reviewRequest = .live( @@ -80,7 +82,7 @@ final class ReviewRequestTests: XCTestCase { XCTAssertEqual(now.timeIntervalSince1970, storedDate, "Review Request: stored date doesn't match the input.") } - func testCanRequestReview_FirstTime() async throws { + func testCanRequestReview_FirstTime() throws { guard let userDefaults = UserDefaults.init(suiteName: "testCanRequestReview_FirstTime") else { XCTFail("Review Request: UserDefaults failed to initialize") return @@ -89,8 +91,8 @@ final class ReviewRequestTests: XCTestCase { let now = Date.now let userDefaultsClient: UserDefaultsClient = .live(userDefaults: userDefaults) - await userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) - await userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.foundTransactionsKey) + userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) + userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.foundTransactionsKey) let reviewRequest = ReviewRequestClient.live( appVersion: .mock, @@ -103,7 +105,7 @@ final class ReviewRequestTests: XCTestCase { XCTAssertTrue(reviewRequest.canRequestReview()) } - func testCanRequestReview_NewerVersion() async throws { + func testCanRequestReview_NewerVersion() throws { guard let userDefaults = UserDefaults.init(suiteName: "testCanRequestReview_NewerVersion") else { XCTFail("Review Request: UserDefaults failed to initialize") return @@ -112,9 +114,9 @@ final class ReviewRequestTests: XCTestCase { let now = Date.now let userDefaultsClient: UserDefaultsClient = .live(userDefaults: userDefaults) - await userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) - await userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.foundTransactionsKey) - await userDefaultsClient.setValue("0.0.1", ReviewRequestClient.Constants.versionKey) + userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) + userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.foundTransactionsKey) + userDefaultsClient.setValue("0.0.1", ReviewRequestClient.Constants.versionKey) let reviewRequest = ReviewRequestClient.live( appVersion: AppVersionClient( @@ -130,7 +132,7 @@ final class ReviewRequestTests: XCTestCase { XCTAssertTrue(reviewRequest.canRequestReview()) } - func testCanRequestReview_OlderVersion() async throws { + func testCanRequestReview_OlderVersion() throws { guard let userDefaults = UserDefaults.init(suiteName: "testCanRequestReview_OlderVersion") else { XCTFail("Review Request: UserDefaults failed to initialize") return @@ -139,9 +141,9 @@ final class ReviewRequestTests: XCTestCase { let now = Date.now let userDefaultsClient: UserDefaultsClient = .live(userDefaults: userDefaults) - await userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) - await userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.foundTransactionsKey) - await userDefaultsClient.setValue("0.0.2", ReviewRequestClient.Constants.versionKey) + userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) + userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.foundTransactionsKey) + userDefaultsClient.setValue("0.0.2", ReviewRequestClient.Constants.versionKey) let reviewRequest = ReviewRequestClient.live( appVersion: AppVersionClient( @@ -157,7 +159,7 @@ final class ReviewRequestTests: XCTestCase { XCTAssertFalse(reviewRequest.canRequestReview()) } - func testCanRequestReview_MissingSync() async throws { + func testCanRequestReview_MissingSync() throws { guard let userDefaults = UserDefaults.init(suiteName: "testCanRequestReview_MissingSync") else { XCTFail("Review Request: UserDefaults failed to initialize") return @@ -177,7 +179,7 @@ final class ReviewRequestTests: XCTestCase { XCTAssertFalse(reviewRequest.canRequestReview()) } - func testCanRequestReview_MissingTransaction() async throws { + func testCanRequestReview_MissingTransaction() throws { guard let userDefaults = UserDefaults.init(suiteName: "testCanRequestReview_MissingTransaction") else { XCTFail("Review Request: UserDefaults failed to initialize") return @@ -186,8 +188,8 @@ final class ReviewRequestTests: XCTestCase { let now = Date.now let userDefaultsClient: UserDefaultsClient = .live(userDefaults: userDefaults) - await userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) - await userDefaultsClient.setValue("0.0.1", ReviewRequestClient.Constants.versionKey) + userDefaultsClient.setValue("any value", ReviewRequestClient.Constants.latestSyncKey) + userDefaultsClient.setValue("0.0.1", ReviewRequestClient.Constants.versionKey) let reviewRequest = ReviewRequestClient.live( appVersion: AppVersionClient( diff --git a/secantTests/RootTests/AppInitializationTests.swift b/secantTests/RootTests/AppInitializationTests.swift index 43c2ddf..60497ee 100644 --- a/secantTests/RootTests/AppInitializationTests.swift +++ b/secantTests/RootTests/AppInitializationTests.swift @@ -8,6 +8,10 @@ import XCTest import ComposableArchitecture import MnemonicClient +import Models +import UIComponents +import RecoveryPhraseValidationFlow +import Generated @testable import secant_testnet class AppInitializationTests: XCTestCase { diff --git a/secantTests/RootTests/RootTests.swift b/secantTests/RootTests/RootTests.swift index 80a853c..e87208e 100644 --- a/secantTests/RootTests/RootTests.swift +++ b/secantTests/RootTests/RootTests.swift @@ -10,6 +10,7 @@ import ComposableArchitecture import ZcashLightClientKit import FileManager import DatabaseFilesClient +import ZcashSDKEnvironment @testable import secant_testnet class RootTests: XCTestCase { @@ -18,8 +19,7 @@ class RootTests: XCTestCase { func testWalletInitializationState_Uninitialized() throws { let walletState = RootReducer.walletInitializationState( databaseFiles: .noOp, - walletStorage: .noOp, - zcashSDKEnvironment: .testnet + walletStorage: .noOp ) XCTAssertEqual(walletState, .uninitialized) @@ -34,8 +34,7 @@ class RootTests: XCTestCase { let walletState = RootReducer.walletInitializationState( databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)), - walletStorage: .noOp, - zcashSDKEnvironment: .testnet + walletStorage: .noOp ) XCTAssertEqual(walletState, .keysMissing) @@ -50,8 +49,7 @@ class RootTests: XCTestCase { let walletState = RootReducer.walletInitializationState( databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)), - walletStorage: .noOp, - zcashSDKEnvironment: .testnet + walletStorage: .noOp ) XCTAssertEqual(walletState, .uninitialized) @@ -69,8 +67,7 @@ class RootTests: XCTestCase { let walletState = RootReducer.walletInitializationState( databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)), - walletStorage: walletStorage, - zcashSDKEnvironment: .testnet + walletStorage: walletStorage ) XCTAssertEqual(walletState, .filesMissing) @@ -88,8 +85,7 @@ class RootTests: XCTestCase { let walletState = RootReducer.walletInitializationState( databaseFiles: .live(databaseFiles: DatabaseFiles(fileManager: wfmMock)), - walletStorage: walletStorage, - zcashSDKEnvironment: .testnet + walletStorage: walletStorage ) XCTAssertEqual(walletState, .initialized) diff --git a/secantTests/SettingsTests/SettingsTests.swift b/secantTests/SettingsTests/SettingsTests.swift index 24ca8e2..cacd1dd 100644 --- a/secantTests/SettingsTests/SettingsTests.swift +++ b/secantTests/SettingsTests/SettingsTests.swift @@ -9,6 +9,7 @@ import XCTest import Utils import ComposableArchitecture import LogsHandlerClient +import Models @testable import secant_testnet @MainActor diff --git a/secantTests/SnapshotTests/HomeSnapshotTests/HomeSnapshotTests.swift b/secantTests/SnapshotTests/HomeSnapshotTests/HomeSnapshotTests.swift index d378cdc..8af4738 100644 --- a/secantTests/SnapshotTests/HomeSnapshotTests/HomeSnapshotTests.swift +++ b/secantTests/SnapshotTests/HomeSnapshotTests/HomeSnapshotTests.swift @@ -6,9 +6,10 @@ // import XCTest -@testable import secant_testnet import ComposableArchitecture import ZcashLightClientKit +import Models +@testable import secant_testnet class HomeSnapshotTests: XCTestCase { func testHomeSnapshot() throws { diff --git a/secantTests/SnapshotTests/RecoveryPhraseValidationFlowSnapshotTests/RecoveryPhraseValidationFlowSnapshotTests.swift b/secantTests/SnapshotTests/RecoveryPhraseValidationFlowSnapshotTests/RecoveryPhraseValidationFlowSnapshotTests.swift index 62acb8c..47383b0 100644 --- a/secantTests/SnapshotTests/RecoveryPhraseValidationFlowSnapshotTests/RecoveryPhraseValidationFlowSnapshotTests.swift +++ b/secantTests/SnapshotTests/RecoveryPhraseValidationFlowSnapshotTests/RecoveryPhraseValidationFlowSnapshotTests.swift @@ -6,8 +6,9 @@ // import XCTest -@testable import secant_testnet import ComposableArchitecture +import RecoveryPhraseValidationFlow +@testable import secant_testnet // swiftlint:disable:next type_name class RecoveryPhraseValidationFlowSnapshotTests: XCTestCase { diff --git a/secantTests/SnapshotTests/WalletEventsSnapshotTests/WalletEventsSnapshotTests.swift b/secantTests/SnapshotTests/WalletEventsSnapshotTests/WalletEventsSnapshotTests.swift index 82b77ef..5e28a08 100644 --- a/secantTests/SnapshotTests/WalletEventsSnapshotTests/WalletEventsSnapshotTests.swift +++ b/secantTests/SnapshotTests/WalletEventsSnapshotTests/WalletEventsSnapshotTests.swift @@ -6,9 +6,10 @@ // import XCTest -@testable import secant_testnet import ComposableArchitecture import ZcashLightClientKit +import Models +@testable import secant_testnet class WalletEventsSnapshotTests: XCTestCase { func testFullWalletEventsSnapshot() throws { diff --git a/secantTests/UtilTests/LoggerTests.swift b/secantTests/UtilTests/LoggerTests.swift index 82e39b1..d4c0751 100644 --- a/secantTests/UtilTests/LoggerTests.swift +++ b/secantTests/UtilTests/LoggerTests.swift @@ -6,9 +6,10 @@ // import XCTest -@testable import secant_testnet import OSLog import ZcashLightClientKit +import Utils +@testable import secant_testnet class LoggerTests: XCTestCase { let timeToPast: TimeInterval = 0.1 diff --git a/secantTests/UtilTests/SecItemClientTests.swift b/secantTests/UtilTests/SecItemClientTests.swift index b2952c1..129a811 100644 --- a/secantTests/UtilTests/SecItemClientTests.swift +++ b/secantTests/UtilTests/SecItemClientTests.swift @@ -6,6 +6,7 @@ // import XCTest +import SecItem @testable import secant_testnet extension WalletStorage.KeychainError { diff --git a/secantTests/UtilTests/UserPreferencesStorageTests.swift b/secantTests/UtilTests/UserPreferencesStorageTests.swift index a518cd0..2b9442d 100644 --- a/secantTests/UtilTests/UserPreferencesStorageTests.swift +++ b/secantTests/UtilTests/UserPreferencesStorageTests.swift @@ -6,14 +6,15 @@ // import XCTest +import UserDefaultsClient @testable import secant_testnet class UserPreferencesStorageTests: XCTestCase { // swiftlint:disable:next implicitly_unwrapped_optional var storage: UserPreferencesStorage! - override func setUp() async throws { - try await super.setUp() + override func setUp() { + super.setUp() guard let userDefaults = UserDefaults.init(suiteName: "test") else { XCTFail("UserPreferencesStorageTests: UserDefaults.init(suiteName: \"test\") failed to initialize") @@ -29,12 +30,12 @@ class UserPreferencesStorageTests: XCTestCase { userOptedOutOfCrashReporting: true, userDefaults: .live(userDefaults: userDefaults) ) - await storage.removeAll() + storage.removeAll() } - override func tearDown() async throws { - try await super.tearDown() - await storage.removeAll() + override func tearDown() { + super.tearDown() + storage.removeAll() storage = nil } @@ -98,8 +99,7 @@ class UserPreferencesStorageTests: XCTestCase { let mockedUD = UserDefaultsClient( objectForKey: { _ in 87654321.0 }, remove: { _ in }, - setValue: { _, _ in }, - synchronize: { true } + setValue: { _, _ in } ) let mockedStorage = UserPreferencesStorage( @@ -119,8 +119,7 @@ class UserPreferencesStorageTests: XCTestCase { let mockedUD = UserDefaultsClient( objectForKey: { _ in "CZK" }, remove: { _ in }, - setValue: { _, _ in }, - synchronize: { true } + setValue: { _, _ in } ) let mockedStorage = UserPreferencesStorage( @@ -140,8 +139,7 @@ class UserPreferencesStorageTests: XCTestCase { let mockedUD = UserDefaultsClient( objectForKey: { _ in false }, remove: { _ in }, - setValue: { _, _ in }, - synchronize: { true } + setValue: { _, _ in } ) let mockedStorage = UserPreferencesStorage( @@ -161,8 +159,7 @@ class UserPreferencesStorageTests: XCTestCase { let mockedUD = UserDefaultsClient( objectForKey: { _ in false }, remove: { _ in }, - setValue: { _, _ in }, - synchronize: { true } + setValue: { _, _ in } ) let mockedStorage = UserPreferencesStorage( @@ -182,8 +179,7 @@ class UserPreferencesStorageTests: XCTestCase { let mockedUD = UserDefaultsClient( objectForKey: { _ in true }, remove: { _ in }, - setValue: { _, _ in }, - synchronize: { true } + setValue: { _, _ in } ) let mockedStorage = UserPreferencesStorage( @@ -201,7 +197,7 @@ class UserPreferencesStorageTests: XCTestCase { // MARK: - Remove all keys from the live UD environment - func testRemoveAll() async throws { + func testRemoveAll() throws { guard let userDefaults = UserDefaults.init(suiteName: "test") else { XCTFail("User Preferences: UserDefaults.init(suiteName: \"test\") failed to initialize") return @@ -213,7 +209,7 @@ class UserPreferencesStorageTests: XCTestCase { } // remove it - await storage?.removeAll() + storage?.removeAll() // check the presence UserPreferencesStorage.Constants.allCases.forEach { diff --git a/secantTests/WalletEventsTests/WalletEventsTests.swift b/secantTests/WalletEventsTests/WalletEventsTests.swift index bfce085..9e46280 100644 --- a/secantTests/WalletEventsTests/WalletEventsTests.swift +++ b/secantTests/WalletEventsTests/WalletEventsTests.swift @@ -9,6 +9,7 @@ import XCTest import ComposableArchitecture import ZcashLightClientKit import PasteboardClient +import Models @testable import secant_testnet class WalletEventsTests: XCTestCase { diff --git a/swiftgen.yml b/swiftgen.yml index 8f840de..71fcefc 100644 --- a/swiftgen.yml +++ b/swiftgen.yml @@ -1,5 +1,5 @@ -input_dir: secant/Resources/ -output_dir: secant/Resources/Generated/ +input_dir: modules/Sources/Generated/Resources/ +output_dir: modules/Sources/Generated/ xcassets: inputs: @@ -9,6 +9,7 @@ xcassets: templatePath: Templates/xcassets/assets_swift5_swiftui.stencil params: forceProvidesNamespaces: true + publicAccess: true output: XCAssets+Generated.swift fonts: @@ -18,10 +19,14 @@ fonts: - Fonts/Roboto outputs: templatePath: Templates/fonts/fonts_swift5_swiftui.stencil + params: + publicAccess: true output: Fonts+Generated.swift strings: inputs: Localizable.strings outputs: - templateName: structured-swift5 + params: + publicAccess: true output: L10n.swift