secant-ios-wallet/modules/Sources/Dependencies/ZcashSDKEnvironment/ZcashSDKEnvironmentLiveKey....

98 lines
3.7 KiB
Swift

//
// ZcashSDKEnvironmentLiveKey.swift
// Zashi
//
// Created by Lukáš Korba on 13.11.2022.
//
import ComposableArchitecture
import ZcashLightClientKit
import UserPreferencesStorage
import UserDefaults
extension ZcashSDKEnvironment {
public static func live(network: ZcashNetwork) -> Self {
Self(
latestCheckpoint: BlockHeight.ofLatestCheckpoint(network: network),
endpoint: {
ZcashSDKEnvironment.serverConfig(
for: network.networkType
).endpoint(streamingCallTimeoutInMillis: ZcashSDKConstants.streamingCallTimeoutInMillis)
},
exchangeRateIPRateLimit: 120,
exchangeRateStaleLimit: 15 * 60,
memoCharLimit: MemoBytes.capacity,
mnemonicWordsMaxCount: ZcashSDKConstants.mnemonicWordsMaxCount,
network: network,
requiredTransactionConfirmations: ZcashSDKConstants.requiredTransactionConfirmations,
sdkVersion: "0.18.1-beta",
serverConfig: { ZcashSDKEnvironment.serverConfig(for: network.networkType) },
servers: ZcashSDKEnvironment.servers(for: network.networkType),
shieldingThreshold: Zatoshi(100_000),
tokenName: network.networkType == .testnet ? "TAZ" : "ZEC"
)
}
}
extension ZcashSDKEnvironment {
public static func serverConfig(for network: NetworkType) -> UserPreferencesStorage.ServerConfig {
migrateVersion1IfNeeded()
guard let serverConfig = storedServerConfig() else {
return defaultEndpoint(for: network).serverConfig()
}
return serverConfig
}
static func migrateVersion1IfNeeded() {
@Dependency(\.userStoredPreferences) var userStoredPreferences
@Dependency(\.userDefaults) var userDefaults
let streamingCallTimeoutInMillis = ZcashSDKConstants.streamingCallTimeoutInMillis
let udServerKey = "zashi_udServerKey"
let udCustomServerKey = "zashi_udCustomServerKey"
// only if there's no ServerConfig stored
guard userStoredPreferences.server() == nil else {
userDefaults.remove(udServerKey)
userDefaults.remove(udCustomServerKey)
return
}
// get server key
guard let storedKey = userDefaults.objectForKey(udServerKey) as? String else {
userDefaults.remove(udServerKey)
userDefaults.remove(udCustomServerKey)
return
}
// ensure custom server is preserved
if storedKey == "custom" {
if let customValue = userDefaults.objectForKey(udCustomServerKey) as? String {
if let serverConfig = UserPreferencesStorage.ServerConfig.endpoint(
for: customValue,
streamingCallTimeoutInMillis: streamingCallTimeoutInMillis)?.serverConfig(
isCustom: true
)
{
try? userStoredPreferences.setServer(serverConfig)
}
}
} else if storedKey == "mainnet" {
let serverConfig = UserPreferencesStorage.ServerConfig(host: "mainnet.lightwalletd.com", port: 9067, isCustom: true)
try? userStoredPreferences.setServer(serverConfig)
} else {
// some of the lwd servers
let serverConfig = UserPreferencesStorage.ServerConfig(host: "\(storedKey.dropLast(2)).lightwalletd.com", port: 443, isCustom: true)
try? userStoredPreferences.setServer(serverConfig)
}
}
static func storedServerConfig() -> UserPreferencesStorage.ServerConfig? {
@Dependency(\.userStoredPreferences) var userStoredPreferences
return userStoredPreferences.server()
}
}