testnet build config + navigation scaffold

This commit is contained in:
Francisco Gindre 2021-08-24 11:45:03 -03:00
parent 15ef90cb40
commit 49a01c1014
28 changed files with 939 additions and 14 deletions

View File

@ -15,12 +15,36 @@
0D1922F426BDE5F200052649 /* MnemonicSeedPhraseHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D1922F326BDE5F200052649 /* MnemonicSeedPhraseHandling.swift */; };
0D1922F626BDE74500052649 /* KeyStoring.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D1922F526BDE74500052649 /* KeyStoring.swift */; };
0D1922F826BDEB3500052649 /* MockServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D1922F726BDEB3500052649 /* MockServices.swift */; };
0D2ACE8026C2C67100D62E3C /* Zboto.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0D2ACE7F26C2C67100D62E3C /* Zboto.otf */; };
0D2ACE8326C2C8B400D62E3C /* SwiftUI+secant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D2ACE8226C2C8B400D62E3C /* SwiftUI+secant.swift */; };
0D32281926C5864B00262533 /* ProfileScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32281726C5864B00262533 /* ProfileScreen.swift */; };
0D32281A26C5864B00262533 /* ProfileScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32281826C5864B00262533 /* ProfileScreenViewModel.swift */; };
0D32281E26C5867D00262533 /* ScanQrScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32281C26C5867D00262533 /* ScanQrScreen.swift */; };
0D32281F26C5867D00262533 /* ScanQrScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32281D26C5867D00262533 /* ScanQrScreenViewModel.swift */; };
0D32282326C586A800262533 /* HistoryScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32282126C586A800262533 /* HistoryScreen.swift */; };
0D32282426C586A800262533 /* HistoryScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32282226C586A800262533 /* HistoryScreenViewModel.swift */; };
0D32282826C586E000262533 /* RequestZcashScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32282626C586E000262533 /* RequestZcashScreen.swift */; };
0D32282926C586E000262533 /* RequestZcashScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32282726C586E000262533 /* RequestZcashScreenViewModel.swift */; };
0D32282D26C5870B00262533 /* SendScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32282B26C5870B00262533 /* SendScreen.swift */; };
0D32282E26C5870B00262533 /* SendScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32282C26C5870B00262533 /* SendScreenViewModel.swift */; };
0D32283226C5877A00262533 /* BalanceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32283026C5877A00262533 /* BalanceScreen.swift */; };
0D32283326C5877A00262533 /* BalanceScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D32283126C5877A00262533 /* BalanceScreenViewModel.swift */; };
0D4E7A0926B364170058B01E /* SecantApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0826B364170058B01E /* SecantApp.swift */; };
0D4E7A0B26B364170058B01E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0A26B364170058B01E /* ContentView.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 */; };
0D4E7A1B26B364180058B01E /* secantTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A1A26B364180058B01E /* secantTests.swift */; };
0D4E7A2626B364180058B01E /* secantUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A2526B364180058B01E /* secantUITests.swift */; };
0DA13C8F26C15D1D00E3B610 /* WelcomeScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13C8D26C15D1D00E3B610 /* WelcomeScreen.swift */; };
0DA13C9026C15D1D00E3B610 /* WelcomeScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13C8E26C15D1D00E3B610 /* WelcomeScreenViewModel.swift */; };
0DA13C9326C15E2F00E3B610 /* PlainButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13C9226C15E2F00E3B610 /* PlainButton.swift */; };
0DA13C9726C186FF00E3B610 /* RestoreWalletScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13C9526C186FF00E3B610 /* RestoreWalletScreen.swift */; };
0DA13C9826C186FF00E3B610 /* RestoreWalletScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13C9626C186FF00E3B610 /* RestoreWalletScreenViewModel.swift */; };
0DA13C9C26C1942100E3B610 /* BackupWalletScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13C9A26C1942100E3B610 /* BackupWalletScreen.swift */; };
0DA13C9D26C1942100E3B610 /* BackupWalletScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13C9B26C1942100E3B610 /* BackupWalletScreenViewModel.swift */; };
0DA13CA126C1955600E3B610 /* HomeScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13C9F26C1955600E3B610 /* HomeScreen.swift */; };
0DA13CA226C1955600E3B610 /* HomeScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13CA026C1955600E3B610 /* HomeScreenViewModel.swift */; };
0DA13CA526C1963000E3B610 /* Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DA13CA426C1963000E3B610 /* Balance.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -49,7 +73,21 @@
0D1922F326BDE5F200052649 /* MnemonicSeedPhraseHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MnemonicSeedPhraseHandling.swift; sourceTree = "<group>"; };
0D1922F526BDE74500052649 /* KeyStoring.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyStoring.swift; sourceTree = "<group>"; };
0D1922F726BDEB3500052649 /* MockServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockServices.swift; sourceTree = "<group>"; };
0D4E7A0526B364170058B01E /* secant.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = secant.app; sourceTree = BUILT_PRODUCTS_DIR; };
0D2ACE7F26C2C67100D62E3C /* Zboto.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Zboto.otf; sourceTree = "<group>"; };
0D2ACE8226C2C8B400D62E3C /* SwiftUI+secant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SwiftUI+secant.swift"; sourceTree = "<group>"; };
0D32281726C5864B00262533 /* ProfileScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileScreen.swift; sourceTree = "<group>"; };
0D32281826C5864B00262533 /* ProfileScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileScreenViewModel.swift; sourceTree = "<group>"; };
0D32281C26C5867D00262533 /* ScanQrScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanQrScreen.swift; sourceTree = "<group>"; };
0D32281D26C5867D00262533 /* ScanQrScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanQrScreenViewModel.swift; sourceTree = "<group>"; };
0D32282126C586A800262533 /* HistoryScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryScreen.swift; sourceTree = "<group>"; };
0D32282226C586A800262533 /* HistoryScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryScreenViewModel.swift; sourceTree = "<group>"; };
0D32282626C586E000262533 /* RequestZcashScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestZcashScreen.swift; sourceTree = "<group>"; };
0D32282726C586E000262533 /* RequestZcashScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestZcashScreenViewModel.swift; sourceTree = "<group>"; };
0D32282B26C5870B00262533 /* SendScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendScreen.swift; sourceTree = "<group>"; };
0D32282C26C5870B00262533 /* SendScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendScreenViewModel.swift; sourceTree = "<group>"; };
0D32283026C5877A00262533 /* BalanceScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BalanceScreen.swift; sourceTree = "<group>"; };
0D32283126C5877A00262533 /* BalanceScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BalanceScreenViewModel.swift; sourceTree = "<group>"; };
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 = "<group>"; };
0D4E7A0A26B364170058B01E /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
0D4E7A0C26B364180058B01E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@ -61,6 +99,16 @@
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 = "<group>"; };
0D4E7A2726B364180058B01E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
0DA13C8D26C15D1D00E3B610 /* WelcomeScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeScreen.swift; sourceTree = "<group>"; };
0DA13C8E26C15D1D00E3B610 /* WelcomeScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeScreenViewModel.swift; sourceTree = "<group>"; };
0DA13C9226C15E2F00E3B610 /* PlainButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlainButton.swift; sourceTree = "<group>"; };
0DA13C9526C186FF00E3B610 /* RestoreWalletScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RestoreWalletScreen.swift; sourceTree = "<group>"; };
0DA13C9626C186FF00E3B610 /* RestoreWalletScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RestoreWalletScreenViewModel.swift; sourceTree = "<group>"; };
0DA13C9A26C1942100E3B610 /* BackupWalletScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupWalletScreen.swift; sourceTree = "<group>"; };
0DA13C9B26C1942100E3B610 /* BackupWalletScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupWalletScreenViewModel.swift; sourceTree = "<group>"; };
0DA13C9F26C1955600E3B610 /* HomeScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreen.swift; sourceTree = "<group>"; };
0DA13CA026C1955600E3B610 /* HomeScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenViewModel.swift; sourceTree = "<group>"; };
0DA13CA426C1963000E3B610 /* Balance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Balance.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -118,6 +166,16 @@
0D1922EB26BDD9A500052649 /* Screens */ = {
isa = PBXGroup;
children = (
0D32282F26C5874B00262533 /* Balance */,
0D32282A26C586E700262533 /* Send ZEC */,
0D32282526C586C600262533 /* Request ZEC */,
0D32282026C5868F00262533 /* History */,
0D32281B26C5865900262533 /* Scan */,
0D32281526C5862400262533 /* Profile */,
0DA13C9E26C1953F00E3B610 /* Home */,
0DA13C9926C193FE00E3B610 /* Backup Wallet */,
0DA13C9426C186B100E3B610 /* Restore Wallet */,
0DA13C8C26C15CBE00E3B610 /* Welcome Screen */,
);
path = Screens;
sourceTree = "<group>";
@ -131,6 +189,76 @@
path = Stubs;
sourceTree = "<group>";
};
0D2ACE7E26C2C65E00D62E3C /* Fonts */ = {
isa = PBXGroup;
children = (
0D2ACE7F26C2C67100D62E3C /* Zboto.otf */,
);
path = Fonts;
sourceTree = "<group>";
};
0D2ACE8126C2C71100D62E3C /* Utilities */ = {
isa = PBXGroup;
children = (
0D2ACE8226C2C8B400D62E3C /* SwiftUI+secant.swift */,
);
path = Utilities;
sourceTree = "<group>";
};
0D32281526C5862400262533 /* Profile */ = {
isa = PBXGroup;
children = (
0D32281726C5864B00262533 /* ProfileScreen.swift */,
0D32281826C5864B00262533 /* ProfileScreenViewModel.swift */,
);
path = Profile;
sourceTree = "<group>";
};
0D32281B26C5865900262533 /* Scan */ = {
isa = PBXGroup;
children = (
0D32281C26C5867D00262533 /* ScanQrScreen.swift */,
0D32281D26C5867D00262533 /* ScanQrScreenViewModel.swift */,
);
path = Scan;
sourceTree = "<group>";
};
0D32282026C5868F00262533 /* History */ = {
isa = PBXGroup;
children = (
0D32282126C586A800262533 /* HistoryScreen.swift */,
0D32282226C586A800262533 /* HistoryScreenViewModel.swift */,
);
path = History;
sourceTree = "<group>";
};
0D32282526C586C600262533 /* Request ZEC */ = {
isa = PBXGroup;
children = (
0D32282626C586E000262533 /* RequestZcashScreen.swift */,
0D32282726C586E000262533 /* RequestZcashScreenViewModel.swift */,
);
path = "Request ZEC";
sourceTree = "<group>";
};
0D32282A26C586E700262533 /* Send ZEC */ = {
isa = PBXGroup;
children = (
0D32282B26C5870B00262533 /* SendScreen.swift */,
0D32282C26C5870B00262533 /* SendScreenViewModel.swift */,
);
path = "Send ZEC";
sourceTree = "<group>";
};
0D32282F26C5874B00262533 /* Balance */ = {
isa = PBXGroup;
children = (
0D32283026C5877A00262533 /* BalanceScreen.swift */,
0D32283126C5877A00262533 /* BalanceScreenViewModel.swift */,
);
path = Balance;
sourceTree = "<group>";
};
0D4E79FC26B364170058B01E = {
isa = PBXGroup;
children = (
@ -144,7 +272,7 @@
0D4E7A0626B364170058B01E /* Products */ = {
isa = PBXGroup;
children = (
0D4E7A0526B364170058B01E /* secant.app */,
0D4E7A0526B364170058B01E /* secant-testnet.app */,
0D4E7A1626B364180058B01E /* secantTests.xctest */,
0D4E7A2126B364180058B01E /* secantUITests.xctest */,
);
@ -154,6 +282,10 @@
0D4E7A0726B364170058B01E /* secant */ = {
isa = PBXGroup;
children = (
0D2ACE8126C2C71100D62E3C /* Utilities */,
0D2ACE7E26C2C65E00D62E3C /* Fonts */,
0DA13CA326C1960A00E3B610 /* Models */,
0DA13C9126C15E1900E3B610 /* UI Components */,
0D1922F026BDE27D00052649 /* Stubs */,
0D1922EB26BDD9A500052649 /* Screens */,
0D1922E826BDD95000052649 /* Base */,
@ -194,12 +326,64 @@
path = secantUITests;
sourceTree = "<group>";
};
0DA13C8C26C15CBE00E3B610 /* Welcome Screen */ = {
isa = PBXGroup;
children = (
0DA13C8D26C15D1D00E3B610 /* WelcomeScreen.swift */,
0DA13C8E26C15D1D00E3B610 /* WelcomeScreenViewModel.swift */,
);
path = "Welcome Screen";
sourceTree = "<group>";
};
0DA13C9126C15E1900E3B610 /* UI Components */ = {
isa = PBXGroup;
children = (
0DA13C9226C15E2F00E3B610 /* PlainButton.swift */,
);
path = "UI Components";
sourceTree = "<group>";
};
0DA13C9426C186B100E3B610 /* Restore Wallet */ = {
isa = PBXGroup;
children = (
0DA13C9526C186FF00E3B610 /* RestoreWalletScreen.swift */,
0DA13C9626C186FF00E3B610 /* RestoreWalletScreenViewModel.swift */,
);
path = "Restore Wallet";
sourceTree = "<group>";
};
0DA13C9926C193FE00E3B610 /* Backup Wallet */ = {
isa = PBXGroup;
children = (
0DA13C9A26C1942100E3B610 /* BackupWalletScreen.swift */,
0DA13C9B26C1942100E3B610 /* BackupWalletScreenViewModel.swift */,
);
path = "Backup Wallet";
sourceTree = "<group>";
};
0DA13C9E26C1953F00E3B610 /* Home */ = {
isa = PBXGroup;
children = (
0DA13C9F26C1955600E3B610 /* HomeScreen.swift */,
0DA13CA026C1955600E3B610 /* HomeScreenViewModel.swift */,
);
path = Home;
sourceTree = "<group>";
};
0DA13CA326C1960A00E3B610 /* Models */ = {
isa = PBXGroup;
children = (
0DA13CA426C1963000E3B610 /* Balance.swift */,
);
path = Models;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
0D4E7A0426B364170058B01E /* secant */ = {
0D4E7A0426B364170058B01E /* secant-testnet */ = {
isa = PBXNativeTarget;
buildConfigurationList = 0D4E7A2A26B364180058B01E /* Build configuration list for PBXNativeTarget "secant" */;
buildConfigurationList = 0D4E7A2A26B364180058B01E /* Build configuration list for PBXNativeTarget "secant-testnet" */;
buildPhases = (
0D4E7A0126B364170058B01E /* Sources */,
0D4E7A0226B364170058B01E /* Frameworks */,
@ -209,9 +393,9 @@
);
dependencies = (
);
name = secant;
name = "secant-testnet";
productName = secant;
productReference = 0D4E7A0526B364170058B01E /* secant.app */;
productReference = 0D4E7A0526B364170058B01E /* secant-testnet.app */;
productType = "com.apple.product-type.application";
};
0D4E7A1526B364180058B01E /* secantTests */ = {
@ -285,7 +469,7 @@
projectDirPath = "";
projectRoot = "";
targets = (
0D4E7A0426B364170058B01E /* secant */,
0D4E7A0426B364170058B01E /* secant-testnet */,
0D4E7A1526B364180058B01E /* secantTests */,
0D4E7A2026B364180058B01E /* secantUITests */,
);
@ -299,6 +483,7 @@
files = (
0D4E7A1026B364180058B01E /* Preview Assets.xcassets in Resources */,
0D4E7A0D26B364180058B01E /* Assets.xcassets in Resources */,
0D2ACE8026C2C67100D62E3C /* Zboto.otf in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -323,16 +508,39 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0D32281F26C5867D00262533 /* ScanQrScreenViewModel.swift in Sources */,
0D32282E26C5870B00262533 /* SendScreenViewModel.swift in Sources */,
0D32282D26C5870B00262533 /* SendScreen.swift in Sources */,
0D1922ED26BDE0C600052649 /* AppRouter.swift in Sources */,
0D1922F226BDE29300052649 /* ZcashSDKStubs.swift in Sources */,
0DA13C9D26C1942100E3B610 /* BackupWalletScreenViewModel.swift in Sources */,
0D32281E26C5867D00262533 /* ScanQrScreen.swift in Sources */,
0DA13C9C26C1942100E3B610 /* BackupWalletScreen.swift in Sources */,
0DA13C9826C186FF00E3B610 /* RestoreWalletScreenViewModel.swift in Sources */,
0D1922EF26BDE1A300052649 /* Services.swift in Sources */,
0D32283326C5877A00262533 /* BalanceScreenViewModel.swift in Sources */,
0D32282326C586A800262533 /* HistoryScreen.swift in Sources */,
0DA13CA526C1963000E3B610 /* Balance.swift in Sources */,
0D1922F826BDEB3500052649 /* MockServices.swift in Sources */,
0D4E7A0B26B364170058B01E /* ContentView.swift in Sources */,
0D1922F426BDE5F200052649 /* MnemonicSeedPhraseHandling.swift in Sources */,
0D170A7226BC802800EB6A46 /* Router.swift in Sources */,
0DA13C9726C186FF00E3B610 /* RestoreWalletScreen.swift in Sources */,
0D1922F626BDE74500052649 /* KeyStoring.swift in Sources */,
0D1922EA26BDD96A00052649 /* ViewModel.swift in Sources */,
0D4E7A0926B364170058B01E /* SecantApp.swift in Sources */,
0D32281A26C5864B00262533 /* ProfileScreenViewModel.swift in Sources */,
0DA13CA126C1955600E3B610 /* HomeScreen.swift in Sources */,
0DA13C9026C15D1D00E3B610 /* WelcomeScreenViewModel.swift in Sources */,
0DA13C8F26C15D1D00E3B610 /* WelcomeScreen.swift in Sources */,
0DA13C9326C15E2F00E3B610 /* PlainButton.swift in Sources */,
0D32282826C586E000262533 /* RequestZcashScreen.swift in Sources */,
0D32283226C5877A00262533 /* BalanceScreen.swift in Sources */,
0DA13CA226C1955600E3B610 /* HomeScreenViewModel.swift in Sources */,
0D32282926C586E000262533 /* RequestZcashScreenViewModel.swift in Sources */,
0D2ACE8326C2C8B400D62E3C /* SwiftUI+secant.swift in Sources */,
0D32281926C5864B00262533 /* ProfileScreen.swift in Sources */,
0D32282426C586A800262533 /* HistoryScreenViewModel.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -357,12 +565,12 @@
/* Begin PBXTargetDependency section */
0D4E7A1826B364180058B01E /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 0D4E7A0426B364170058B01E /* secant */;
target = 0D4E7A0426B364170058B01E /* secant-testnet */;
targetProxy = 0D4E7A1726B364180058B01E /* PBXContainerItemProxy */;
};
0D4E7A2326B364180058B01E /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 0D4E7A0426B364170058B01E /* secant */;
target = 0D4E7A0426B364170058B01E /* secant-testnet */;
targetProxy = 0D4E7A2226B364180058B01E /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@ -491,6 +699,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"secant/Preview Content\"";
DEVELOPMENT_TEAM = RLPRR8CPQG;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = secant/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
@ -498,7 +707,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = co.electriccoin.secant;
PRODUCT_BUNDLE_IDENTIFIER = "co.electriccoin.secant-testnet";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
@ -512,6 +721,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"secant/Preview Content\"";
DEVELOPMENT_TEAM = RLPRR8CPQG;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = secant/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
@ -519,7 +729,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = co.electriccoin.secant;
PRODUCT_BUNDLE_IDENTIFIER = "co.electriccoin.secant-testnet";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
@ -618,7 +828,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
0D4E7A2A26B364180058B01E /* Build configuration list for PBXNativeTarget "secant" */ = {
0D4E7A2A26B364180058B01E /* Build configuration list for PBXNativeTarget "secant-testnet" */ = {
isa = XCConfigurationList;
buildConfigurations = (
0D4E7A2B26B364180058B01E /* Debug */,

BIN
secant/Fonts/Zboto.otf Normal file

Binary file not shown.

View File

@ -4,6 +4,8 @@
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Secant Testnet</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@ -20,6 +22,10 @@
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIAppFonts</key>
<array>
<string>Zboto.otf</string>
</array>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
@ -27,6 +33,12 @@
</dict>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>processing</string>
<string>remote-notification</string>
</array>
<key>UILaunchScreen</key>
<dict/>
<key>UIRequiredDeviceCapabilities</key>

101
secant/Models/Balance.swift Normal file
View File

@ -0,0 +1,101 @@
//
// Balance.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import Foundation
/**
Funds Expressed in Zatoshis
*/
protocol Funds {
/**
Confirmed, spendable funds
*/
var confirmed: Int64 { get }
/**
Unconfirmed, not yet spendable funds.
*/
var unconfirmed: Int64 { get }
/**
Represents a null value of Funds with Zero confirmed and Zero unconfirmed funds.
*/
static var noFunds: Funds { get}
}
/**
Wallet Balance that condenses transpant, Sapling and Orchard funds
*/
protocol WalletBalance {
/**
Transparent funds. This is the sum of the UTXOs of the user found at a given time
*/
var transaparent: Funds { get }
/**
Funds on the Sapling shielded pool for a given user.
*/
var sapling: Funds { get }
/**
Funds on the Orchard shielded pool for a given user.
*/
var orchard: Funds { get }
/**
The sum of all confirmed funds, transparent, sapling and orchard funds (calculated)
*/
var totalAvailableBalance: Int64 { get }
/**
the sum of all unconfirmed funds: transparent, sapling, and orchard funds (calculated
*/
var totalUnconfirmedBalance: Int64 { get }
/**
the sum of all funds confirmed and unconfirmed of all pools (transparent, sapling and orchard).
*/
var totalBalance: Int64 { get }
/**
represents a the value of Zero funds.
*/
static var nullBalance: WalletBalance { get }
}
/**
Concrete Wallet Balance.
*/
struct Balance: WalletBalance {
var transaparent: Funds
var sapling: Funds
var orchard: Funds
}
struct ZcashFunds: Funds {
static var noFunds: Funds {
ZcashFunds(confirmed: 0, unconfirmed: 0)
}
var confirmed: Int64
var unconfirmed: Int64
}
extension WalletBalance {
static var nullBalance: WalletBalance {
Balance(transaparent: ZcashFunds.noFunds, sapling: ZcashFunds.noFunds, orchard: ZcashFunds.noFunds)
}
var totalAvailableBalance: Int64 {
transaparent.confirmed + sapling.confirmed + orchard.confirmed
}
var totalUnconfirmedBalance: Int64 {
transaparent.unconfirmed + sapling.unconfirmed + orchard.unconfirmed
}
var totalBalance: Int64 {
totalAvailableBalance + totalUnconfirmedBalance
}
}

View File

@ -0,0 +1,27 @@
//
// BackupWalletScreen.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import SwiftUI
protocol BackupWalletScreenRouter: AnyObject {
}
struct BackupWalletScreen: View {
@State var router: BackupWalletScreenRouter?
@ObservedObject var viewModel: BackupWalletScreenViewModel
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct BackupWalletScreenPreviews: PreviewProvider {
static var previews: some View {
BackupWalletScreen(viewModel: BackupWalletScreenViewModel(services: MockServices()))
}
}

View File

@ -0,0 +1,13 @@
//
// BackupWalletScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import Foundation
import Combine
class BackupWalletScreenViewModel: BaseViewModel<Services>, ObservableObject {
}

View File

@ -0,0 +1,27 @@
//
// BalanceScreenScreen.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import SwiftUI
protocol BalanceScreenRouter: AnyObject {
}
struct BalanceScreen: View {
@State var router: BalanceScreenRouter?
@ObservedObject var viewModel: BalanceScreenViewModel
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct BalanceScreenPreviews: PreviewProvider {
static var previews: some View {
BalanceScreen(viewModel: BalanceScreenViewModel(services: MockServices()))
}
}

View File

@ -0,0 +1,13 @@
//
// BalanceScreenScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import Foundation
import Combine
class BalanceScreenViewModel: BaseViewModel<Services>, ObservableObject {
}

View File

@ -0,0 +1,27 @@
//
// HistoryScreen.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import SwiftUI
protocol HistoryScreenRouter: AnyObject {
}
struct HistoryScreen: View {
@State var router: HistoryScreenRouter?
@ObservedObject var viewModel: HistoryScreenViewModel
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct HistoryScreenPreviews: PreviewProvider {
static var previews: some View {
HistoryScreen(viewModel: HistoryScreenViewModel(services: MockServices()))
}
}

View File

@ -0,0 +1,13 @@
//
// HistoryScreenScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import Foundation
import Combine
class HistoryScreenViewModel: BaseViewModel<Services>, ObservableObject {
}

View File

@ -0,0 +1,87 @@
//
// HomeScreen.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import SwiftUI
protocol HomeScreenRouter: AnyObject {
func homeScreenScanQrScreen() -> ScanQrScreen
func homeScreenProfileScreen() -> ProfileScreen
func homeScreenHistoryScreen() -> HistoryScreen
func homeScreenBalanceScreen() -> BalanceScreen
func homeScreenRequestScreen() -> RequestZcashScreen
func homeScreenSendScreen() -> SendScreen
}
struct HomeScreen: View {
@State var router: HomeScreenRouter?
@ObservedObject var viewModel: HomeScreenViewModel
var body: some View {
VStack {
Text("Hello, World!")
sendButton
requestButton
historyButton
}
.padding(.horizontal, 30)
.navigationBarTitle("", displayMode: .inline)
.navigationBarItems(
leading: qrCodeButton,
trailing: profileButton)
}
@ViewBuilder var qrCodeButton: some View {
Button(action: {}, label: {
Image(systemName: "qrcode.viewfinder")
.frame(width: 20, height: 20, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
})
.contentShape(Circle())
}
@ViewBuilder var profileButton: some View {
Button(action: {}, label: {
Image(systemName: "person.crop.circle")
.frame(width: 20, height: 20, alignment: .center)
})
.contentShape(Circle())
}
@ViewBuilder var requestButton: some View {
Button(action: {}, label: {
Text("Request ZEC")
})
.buttonStyle(PlainButton())
}
@ViewBuilder var sendButton: some View {
Button(action: {}, label: {
Text("Send ZEC")
})
.buttonStyle(PlainButton())
}
@ViewBuilder var historyButton: some View {
Button(action: {}, label: {
Text("History")
})
.buttonStyle(PlainButton(style: .light))
}
}
struct HomeScreenPreviews: PreviewProvider {
static var previews: some View {
NavigationView {
HomeScreen(viewModel: HomeScreenViewModel.mockWithValues(services: MockServices(), status: .offline, balance: mockBalance, fiatConversion: 1.12453))
}
}
static var mockBalance: WalletBalance {
Balance(transaparent: ZcashFunds.noFunds, sapling: ZcashFunds(confirmed: 123456790, unconfirmed: 0), orchard: ZcashFunds(confirmed: 0, unconfirmed: 0))
}
}

View File

@ -0,0 +1,37 @@
//
// HomeScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import Foundation
import Combine
class HomeScreenViewModel: BaseViewModel<Services>, ObservableObject {
enum Status {
case syncing(progress: Float)
case offline
case error(error: Error)
}
@Published var balance: WalletBalance = Balance.nullBalance
@Published var fiatConversion: Decimal = 0
@Published var status = Status.offline
}
extension HomeScreenViewModel {
static func mockWithValues(services: Services,
status: Status,
balance: WalletBalance,
fiatConversion: Decimal) -> HomeScreenViewModel {
let vm = HomeScreenViewModel(services: services)
vm.status = status
vm.balance = balance
vm.fiatConversion = fiatConversion
return vm
}
}

View File

@ -0,0 +1,27 @@
//
// ProfileScreenScreen.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import SwiftUI
protocol ProfileScreenRouter: AnyObject {
}
struct ProfileScreen: View {
@State var router: ProfileScreenRouter?
@ObservedObject var viewModel: ProfileScreenViewModel
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct ProfileScreenPreviews: PreviewProvider {
static var previews: some View {
ProfileScreen(viewModel: ProfileScreenViewModel(services: MockServices()))
}
}

View File

@ -0,0 +1,13 @@
//
// ProfileScreenScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import Foundation
import Combine
class ProfileScreenViewModel: BaseViewModel<Services>, ObservableObject {
}

View File

@ -0,0 +1,27 @@
//
// RequestZcashScreen.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import SwiftUI
protocol RequestZcashScreenRouter: AnyObject {
}
struct RequestZcashScreen: View {
@State var router: RequestZcashScreenRouter?
@ObservedObject var viewModel: RequestZcashScreenViewModel
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct RequestZcashScreenPreviews: PreviewProvider {
static var previews: some View {
RequestZcashScreen(viewModel: RequestZcashScreenViewModel(services: MockServices()))
}
}

View File

@ -0,0 +1,13 @@
//
// RequestZcashScreenScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import Foundation
import Combine
class RequestZcashScreenViewModel: BaseViewModel<Services>, ObservableObject {
}

View File

@ -0,0 +1,39 @@
//
// RestoreWalletScreen.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import SwiftUI
protocol RestoreWalletScreenRouter: AnyObject {
}
struct RestoreWalletScreen: View {
@State var router: RestoreWalletScreenRouter?
@ObservedObject var viewModel: RestoreWalletScreenViewModel
var body: some View {
VStack {
Text("Enter Seed Phrase")
TextEditor(text: $viewModel.seedText)
Button(action: {}, label: {
Text("Restore Seed Phrase")
})
.buttonStyle(PlainButton())
}
.padding(.horizontal, 30)
.padding(.vertical)
.navigationBarTitle(Text("Restore Wallet"), displayMode: .inline)
}
}
struct RestoreWalletScreenPreviews: PreviewProvider {
static var previews: some View {
RestoreWalletScreen(viewModel: RestoreWalletScreenViewModel(services: MockServices()))
}
}

View File

@ -0,0 +1,16 @@
//
// RestoreWalletScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import Foundation
import Combine
class RestoreWalletScreenViewModel: BaseViewModel<Services>, ObservableObject {
@Published var seedText: String = ""
func restore() {}
}

View File

@ -0,0 +1,27 @@
//
// ScanQrScreenScreen.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import SwiftUI
protocol ScanQrScreenRouter: AnyObject {
}
struct ScanQrScreen: View {
@State var router: ScanQrScreenRouter?
@ObservedObject var viewModel: ScanQrScreenViewModel
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct ScanQrScreenScreenPreviews: PreviewProvider {
static var previews: some View {
ScanQrScreen(viewModel: ScanQrScreenViewModel(services: MockServices()))
}
}

View File

@ -0,0 +1,13 @@
//
// ScanQrScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import Foundation
import Combine
class ScanQrScreenViewModel: BaseViewModel<Services>, ObservableObject {
}

View File

@ -0,0 +1,27 @@
//
// SendScreenScreen.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import SwiftUI
protocol SendScreenRouter: AnyObject {
}
struct SendScreen: View {
@State var router: SendScreenRouter?
@ObservedObject var viewModel: SendScreenViewModel
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct SendScreenScreenPreviews: PreviewProvider {
static var previews: some View {
SendScreen(viewModel: SendScreenViewModel(services: MockServices()))
}
}

View File

@ -0,0 +1,13 @@
//
// SendScreenScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/12/21.
//
import Foundation
import Combine
class SendScreenViewModel: BaseViewModel<Services>, ObservableObject {
}

View File

@ -0,0 +1,50 @@
//
// CreateNewWalletScreen.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import SwiftUI
protocol WelcomeScreenRouter: AnyObject {
}
struct WelcomeScreen: View {
@State var router: WelcomeScreenRouter?
@ObservedObject var viewModel: WelcomeScreenViewModel
var body: some View {
VStack {
Spacer()
Text("Welcome and Onboarding")
Spacer()
VStack(alignment: .center, spacing: 16) {
Button(action: {
self.viewModel.restoreWallet()
}, label: {
Text("RESTORE WALLET")
})
.buttonStyle(PlainButton())
Button(action: {
self.viewModel.createNew()
}, label: {
Text("CREATE NEW WALLET")
})
.buttonStyle(PlainButton())
}
}
.padding()
}
}
struct CreateNewWalletScreenPreviews: PreviewProvider {
static var previews: some View {
WelcomeScreen(viewModel: WelcomeScreenViewModel(services: MockServices()))
}
}

View File

@ -0,0 +1,15 @@
//
// CreateNewWalletScreenViewModel.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import Foundation
import Combine
class WelcomeScreenViewModel: BaseViewModel<Services>, ObservableObject {
func createNew() {}
func restoreWallet() {}
}

View File

@ -10,7 +10,7 @@ import SwiftUI
@main
struct SecantApp: App {
@StateObject var appRouter = AppRouter(services: MockAppServices())
@StateObject var appRouter = AppRouter(services: MockServices())
var body: some Scene {
WindowGroup {
appRouter.rootView()

View File

@ -7,7 +7,7 @@
import Foundation
class MockAppServices: Services {
class MockServices: Services {
init(){}
var networkProvider: ZcashNetworkProvider {
MockNetworkProvider()

View File

@ -0,0 +1,62 @@
//
// PlainButton.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import SwiftUI
struct PlainButton: ButtonStyle {
enum Theme {
case light
case bold
}
var style = Theme.bold
func makeBody(configuration: Configuration) -> some View {
configuration.label
.foregroundColor(style.foregroundColor)
.padding()
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 48, maxHeight: 48)
.background(style.background)
}
}
struct PlainButton_Previews: PreviewProvider {
static var previews: some View {
VStack {
Button(action: /*@START_MENU_TOKEN@*/{}/*@END_MENU_TOKEN@*/, label: {
/*@START_MENU_TOKEN@*/Text("Button")/*@END_MENU_TOKEN@*/
})
.buttonStyle(PlainButton())
Button(action: /*@START_MENU_TOKEN@*/{}/*@END_MENU_TOKEN@*/, label: {
/*@START_MENU_TOKEN@*/Text("Button")/*@END_MENU_TOKEN@*/
})
.buttonStyle(PlainButton(style: .bold))
}
.padding(.horizontal, 30)
}
}
extension PlainButton.Theme {
var background: some View {
switch self {
case .bold:
return Color.black
default:
return Color.white
}
}
var foregroundColor: Color {
switch self {
case .bold:
return Color.white
default:
return Color.black
}
}
}

View File

@ -0,0 +1,16 @@
//
// SwiftUI+secant.swift
// secant
//
// Created by Francisco Gindre on 8/10/21.
//
import Foundation
import SwiftUI
extension Font {
static func zboto(_ size: CGFloat) -> Font {
Font.custom("Zboto", size: size)
}
}