diff --git a/app/App/Assets.xcassets/SVG/Fun.imageset/Contents.json b/app/App/Assets.xcassets/SVG/Fun.imageset/Contents.json new file mode 100644 index 00000000..453696b4 --- /dev/null +++ b/app/App/Assets.xcassets/SVG/Fun.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "Fun.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/app/App/Assets.xcassets/SVG/Fun.imageset/Fun.svg b/app/App/Assets.xcassets/SVG/Fun.imageset/Fun.svg new file mode 100644 index 00000000..a7718671 --- /dev/null +++ b/app/App/Assets.xcassets/SVG/Fun.imageset/Fun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/App/Components/Line.swift b/app/App/Components/Line.swift new file mode 100644 index 00000000..246a9ae8 --- /dev/null +++ b/app/App/Components/Line.swift @@ -0,0 +1,17 @@ +// +// Line.swift +// Vault +// +// Created by Charles Lanier on 03/07/2024. +// + +import SwiftUI + +struct Line: Shape { + func path(in rect: CGRect) -> Path { + var path = Path() + path.move(to: CGPoint(x: 0, y: 0)) + path.addLine(to: CGPoint(x: rect.width, y: 0)) + return path + } +} diff --git a/app/App/Models/Model.swift b/app/App/Models/Model.swift index 9037ff45..d28aaeb1 100644 --- a/app/App/Models/Model.swift +++ b/app/App/Models/Model.swift @@ -44,6 +44,8 @@ class Model: ObservableObject { } @Published var onRampQuoteId: String? @Published var onRampTotalUsd: String? + @Published var estSubtotalUsd: Double = 0 + @Published var stripeRedirectUrl: URL? = nil // Sending USDC @Published var recipient: Recipient? @@ -108,10 +110,8 @@ class Model: ObservableObject { private var currentTask: Task? { willSet { - print("Setting new task") if let task = currentTask { if task.isCancelled { return } - print("Cancelling currnet task") task.cancel() // Setting a new task cancelling the current task } @@ -475,13 +475,10 @@ extension Model { self.currentTask = Task { let response = try! await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in VaultService.shared.send(GetFunkitStripeCheckoutQuote(address: self.address, amount: self.amount)) { result in - DispatchQueue.main.async { - switch result { case .success(let response): continuation.resume(returning: response) - print(response.quoteId) case .failure(let error): // TODO: Handle error @@ -492,15 +489,36 @@ extension Model { } // task has been cancelled - if Task.isCancelled { - print("Task has been cancelled, do nothing") - return - } + if Task.isCancelled { return } self.isLoading = false self.onRampQuoteId = response.quoteId self.onRampTotalUsd = response.totalUsd + self.estSubtotalUsd = response.estSubtotalUsd + } + } + + public func createOnrampCheckout() { + guard let quoteId = self.onRampQuoteId else { return } + + VaultService.shared.send( + CreateFunkitStripeCheckout( + quoteId: quoteId, + parsedAmount: self.parsedAmount, + estSubtotalUsd: self.estSubtotalUsd + ) + ) { result in + DispatchQueue.main.async { + switch result { + case .success(let response): + self.stripeRedirectUrl = URL(string: response.stripeRedirectUrl) + + case .failure(let error): + // TODO: Handle error + print(error) + } + } } } } @@ -587,5 +605,8 @@ extension Model { private func initiateOnramp() { self.amount = "0" self.onRampQuoteId = nil + self.onRampTotalUsd = nil + self.estSubtotalUsd = 0 + self.stripeRedirectUrl = nil } } diff --git a/app/App/Navigation/Core/Onramp/AskBirthDateView.swift b/app/App/Navigation/Core/Onramp/AskBirthDateView.swift deleted file mode 100644 index 910501f2..00000000 --- a/app/App/Navigation/Core/Onramp/AskBirthDateView.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// AskBirthDateView.swift -// Vault -// -// Created by Charles Lanier on 01/07/2024. -// - -import SwiftUI - -struct AskBirthDateView: View { - - @Environment(\.dismiss) var dismiss - - @AppStorage("birthDate") var birthDateTimestamp: TimeInterval = 0 - - @State private var birthDate = Calendar.current.date(byAdding: .year, value: -20, to: Date())! - @State private var presentingNextView = false - - private var maxAge = Calendar.current.date(byAdding: .year, value: -18, to: Date())! - - var body: some View { - VStack { - VStack(alignment: .center, spacing: 64) { - VStack(alignment: .center, spacing: 24) { - Text("Verify Your Age") - .textTheme(.headlineLarge) - .multilineTextAlignment(.center) - .fixedSize(horizontal: false, vertical: true) - - Text("Enter your age to complete your profile.") - .textTheme(.headlineSubtitle) - .multilineTextAlignment(.center) - .fixedSize(horizontal: false, vertical: true) - } - - DatePicker( - "", - selection: self.$birthDate, - in: ...maxAge, - displayedComponents: .date - ) - .datePickerStyle(.graphical) - - PrimaryButton("Next") { - self.birthDateTimestamp = self.birthDate.timeIntervalSince1970 - self.presentingNextView = true - } - } - - Spacer() - } - .padding(EdgeInsets(top: 64, leading: 16, bottom: 32, trailing: 16)) - .defaultBackground() - .navigationBarItems( - leading: IconButton { - self.dismiss() - } icon: { - Image(systemName: "chevron.left") - .iconify() - .fontWeight(.bold) - } - ) - .removeNavigationBarBorder() - .navigationBarBackButtonHidden(true) - .navigationDestination(isPresented: $presentingNextView) { - AskHomeAddressView() - } - } -} - -#Preview { - NavigationStack { - AskBirthDateView() - } -} diff --git a/app/App/Navigation/Core/Onramp/AskEmailView.swift b/app/App/Navigation/Core/Onramp/AskEmailView.swift deleted file mode 100644 index dbb7f123..00000000 --- a/app/App/Navigation/Core/Onramp/AskEmailView.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// AskEmailView.swift -// Vault -// -// Created by Charles Lanier on 01/07/2024. -// - -import SwiftUI - -struct AskEmailView: View { - - @Environment(\.dismiss) var dismiss - - @AppStorage("email") var email: String = "" - - @State private var presentingNextView = false - - var body: some View { - VStack { - VStack(alignment: .center, spacing: 64) { - VStack(alignment: .center, spacing: 24) { - Text("Keep in the loop !") - .textTheme(.headlineLarge) - .multilineTextAlignment(.center) - .fixedSize(horizontal: false, vertical: true) - - Text("Enter your email to receive important updates and confirmations.") - .textTheme(.headlineSubtitle) - .multilineTextAlignment(.center) - .fixedSize(horizontal: false, vertical: true) - } - - VStack(alignment: .center, spacing: 32) { - TextInput("example@domain.com", text: self.$email, shouldFocusOnAppear: true) - .keyboardType(.emailAddress) - - PrimaryButton("Next", disabled: !self.email.isValidEmail) { - self.presentingNextView = true - } - } - } - - Spacer() - } - .padding(EdgeInsets(top: 64, leading: 16, bottom: 32, trailing: 16)) - .defaultBackground() - .navigationBarItems( - leading: IconButton { - self.dismiss() - } icon: { - Image(systemName: "chevron.left") - .iconify() - .fontWeight(.bold) - } - ) - .removeNavigationBarBorder() - .navigationBarBackButtonHidden(true) - .navigationBarTitleDisplayMode(.inline) - .navigationDestination(isPresented: $presentingNextView) { - AskFullNameView() - } - } -} - -#Preview { - NavigationStack { - AskEmailView() - } -} diff --git a/app/App/Navigation/Core/Onramp/AskFullNameView.swift b/app/App/Navigation/Core/Onramp/AskFullNameView.swift deleted file mode 100644 index fa65d242..00000000 --- a/app/App/Navigation/Core/Onramp/AskFullNameView.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// AskFullNameView.swift -// Vault -// -// Created by Charles Lanier on 01/07/2024. -// - -import SwiftUI - -struct AskFullNameView: View { - - @Environment(\.dismiss) var dismiss - - @AppStorage("firsName") var firstName: String = "" - @AppStorage("lastName") var lastName: String = "" - - @State private var presentingNextView = false - - var body: some View { - VStack { - VStack(alignment: .center, spacing: 64) { - VStack(alignment: .center, spacing: 24) { - Text("Confirm your full name") - .textTheme(.headlineLarge) - .multilineTextAlignment(.center) - .fixedSize(horizontal: false, vertical: true) - - Text("Please input your full name exactly as it is on your ID. This helps us keep your account secure.") - .textTheme(.headlineSubtitle) - .multilineTextAlignment(.center) - .fixedSize(horizontal: false, vertical: true) - } - - VStack(alignment: .center, spacing: 32) { - VStack(alignment: .center, spacing: 16) { - TextInput("John", text: self.$firstName, shouldFocusOnAppear: true) - - TextInput("Doe", text: self.$lastName) - } - - PrimaryButton("Next", disabled: self.firstName.isEmpty || self.lastName.isEmpty) { - self.presentingNextView = true - } - } - } - - Spacer() - } - .padding(EdgeInsets(top: 64, leading: 16, bottom: 32, trailing: 16)) - .defaultBackground() - .navigationBarItems( - leading: IconButton { - self.dismiss() - } icon: { - Image(systemName: "chevron.left") - .iconify() - .fontWeight(.bold) - } - ) - .removeNavigationBarBorder() - .navigationBarBackButtonHidden(true) - .navigationBarTitleDisplayMode(.inline) - .navigationDestination(isPresented: $presentingNextView) { - AskBirthDateView() - } - } -} diff --git a/app/App/Navigation/Core/Onramp/AskHomeAddress.swift b/app/App/Navigation/Core/Onramp/AskHomeAddress.swift deleted file mode 100644 index 8c6765b4..00000000 --- a/app/App/Navigation/Core/Onramp/AskHomeAddress.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// AskHomeAddress.swift -// Vault -// -// Created by Charles Lanier on 02/07/2024. -// - -import SwiftUI - -struct AskHomeAddressView: View { - - @Environment(\.dismiss) var dismiss - - @AppStorage("homeAddress") var homeAddress: String = "" - - @State private var presentingWebView = false - - private var maxAge = Calendar.current.date(byAdding: .year, value: -18, to: Date())! - - var body: some View { - VStack { - VStack(alignment: .center, spacing: 64) { - VStack(alignment: .center, spacing: 24) { - Text("Almost Finished !") - .textTheme(.headlineLarge) - .multilineTextAlignment(.center) - .fixedSize(horizontal: false, vertical: true) - - Text("Enter your home address to complete your setup. We’ll take care of the rest.") - .textTheme(.headlineSubtitle) - .multilineTextAlignment(.center) - .fixedSize(horizontal: false, vertical: true) - } - - VStack(alignment: .center, spacing: 32) { - TextInput("Address", text: self.$homeAddress, shouldFocusOnAppear: true) - - PrimaryButton("Next", disabled: self.homeAddress.isEmpty) { - self.presentingWebView = true - } - } - } - - Spacer() - } - .padding(EdgeInsets(top: 64, leading: 16, bottom: 32, trailing: 16)) - .defaultBackground() - .navigationBarItems( - leading: IconButton { - self.dismiss() - } icon: { - Image(systemName: "chevron.left") - .iconify() - .fontWeight(.bold) - } - ) - .removeNavigationBarBorder() - .navigationBarBackButtonHidden(true) - .sheet(isPresented: self.$presentingWebView) { - WebView(url: URL(string: "https://google.com")!) - } - } -} - -#Preview { - NavigationStack { - AskHomeAddressView() - } -} diff --git a/app/App/Navigation/Core/Onramp/OnrampAmountView.swift b/app/App/Navigation/Core/Onramp/OnrampAmountView.swift index 30f48670..6160081c 100644 --- a/app/App/Navigation/Core/Onramp/OnrampAmountView.swift +++ b/app/App/Navigation/Core/Onramp/OnrampAmountView.swift @@ -66,7 +66,7 @@ struct OnrampAmountView: View { .navigationBarTitleDisplayMode(.inline) .navigationTitle("Select Amount") .navigationDestination(isPresented: $presentingNextView) { - AskEmailView() + OnrampStripeView() } .onChange(of: self.model.amount) { self.model.getOnrampQuote() diff --git a/app/App/Navigation/Core/Onramp/OnrampStripeView.swift b/app/App/Navigation/Core/Onramp/OnrampStripeView.swift new file mode 100644 index 00000000..3caf13f4 --- /dev/null +++ b/app/App/Navigation/Core/Onramp/OnrampStripeView.swift @@ -0,0 +1,127 @@ +// +// OnrampStripeView.swift +// Vault +// +// Created by Charles Lanier on 01/07/2024. +// + +import SwiftUI + +struct OnrampStripeView: View { + + @Environment(\.dismiss) var dismiss + + @EnvironmentObject private var model: Model + + @State private var presentingNextView = false + + var body: some View { + ZStack { + if let stripeRedirectUrl = self.model.stripeRedirectUrl { + WebView(url: stripeRedirectUrl) + } else { + VStack { + Spacer() + + Spacer().frame(height: 32) + + HStack { + Spacer(minLength: 24) + + HStack { + Image(.logo) + .iconify() + .frame(width: 64) + .foregroundStyle(.background1) + .padding(.top, 8) + } + .frame(width: 100, height: 100) + .background(.neutral1) + .clipShape(Circle()) + + Line() + .stroke(style: StrokeStyle(lineWidth: 1, dash: [5])) + .frame(height: 1) + + HStack { + Image(.fun) + .iconify() + .frame(width: 64) + .foregroundStyle(.background1) + .padding(.bottom, 8) + } + .frame(width: 100, height: 100) + .background(.neutral1) + .clipShape(Circle()) + + Spacer(minLength: 24) + } + + Spacer().frame(height: 64) + + VStack(spacing: 16) { + Text("Vault x Fun").textTheme(.headlineLarge) + + Text("Please wait a few moments on this screen") + .textTheme(.headlineSubtitle) + .multilineTextAlignment(.center) + } + + Spacer() + + HStack(alignment: .center, spacing: 4) { + ZStack { + Image(systemName: "shield.fill").foregroundStyle(.accent) + .font(.system(size: 22)) + + Image(systemName: "lock.fill") + .padding(.bottom, 2) + .font(.system(size: 12)) + .fontWeight(.bold) + .foregroundStyle(.neutral1) + } + + Text("Payment secured by").textTheme(.bodyPrimary) + + Text("Stripe") + .textTheme(.headlineMedium) + .padding(.top, 4) + + Spacer().frame(width: 12) + } + } + .padding(EdgeInsets(top: 0, leading: 16, bottom: 8, trailing: 16)) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .onAppear { + self.model.createOnrampCheckout() + } + .navigationBarItems( + leading: IconButton { + self.dismiss() + } icon: { + Image(systemName: "chevron.left") + .iconify() + .fontWeight(.bold) + } + ) + .defaultBackground() + .removeNavigationBarBorder() + .navigationBarBackButtonHidden(true) + .navigationBarTitleDisplayMode(.inline) + .navigationTitle("Checkout") + } +} + +#if DEBUG +struct OnrampStripeViewPreviews : PreviewProvider { + + @StateObject static var model = Model() + + static var previews: some View { + OnrampStripeView() + .environmentObject(self.model) + } +} +#endif diff --git a/app/App/Services/VaultAPI/Models/FunkitStripeCheckout.swift b/app/App/Services/VaultAPI/Models/FunkitStripeCheckout.swift new file mode 100644 index 00000000..34b31d4a --- /dev/null +++ b/app/App/Services/VaultAPI/Models/FunkitStripeCheckout.swift @@ -0,0 +1,20 @@ +// +// FunkitStripeCheckout.swift +// Vault +// +// Created by Charles Lanier on 03/07/2024. +// + +import Foundation + + +public struct FunkitStripeCheckout: Decodable { + public let stripeCheckoutId: String + public let stripeRedirectUrl: String + public let funkitDepositAddress: String +} + + +//"stripeCheckoutId": "cos_1PVjoJCLFtXbeHljSqENG8EX", +//"stripeRedirectUrl": "https://crypto.link.com?session_hash=CCwQARoXChVhY2N0XzFQMUM1aENMRnRYYmVIbGoo_8PtswYyBvLEArs-lzotpIVcOo5xRizqxo51f_a6heze3V8sZAGkN1KRsvkFrKnhSf084RfpQ4-Iws7u", +//"funkitDepositAddress": "0 diff --git a/app/App/Services/VaultAPI/Requests/CreateFunkitStripeCheckout.swift b/app/App/Services/VaultAPI/Requests/CreateFunkitStripeCheckout.swift new file mode 100644 index 00000000..aae76fb9 --- /dev/null +++ b/app/App/Services/VaultAPI/Requests/CreateFunkitStripeCheckout.swift @@ -0,0 +1,39 @@ +// +// CreateFunkitStripeCheckout.swift +// Vault +// +// Created by Charles Lanier on 03/07/2024. +// + +import Foundation + +public struct CreateFunkitStripeCheckout: APIRequest { + + public typealias Response = FunkitStripeCheckout + + // Notice how we create a composed resourceName + public var resourceName: String { + return "create_funkit_stripe_checkout" + } + + public var httpMethod: HTTPMethod { + return .POST + } + + public var headers: [String : String] { + return ["Content-Type": "application/json"] + } + + // Parameters + public let quoteId: String + public let paymentTokenAmount: Double + public let estSubtotalUsd: Double + public let isNy: Bool + + public init(quoteId: String, parsedAmount: Double, estSubtotalUsd: Double) { + self.quoteId = quoteId + self.paymentTokenAmount = parsedAmount + self.estSubtotalUsd = estSubtotalUsd + self.isNy = false + } +} diff --git a/app/Vault.xcodeproj/project.pbxproj b/app/Vault.xcodeproj/project.pbxproj index b199da35..125815d5 100644 --- a/app/Vault.xcodeproj/project.pbxproj +++ b/app/Vault.xcodeproj/project.pbxproj @@ -22,6 +22,9 @@ 9C286B562C32E84200D27A9D /* OnrampAmountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C286B552C32E84200D27A9D /* OnrampAmountView.swift */; }; 9C286B582C32EB9B00D27A9D /* OnrampView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C286B572C32EB9B00D27A9D /* OnrampView.swift */; }; 9C2D8D522C35887E008D6174 /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2D8D512C35887E008D6174 /* Placeholder.swift */; }; + 9C2D8D542C35A582008D6174 /* CreateFunkitStripeCheckout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2D8D532C35A582008D6174 /* CreateFunkitStripeCheckout.swift */; }; + 9C2D8D562C35CA13008D6174 /* FunkitStripeCheckout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2D8D552C35CA13008D6174 /* FunkitStripeCheckout.swift */; }; + 9C2D8D582C360036008D6174 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2D8D572C360036008D6174 /* Line.swift */; }; 9C2E73C32BF39635004FFFD1 /* BalanceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2E73C22BF39635004FFFD1 /* BalanceView.swift */; }; 9C2E73C52BF3CB86004FFFD1 /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2E73C42BF3CB86004FFFD1 /* Background.swift */; }; 9C4F45192BDE949D00D44CBE /* SecureEnclaveManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C4F45182BDE949D00D44CBE /* SecureEnclaveManager.swift */; }; @@ -100,11 +103,8 @@ 9CD778D02BC43F7400BA4677 /* PhoneNumberKit in Frameworks */ = {isa = PBXBuildFile; productRef = 9CD778CF2BC43F7400BA4677 /* PhoneNumberKit */; }; 9CD778D22BC4423C00BA4677 /* PhoneInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CD778D12BC4423C00BA4677 /* PhoneInput.swift */; }; 9CD778D42BC4426D00BA4677 /* View+placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CD778D32BC4426D00BA4677 /* View+placeholder.swift */; }; - 9CDAF8362C32F98600BCFEDF /* AskEmailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDAF8352C32F98600BCFEDF /* AskEmailView.swift */; }; - 9CDAF8382C32FAFD00BCFEDF /* AskFullNameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDAF8372C32FAFD00BCFEDF /* AskFullNameView.swift */; }; - 9CDAF83A2C32FE1E00BCFEDF /* AskBirthDateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDAF8392C32FE1E00BCFEDF /* AskBirthDateView.swift */; }; + 9CDAF8362C32F98600BCFEDF /* OnrampStripeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDAF8352C32F98600BCFEDF /* OnrampStripeView.swift */; }; 9CDAF83C2C346D7C00BCFEDF /* String+Email.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDAF83B2C346D7C00BCFEDF /* String+Email.swift */; }; - 9CDAF83E2C34AF8F00BCFEDF /* AskHomeAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDAF83D2C34AF8F00BCFEDF /* AskHomeAddress.swift */; }; 9CDAF8402C355CA100BCFEDF /* GetFunkitStripeCheckoutQuote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDAF83F2C355CA100BCFEDF /* GetFunkitStripeCheckoutQuote.swift */; }; 9CDAF8422C355E4100BCFEDF /* FunkitStripeCheckoutQuote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDAF8412C355E4100BCFEDF /* FunkitStripeCheckoutQuote.swift */; }; 9CDD91B92C24129E00EA20CC /* VaultPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDD91B82C24129E00EA20CC /* VaultPage.swift */; }; @@ -161,6 +161,9 @@ 9C286B552C32E84200D27A9D /* OnrampAmountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnrampAmountView.swift; sourceTree = ""; }; 9C286B572C32EB9B00D27A9D /* OnrampView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnrampView.swift; sourceTree = ""; }; 9C2D8D512C35887E008D6174 /* Placeholder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Placeholder.swift; sourceTree = ""; }; + 9C2D8D532C35A582008D6174 /* CreateFunkitStripeCheckout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateFunkitStripeCheckout.swift; sourceTree = ""; }; + 9C2D8D552C35CA13008D6174 /* FunkitStripeCheckout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunkitStripeCheckout.swift; sourceTree = ""; }; + 9C2D8D572C360036008D6174 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = ""; }; 9C2E73C22BF39635004FFFD1 /* BalanceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BalanceView.swift; sourceTree = ""; }; 9C2E73C42BF3CB86004FFFD1 /* Background.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Background.swift; sourceTree = ""; }; 9C4F45182BDE949D00D44CBE /* SecureEnclaveManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureEnclaveManager.swift; sourceTree = ""; }; @@ -239,11 +242,8 @@ 9CD778CC2BC3115E00BA4677 /* PhoneValidationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneValidationView.swift; sourceTree = ""; }; 9CD778D12BC4423C00BA4677 /* PhoneInput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneInput.swift; sourceTree = ""; }; 9CD778D32BC4426D00BA4677 /* View+placeholder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+placeholder.swift"; sourceTree = ""; }; - 9CDAF8352C32F98600BCFEDF /* AskEmailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskEmailView.swift; sourceTree = ""; }; - 9CDAF8372C32FAFD00BCFEDF /* AskFullNameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskFullNameView.swift; sourceTree = ""; }; - 9CDAF8392C32FE1E00BCFEDF /* AskBirthDateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskBirthDateView.swift; sourceTree = ""; }; + 9CDAF8352C32F98600BCFEDF /* OnrampStripeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnrampStripeView.swift; sourceTree = ""; }; 9CDAF83B2C346D7C00BCFEDF /* String+Email.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Email.swift"; sourceTree = ""; }; - 9CDAF83D2C34AF8F00BCFEDF /* AskHomeAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskHomeAddress.swift; sourceTree = ""; }; 9CDAF83F2C355CA100BCFEDF /* GetFunkitStripeCheckoutQuote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetFunkitStripeCheckoutQuote.swift; sourceTree = ""; }; 9CDAF8412C355E4100BCFEDF /* FunkitStripeCheckoutQuote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunkitStripeCheckoutQuote.swift; sourceTree = ""; }; 9CDD91B82C24129E00EA20CC /* VaultPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VaultPage.swift; sourceTree = ""; }; @@ -360,10 +360,7 @@ children = ( 9C286B552C32E84200D27A9D /* OnrampAmountView.swift */, 9C286B572C32EB9B00D27A9D /* OnrampView.swift */, - 9CDAF8352C32F98600BCFEDF /* AskEmailView.swift */, - 9CDAF8372C32FAFD00BCFEDF /* AskFullNameView.swift */, - 9CDAF8392C32FE1E00BCFEDF /* AskBirthDateView.swift */, - 9CDAF83D2C34AF8F00BCFEDF /* AskHomeAddress.swift */, + 9CDAF8352C32F98600BCFEDF /* OnrampStripeView.swift */, ); path = Onramp; sourceTree = ""; @@ -452,6 +449,7 @@ 9CD0988B2C22E33800FDDD8F /* Transaction.swift */, 9C59C9452C30B35D0074F23B /* User.swift */, 9CDAF8412C355E4100BCFEDF /* FunkitStripeCheckoutQuote.swift */, + 9C2D8D552C35CA13008D6174 /* FunkitStripeCheckout.swift */, ); path = Models; sourceTree = ""; @@ -465,6 +463,7 @@ 9CD098892C22E32300FDDD8F /* GetTransactionsHistory.swift */, 9C59C9432C30B2790074F23B /* GetUser.swift */, 9CDAF83F2C355CA100BCFEDF /* GetFunkitStripeCheckoutQuote.swift */, + 9C2D8D532C35A582008D6174 /* CreateFunkitStripeCheckout.swift */, ); path = Requests; sourceTree = ""; @@ -646,6 +645,7 @@ 9CDFD4372BAB8934000466B9 /* Buttons.swift */, 9CD778AD2BBC1A7300BA4677 /* GraphView.swift */, 9C9098782C2AED57002A5833 /* ActivityView.swift */, + 9C2D8D572C360036008D6174 /* Line.swift */, ); path = Components; sourceTree = ""; @@ -823,7 +823,6 @@ 9C62590A2BF79F8C0039DE9C /* NumPad.swift in Sources */, 9CE7A75B2BE12CBC008509FE /* Data+Hex.swift in Sources */, 9CD778BC2BBED06700BA4677 /* CustomTabBar.swift in Sources */, - 9CDAF83E2C34AF8F00BCFEDF /* AskHomeAddress.swift in Sources */, 9C637CE02BB0C0E5005816B4 /* Input.swift in Sources */, 9CD778B02BBC1A9C00BA4677 /* View+if.swift in Sources */, 9C1C9D862C0D0F320028C8FD /* Uint256.swift in Sources */, @@ -832,7 +831,6 @@ 9CD7789F2BB185C200BA4677 /* CelebrationView.swift in Sources */, 9CDAF8402C355CA100BCFEDF /* GetFunkitStripeCheckoutQuote.swift in Sources */, 9CD390FB2BEAB6C600238FE9 /* WebView.swift in Sources */, - 9CDAF83A2C32FE1E00BCFEDF /* AskBirthDateView.swift in Sources */, 9CDAF83C2C346D7C00BCFEDF /* String+Email.swift in Sources */, 9C09176F2C2573580068FAF5 /* Transactions.swift in Sources */, 9C1C9D962C105E3D0028C8FD /* Amount.swift in Sources */, @@ -846,16 +844,19 @@ 9C9F9EF12C22368200620AC6 /* Deployment.swift in Sources */, 9CD0988E2C22EBE500FDDD8F /* History.swift in Sources */, 9C9F9EF02C22368200620AC6 /* Balance.swift in Sources */, + 9C2D8D582C360036008D6174 /* Line.swift in Sources */, 9C1C9D8C2C0DEBAE0028C8FD /* CountryData.swift in Sources */, 9C09177B2C25D2810068FAF5 /* RequestingView.swift in Sources */, 9C286B562C32E84200D27A9D /* OnrampAmountView.swift in Sources */, 9CDFD4382BAB8934000466B9 /* Buttons.swift in Sources */, + 9C2D8D562C35CA13008D6174 /* FunkitStripeCheckout.swift in Sources */, 9C1C9D902C0F5DE40028C8FD /* Popover.swift in Sources */, 9C1C9D942C0FBA900028C8FD /* Avatar.swift in Sources */, 9C62591B2BFCF0650039DE9C /* SendingView.swift in Sources */, 9CDFD4432BADA297000466B9 /* BiometricAuthManager.swift in Sources */, 9CD778B62BBCB0DE00BA4677 /* Constants.swift in Sources */, 9CE7A75D2BE15C21008509FE /* SpinnerView.swift in Sources */, + 9C2D8D542C35A582008D6174 /* CreateFunkitStripeCheckout.swift in Sources */, 9C637CD92BB09710005816B4 /* NotificationsManager.swift in Sources */, 9C9F9EF92C22368200620AC6 /* VerifyOTP.swift in Sources */, 9C59C9462C30B35D0074F23B /* User.swift in Sources */, @@ -896,7 +897,6 @@ 9C637CDB2BB09C4D005816B4 /* Notification.swift in Sources */, 9CDFD4402BAD83E7000466B9 /* ThemedText.swift in Sources */, 9CD1BE8A2BCD4F5B0077A60B /* OTPInput.swift in Sources */, - 9CDAF8382C32FAFD00BCFEDF /* AskFullNameView.swift in Sources */, 9CD778AE2BBC1A7300BA4677 /* GraphView.swift in Sources */, 9CD778C02BBF1E5C00BA4677 /* EdgeBorder.swift in Sources */, 9CDFD43C2BAC8BE6000466B9 /* FaceIDView.swift in Sources */, @@ -915,7 +915,7 @@ 9C6259082BF79F140039DE9C /* FancyAmount.swift in Sources */, 9C62591F2BFE56000039DE9C /* ContactRow.swift in Sources */, 9C5CFDAE2BC828C9001776E1 /* Model.swift in Sources */, - 9CDAF8362C32F98600BCFEDF /* AskEmailView.swift in Sources */, + 9CDAF8362C32F98600BCFEDF /* OnrampStripeView.swift in Sources */, 9CD0988A2C22E32300FDDD8F /* GetTransactionsHistory.swift in Sources */, 9C9098792C2AED57002A5833 /* ActivityView.swift in Sources */, 9CD1BE982BD7C51A0077A60B /* PhoneNumber+Parse.swift in Sources */,