diff --git a/.github/workflows/deploy_appstore.yml b/.github/workflows/deploy_appstore.yml index e1cda8f382..01ddc6c6cb 100644 --- a/.github/workflows/deploy_appstore.yml +++ b/.github/workflows/deploy_appstore.yml @@ -68,3 +68,4 @@ jobs: XCCONFIG_PROD_TRONGRID_API_KEY: ${{ secrets.XCCONFIG_PROD_TRONGRID_API_KEY }} XCCONFIG_PROD_UNSTOPPABLE_DOMAINS_API_KEY: ${{ secrets.XCCONFIG_PROD_UNSTOPPABLE_DOMAINS_API_KEY }} XCCONFIG_PROD_ONE_INCH_API_KEY: ${{ secrets.XCCONFIG_PROD_ONE_INCH_API_KEY }} + XCCONFIG_PROD_BLOCKCHAIR_API_KEY: ${{ secrets.XCCONFIG_PROD_BLOCKCHAIR_API_KEY }} diff --git a/.github/workflows/deploy_dev.yml b/.github/workflows/deploy_dev.yml index 53628f75db..7d473d3dbc 100644 --- a/.github/workflows/deploy_dev.yml +++ b/.github/workflows/deploy_dev.yml @@ -69,3 +69,4 @@ jobs: XCCONFIG_DEV_TRONGRID_API_KEY: ${{ secrets.XCCONFIG_DEV_TRONGRID_API_KEY }} XCCONFIG_DEV_UNSTOPPABLE_DOMAINS_API_KEY: ${{ secrets.XCCONFIG_DEV_UNSTOPPABLE_DOMAINS_API_KEY }} XCCONFIG_DEV_ONE_INCH_API_KEY: ${{ secrets.XCCONFIG_DEV_ONE_INCH_API_KEY }} + XCCONFIG_DEV_BLOCKCHAIR_API_KEY: ${{ secrets.XCCONFIG_DEV_BLOCKCHAIR_API_KEY }} diff --git a/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj b/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj index e32927120e..dd6b3e1806 100644 --- a/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj +++ b/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj @@ -12175,7 +12175,7 @@ repositoryURL = "https://github.com/horizontalsystems/BitcoinCore.Swift"; requirement = { kind = exactVersion; - version = 2.0.3; + version = 2.1.0; }; }; 6B55461F2A6E73190054B524 /* XCRemoteSwiftPackageReference "UIExtensions.Swift" */ = { @@ -12191,7 +12191,7 @@ repositoryURL = "https://github.com/horizontalsystems/ECashKit.Swift.git"; requirement = { kind = exactVersion; - version = 2.0.1; + version = 2.1.0; }; }; 6BDA29AE29D6F934003847ED /* XCRemoteSwiftPackageReference "HsToolKit.Swift" */ = { @@ -12279,7 +12279,7 @@ repositoryURL = "https://github.com/horizontalsystems/BitcoinKit.Swift"; requirement = { kind = exactVersion; - version = 2.0.1; + version = 2.1.0; }; }; D3604E6728F02DF30066C366 /* XCRemoteSwiftPackageReference "BitcoinCashKit.Swift" */ = { @@ -12287,7 +12287,7 @@ repositoryURL = "https://github.com/horizontalsystems/BitcoinCashKit.Swift"; requirement = { kind = exactVersion; - version = 2.0.0; + version = 2.1.0; }; }; D3604E6A28F02E3F0066C366 /* XCRemoteSwiftPackageReference "LitecoinKit.Swift" */ = { @@ -12295,7 +12295,7 @@ repositoryURL = "https://github.com/horizontalsystems/LitecoinKit.Swift"; requirement = { kind = exactVersion; - version = 2.1.0; + version = 2.2.0; }; }; D3604E6E28F03AC70066C366 /* XCRemoteSwiftPackageReference "MarketKit.Swift" */ = { @@ -12343,7 +12343,7 @@ repositoryURL = "https://github.com/horizontalsystems/DashKit.Swift"; requirement = { kind = exactVersion; - version = 2.0.3; + version = 2.1.0; }; }; D36E0C2828D084AB00B622B9 /* XCRemoteSwiftPackageReference "CollectionViewCenteredFlowLayout" */ = { diff --git a/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Icons/api_placeholder_32.imageset/APIplaceHolder@2x.png b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Icons/api_placeholder_32.imageset/APIplaceHolder@2x.png new file mode 100644 index 0000000000..8696462a94 Binary files /dev/null and b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Icons/api_placeholder_32.imageset/APIplaceHolder@2x.png differ diff --git a/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Icons/api_placeholder_32.imageset/APIplaceHolder@3x.png b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Icons/api_placeholder_32.imageset/APIplaceHolder@3x.png new file mode 100644 index 0000000000..3053371cec Binary files /dev/null and b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Icons/api_placeholder_32.imageset/APIplaceHolder@3x.png differ diff --git a/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Icons/api_placeholder_32.imageset/Contents.json b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Icons/api_placeholder_32.imageset/Contents.json new file mode 100644 index 0000000000..c446ad2603 --- /dev/null +++ b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Icons/api_placeholder_32.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "APIplaceHolder@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "APIplaceHolder@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Images/blockchair_32.imageset/Blockchair@2x.png b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Images/blockchair_32.imageset/Blockchair@2x.png new file mode 100644 index 0000000000..13f1453425 Binary files /dev/null and b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Images/blockchair_32.imageset/Blockchair@2x.png differ diff --git a/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Images/blockchair_32.imageset/Blockchair@3x.png b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Images/blockchair_32.imageset/Blockchair@3x.png new file mode 100644 index 0000000000..03810691ac Binary files /dev/null and b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Images/blockchair_32.imageset/Blockchair@3x.png differ diff --git a/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Images/blockchair_32.imageset/Contents.json b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Images/blockchair_32.imageset/Contents.json new file mode 100644 index 0000000000..1bf094daff --- /dev/null +++ b/UnstoppableWallet/UnstoppableWallet/Assets.xcassets/Images/blockchair_32.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Blockchair@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Blockchair@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/UnstoppableWallet/UnstoppableWallet/Configuration/Development.template.xcconfig b/UnstoppableWallet/UnstoppableWallet/Configuration/Development.template.xcconfig index d839724610..5ded0c1a1e 100644 --- a/UnstoppableWallet/UnstoppableWallet/Configuration/Development.template.xcconfig +++ b/UnstoppableWallet/UnstoppableWallet/Configuration/Development.template.xcconfig @@ -20,5 +20,6 @@ open_sea_api_key = unstoppable_domains_api_key = one_inch_api_key = swap_enabled = true +blockchair_api_key = default_words = diff --git a/UnstoppableWallet/UnstoppableWallet/Configuration/Production.template.xcconfig b/UnstoppableWallet/UnstoppableWallet/Configuration/Production.template.xcconfig index e4536da3c9..b71f40fce6 100644 --- a/UnstoppableWallet/UnstoppableWallet/Configuration/Production.template.xcconfig +++ b/UnstoppableWallet/UnstoppableWallet/Configuration/Production.template.xcconfig @@ -20,3 +20,4 @@ open_sea_api_key = unstoppable_domains_api_key = one_inch_api_key = swap_enabled = true +blockchair_api_key = diff --git a/UnstoppableWallet/UnstoppableWallet/Core/Managers/BtcBlockchainManager.swift b/UnstoppableWallet/UnstoppableWallet/Core/Managers/BtcBlockchainManager.swift index 196c4d179e..5dc0aa5ffc 100644 --- a/UnstoppableWallet/UnstoppableWallet/Core/Managers/BtcBlockchainManager.swift +++ b/UnstoppableWallet/UnstoppableWallet/Core/Managers/BtcBlockchainManager.swift @@ -49,13 +49,20 @@ extension BtcBlockchainManager { storage.btcRestoreMode(blockchainType: blockchainType) ?? .api } + func apiSyncMode(blockchainType: BlockchainType) -> BitcoinCore.SyncMode { + switch blockchainType { + case .bitcoin, .bitcoinCash: return .blockchair(key: AppConfig.blockchairApiKey) + default: return .api + } + } + func syncMode(blockchainType: BlockchainType, accountOrigin: AccountOrigin) -> BitcoinCore.SyncMode { if accountOrigin == .created { - return .newWallet + return apiSyncMode(blockchainType: blockchainType) } switch restoreMode(blockchainType: blockchainType) { - case .api: return .api + case .api: return apiSyncMode(blockchainType: blockchainType) case .blockchain: return .full } } diff --git a/UnstoppableWallet/UnstoppableWallet/Core/Providers/AppConfig.swift b/UnstoppableWallet/UnstoppableWallet/Core/Providers/AppConfig.swift index 2d311df8a6..8fce8ff167 100644 --- a/UnstoppableWallet/UnstoppableWallet/Core/Providers/AppConfig.swift +++ b/UnstoppableWallet/UnstoppableWallet/Core/Providers/AppConfig.swift @@ -157,4 +157,8 @@ struct AppConfig { Bundle.main.object(forInfoDictionaryKey: "SwapEnabled") as? String == "true" } + static var blockchairApiKey: String { + (Bundle.main.object(forInfoDictionaryKey: "BlockchairApiKey") as? String) ?? "" + } + } diff --git a/UnstoppableWallet/UnstoppableWallet/Info.plist b/UnstoppableWallet/UnstoppableWallet/Info.plist index 3f54db1c5b..6094b15304 100644 --- a/UnstoppableWallet/UnstoppableWallet/Info.plist +++ b/UnstoppableWallet/UnstoppableWallet/Info.plist @@ -2,6 +2,8 @@ + BlockchairApiKey + ${blockchair_api_key} ArbiscanApiKey ${arbiscan_api_key} BscscanApiKey @@ -101,8 +103,8 @@ OfficeMode ${OfficeMode} - oneInchApiKey - ${one_inch_api_key} + oneInchApiKey + ${one_inch_api_key} OpenSeaApiKey ${open_sea_api_key} OptimismEtherscanApiKey @@ -119,11 +121,11 @@ ${ShowTestNetSwitcher} SnowtraceApiKey ${snowtrace_api_key} - SwapEnabled - ${swap_enabled} + SwapEnabled + ${swap_enabled} TronGridApiKey ${trongrid_api_key} - TwitterBearerToken + TwitterBearerToken ${twitter_bearer_token} UIApplicationSceneManifest diff --git a/UnstoppableWallet/UnstoppableWallet/Models/BtcRestoreMode.swift b/UnstoppableWallet/UnstoppableWallet/Models/BtcRestoreMode.swift index 5fab830cd8..7e802d7632 100644 --- a/UnstoppableWallet/UnstoppableWallet/Models/BtcRestoreMode.swift +++ b/UnstoppableWallet/UnstoppableWallet/Models/BtcRestoreMode.swift @@ -5,19 +5,4 @@ enum BtcRestoreMode: String, CaseIterable, Identifiable, Codable { var id: Self { self } - - var title: String { - switch self { - case .api: return "API" - case .blockchain: return "sync_mode.from_blockchain".localized - } - } - - var description: String { - switch self { - case .api: return "btc_restore_mode.recommended".localized - case .blockchain: return "btc_restore_mode.more_private".localized - } - } - } diff --git a/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsService.swift b/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsService.swift index 63d2c3b59b..1822586874 100644 --- a/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsService.swift +++ b/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsService.swift @@ -1,15 +1,21 @@ import MarketKit +import BitcoinCore class BtcBlockchainSettingsService { let blockchain: Blockchain private let btcBlockchainManager: BtcBlockchainManager + let restoreModes: [BtcSyncModeItem] let currentRestoreMode: BtcRestoreMode init(blockchain: Blockchain, btcBlockchainManager: BtcBlockchainManager) { self.blockchain = blockchain self.btcBlockchainManager = btcBlockchainManager + restoreModes = BtcRestoreMode.allCases.map { restoreMode in + let syncMode = btcBlockchainManager.apiSyncMode(blockchainType: blockchain.type) + return BtcSyncModeItem(blockchain: blockchain, restoreMode: restoreMode, syncMode: syncMode) + } currentRestoreMode = btcBlockchainManager.restoreMode(blockchainType: blockchain.type) } diff --git a/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsView.swift b/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsView.swift index 9074828704..5ce952fe5c 100644 --- a/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsView.swift +++ b/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsView.swift @@ -5,41 +5,43 @@ struct BtcBlockchainSettingsView: View { @ObservedObject var viewModel: BtcBlockchainSettingsViewModel @Environment(\.presentationMode) private var presentationMode - @State private var infoPresented = false var body: some View { ThemeView { BottomGradientWrapper { - VStack(spacing: .margin24) { - HighlightedTextView(text: "btc_blockchain_settings.restore_source.alert".localized(viewModel.title)) - - VStack(spacing: 0) { - ListSectionInfoHeader(text: "btc_blockchain_settings.restore_source".localized) { - infoPresented = true - } - .sheet(isPresented: $infoPresented) { - InfoModule.restoreSourceInfo - } + VStack(spacing: .margin32) { + VStack(spacing: .margin32) { + Text("btc_blockchain_settings.restore_source.description".localized) + .themeSubhead2() + .padding(EdgeInsets(top: 0, leading: .margin16, bottom: 0, trailing: .margin16)) ListSection { - ForEach(viewModel.restoreModes) { restoreMode in + ForEach(viewModel.restoreModes, id: \.restoreMode.id) { restoreMode in ClickableRow(action: { - viewModel.selectedRestoreMode = restoreMode + viewModel.selectedRestoreMode = restoreMode.restoreMode }) { + switch restoreMode.icon { + case .local(let name): Image(name) + case .remote(let url): WebImage(url: URL(string: url)) + .resizable() + .scaledToFit() + .frame(width: .iconSize32, height: .iconSize32) + } + VStack(spacing: 1) { Text(restoreMode.title).themeBody() Text(restoreMode.description).themeSubhead2() } - if restoreMode == viewModel.selectedRestoreMode { + if restoreMode.restoreMode == viewModel.selectedRestoreMode { Image.checkIcon } } } } - - ListSectionFooter(text: "btc_blockchain_settings.restore_source.description".localized) } + + HighlightedTextView(text: "btc_blockchain_settings.restore_source.alert".localized(viewModel.title)) } .padding(EdgeInsets(top: .margin12, leading: .margin16, bottom: .margin32, trailing: .margin16)) } bottomContent: { @@ -53,7 +55,8 @@ struct BtcBlockchainSettingsView: View { .disabled(!viewModel.saveEnabled) } } - .navigationBarTitle(viewModel.title) + .navigationTitle(viewModel.title) + .navigationBarTitleDisplayMode(.large) .toolbar { ToolbarItem(placement: .navigationBarLeading) { WebImage(url: URL(string: viewModel.iconUrl)) @@ -63,7 +66,7 @@ struct BtcBlockchainSettingsView: View { } ToolbarItem(placement: .navigationBarTrailing) { - Button("button.cancel".localized) { + Button("button.done".localized) { presentationMode.wrappedValue.dismiss() } } diff --git a/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsViewModel.swift b/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsViewModel.swift index 98b8ce53b5..b601aaa971 100644 --- a/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsViewModel.swift +++ b/UnstoppableWallet/UnstoppableWallet/Modules/BtcBlockchainSettings/BtcBlockchainSettingsViewModel.swift @@ -3,7 +3,7 @@ import Combine class BtcBlockchainSettingsViewModel: ObservableObject { private let service: BtcBlockchainSettingsService - let restoreModes: [BtcRestoreMode] = BtcRestoreMode.allCases + let restoreModes: [BtcRestoreModeViewItem] @Published var selectedRestoreMode: BtcRestoreMode { didSet { @@ -17,12 +17,34 @@ class BtcBlockchainSettingsViewModel: ObservableObject { self.service = service selectedRestoreMode = service.currentRestoreMode - } + restoreModes = service.restoreModes.map { restoreMode in + let image: BtcRestoreModeViewItem.Image + switch (restoreMode.restoreMode, restoreMode.syncMode) { + case (.api, .api): + image = .local(name: "api_placeholder_32") + case (.api, .blockchair): + image = .local(name: "blockchair_32") + default: + image = .remote(url: service.blockchain.type.imageUrl) + } + + let description: String + switch restoreMode.restoreMode { + case .api: description = "btc_restore_mode.fast".localized + case .blockchain: description = "btc_restore_mode.slow".localized + } + return BtcRestoreModeViewItem( + restoreMode: restoreMode.restoreMode, + title: restoreMode.title, + description: description, + icon: image + ) + } + } } extension BtcBlockchainSettingsViewModel { - var title: String { service.blockchain.name } @@ -34,5 +56,16 @@ extension BtcBlockchainSettingsViewModel { func onTapSave() { service.save(restoreMode: selectedRestoreMode) } +} +struct BtcRestoreModeViewItem { + let restoreMode: BtcRestoreMode + let title: String + let description: String + let icon: Image + + enum Image { + case local(name: String) + case remote(url: String) + } } diff --git a/UnstoppableWallet/UnstoppableWallet/Modules/Settings/BlockchainSettings/BlockchainSettingsView.swift b/UnstoppableWallet/UnstoppableWallet/Modules/Settings/BlockchainSettings/BlockchainSettingsView.swift index c92b1828de..d513c98c5a 100644 --- a/UnstoppableWallet/UnstoppableWallet/Modules/Settings/BlockchainSettings/BlockchainSettingsView.swift +++ b/UnstoppableWallet/UnstoppableWallet/Modules/Settings/BlockchainSettings/BlockchainSettingsView.swift @@ -18,7 +18,7 @@ struct BlockchainSettingsView: View { }) { ItemView( blockchain: item.blockchain, - value: item.restoreMode.title + value: item.title ) } } diff --git a/UnstoppableWallet/UnstoppableWallet/Modules/Settings/BlockchainSettings/BlockchainSettingsViewModel.swift b/UnstoppableWallet/UnstoppableWallet/Modules/Settings/BlockchainSettings/BlockchainSettingsViewModel.swift index 55fc10cb99..ff01f6c4f5 100644 --- a/UnstoppableWallet/UnstoppableWallet/Modules/Settings/BlockchainSettings/BlockchainSettingsViewModel.swift +++ b/UnstoppableWallet/UnstoppableWallet/Modules/Settings/BlockchainSettings/BlockchainSettingsViewModel.swift @@ -2,6 +2,7 @@ import Combine import MarketKit import RxRelay import RxSwift +import BitcoinCore class BlockchainSettingsViewModel: ObservableObject { private let btcBlockchainManager: BtcBlockchainManager @@ -10,7 +11,7 @@ class BlockchainSettingsViewModel: ObservableObject { private let disposeBag = DisposeBag() @Published var evmItems: [EvmItem] = [] - @Published var btcItems: [BtcItem] = [] + @Published var btcItems: [BtcSyncModeItem] = [] init(btcBlockchainManager: BtcBlockchainManager, evmBlockchainManager: EvmBlockchainManager, evmSyncSourceManager: EvmSyncSourceManager) { self.btcBlockchainManager = btcBlockchainManager @@ -28,7 +29,8 @@ class BlockchainSettingsViewModel: ObservableObject { btcItems = btcBlockchainManager.allBlockchains .map { blockchain in let restoreMode = btcBlockchainManager.restoreMode(blockchainType: blockchain.type) - return BtcItem(blockchain: blockchain, restoreMode: restoreMode) + let syncMode = btcBlockchainManager.apiSyncMode(blockchainType: blockchain.type) + return BtcSyncModeItem(blockchain: blockchain, restoreMode: restoreMode, syncMode: syncMode) } .sorted { $0.blockchain.type.order < $1.blockchain.type.order } } @@ -44,13 +46,22 @@ class BlockchainSettingsViewModel: ObservableObject { } extension BlockchainSettingsViewModel { - struct BtcItem { - let blockchain: Blockchain - let restoreMode: BtcRestoreMode - } - struct EvmItem { let blockchain: Blockchain let syncSource: EvmSyncSource } } + +struct BtcSyncModeItem { + let blockchain: Blockchain + let restoreMode: BtcRestoreMode + let syncMode: BitcoinCore.SyncMode + + var title: String { + switch (restoreMode, syncMode) { + case (.api, .api): return "API" + case (.api, .blockchair): return "Blockchair API" + default: return "sync_mode.from_blockchain".localized(blockchain.name) + } + } +} diff --git a/UnstoppableWallet/UnstoppableWallet/en.lproj/Localizable.strings b/UnstoppableWallet/UnstoppableWallet/en.lproj/Localizable.strings index 0ea4b312f3..54a829b3d8 100644 --- a/UnstoppableWallet/UnstoppableWallet/en.lproj/Localizable.strings +++ b/UnstoppableWallet/UnstoppableWallet/en.lproj/Localizable.strings @@ -181,7 +181,7 @@ "coin_settings.title" = "Blockchain Settings"; "coin_settings.bitcoin_cash_coin_type.title.type0" = "Legacy"; "coin_settings.bitcoin_cash_coin_type.title.type145" = "CashAddress"; -"sync_mode.from_blockchain" = "From Blockchain"; +"sync_mode.from_blockchain" = "%@ Blockchain"; "blockchain_settings.description" = "Select the address format for receiving payments. A correct format should be chosen when restoring an existing wallet."; // Coin Platforms @@ -1212,11 +1212,11 @@ "security_settings.delete_alert_button" = "Delete from Phone"; "btc_blockchain_settings.restore_source" = "Restore Source"; -"btc_blockchain_settings.restore_source.description" = "Select a data source for restoring a wallet with transactions."; +"btc_blockchain_settings.restore_source.description" = "Choose the source Unstoppable app should use for synchronizing wallet(s)."; "btc_blockchain_settings.restore_source.alert" = "After changing Restore Source the wallet will have to resync itself with the %@ blockchain."; -"btc_restore_mode.recommended" = "Recommended"; -"btc_restore_mode.more_private" = "More Private"; +"btc_restore_mode.fast" = "Fast, Private, Centralized"; +"btc_restore_mode.slow" = "Slow, Private, Decentralized"; "btc_transaction_sort_mode.shuffle" = "Shuffle"; "btc_transaction_sort_mode.shuffle.description" = "Random Indexing"; diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 45368c2415..a54a662810 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -27,6 +27,7 @@ XCCONFIG_DEV_OPEN_SEA_API_KEY = ENV["XCCONFIG_DEV_OPEN_SEA_API_KEY"] XCCONFIG_DEV_TRONGRID_API_KEY = ENV["XCCONFIG_DEV_TRONGRID_API_KEY"] XCCONFIG_DEV_UNSTOPPABLE_DOMAINS_API_KEY = ENV["XCCONFIG_DEV_UNSTOPPABLE_DOMAINS_API_KEY"] XCCONFIG_DEV_ONE_INCH_API_KEY = ENV["XCCONFIG_DEV_ONE_INCH_API_KEY"] +XCCONFIG_DEV_BLOCKCHAIR_API_KEY = ENV["XCCONFIG_DEV_BLOCKCHAIR_API_KEY"] XCCONFIG_PROD_SWAP_ENABLED = ENV["XCCONFIG_PROD_SWAP_ENABLED"] XCCONFIG_PROD_INFURA_PROJECT_ID = ENV["XCCONFIG_PROD_INFURA_PROJECT_ID"] @@ -47,6 +48,7 @@ XCCONFIG_PROD_OPEN_SEA_API_KEY = ENV["XCCONFIG_PROD_OPEN_SEA_API_KEY"] XCCONFIG_PROD_TRONGRID_API_KEY = ENV["XCCONFIG_PROD_TRONGRID_API_KEY"] XCCONFIG_PROD_UNSTOPPABLE_DOMAINS_API_KEY = ENV["XCCONFIG_PROD_UNSTOPPABLE_DOMAINS_API_KEY"] XCCONFIG_PROD_ONE_INCH_API_KEY = ENV["XCCONFIG_PROD_ONE_INCH_API_KEY"] +XCCONFIG_PROD_BLOCKCHAIR_API_KEY = ENV["XCCONFIG_PROD_BLOCKCHAIR_API_KEY"] def delete_temp_keychain(name) delete_keychain( @@ -128,6 +130,7 @@ def apply_dev_xcconfig update_dev_xcconfig('trongrid_api_key', XCCONFIG_DEV_TRONGRID_API_KEY) update_dev_xcconfig('unstoppable_domains_api_key', XCCONFIG_DEV_UNSTOPPABLE_DOMAINS_API_KEY) update_dev_xcconfig('one_inch_api_key', XCCONFIG_DEV_ONE_INCH_API_KEY) + update_dev_xcconfig('blockchair_api_key', XCCONFIG_DEV_BLOCKCHAIR_API_KEY) end def apply_prod_xcconfig(swap_enabled) @@ -150,6 +153,7 @@ def apply_prod_xcconfig(swap_enabled) update_prod_xcconfig('trongrid_api_key', XCCONFIG_PROD_TRONGRID_API_KEY) update_prod_xcconfig('unstoppable_domains_api_key', XCCONFIG_PROD_UNSTOPPABLE_DOMAINS_API_KEY) update_prod_xcconfig('one_inch_api_key', XCCONFIG_PROD_ONE_INCH_API_KEY) + update_prod_xcconfig('blockchair_api_key', XCCONFIG_PROD_BLOCKCHAIR_API_KEY) end def deploy_production