Showing preview only (7,079K chars total). Download the full file or copy to clipboard to get everything.
Repository: arcbit/arcbit-ios
Branch: master
Commit: 1ac2f8a22c2c
Files: 611
Total size: 52.4 MB
Directory structure:
gitextract_uro7xozv/
├── .gitignore
├── ArcBit/
│ ├── APIs/
│ │ ├── TLBitcoinListener.swift
│ │ ├── TLBlockExplorerAPI.swift
│ │ ├── TLBlockchainAPI.swift
│ │ ├── TLBlockrAPI.swift
│ │ ├── TLExchangeRate.swift
│ │ ├── TLInsightAPI.swift
│ │ ├── TLNetworking.swift
│ │ ├── TLPushTxAPI.swift
│ │ ├── TLStealthServerAPI.swift
│ │ ├── TLStealthServerConfig.swift
│ │ ├── TLStealthWebSocket.swift
│ │ └── TLTxFeeAPI.swift
│ ├── AppDelegate.swift
│ ├── ArcBit-Bridging-Header.h
│ ├── ArcBit.entitlements
│ ├── Assets/
│ │ └── certs/
│ │ └── live.cer
│ ├── Base.lproj/
│ │ ├── LaunchScreen.xib
│ │ ├── Localizable.strings
│ │ └── Main.storyboard
│ ├── External/
│ │ ├── BreadWalletClassesV0.5/
│ │ │ ├── BRKey+BIP38.h
│ │ │ ├── BRKey+BIP38.m
│ │ │ ├── BRKey.h
│ │ │ ├── BRKey.m
│ │ │ ├── BRTransaction.h
│ │ │ ├── BRTransaction.m
│ │ │ ├── NSData+Bitcoin.h
│ │ │ ├── NSData+Bitcoin.m
│ │ │ ├── NSData+Hash.h
│ │ │ ├── NSData+Hash.m
│ │ │ ├── NSMutableData+Bitcoin.h
│ │ │ ├── NSMutableData+Bitcoin.m
│ │ │ ├── NSString+Base58.h
│ │ │ ├── NSString+Base58.m
│ │ │ └── ccMemory.h
│ │ ├── CustomIOS7AlertView/
│ │ │ ├── CustomIOS7AlertView.h
│ │ │ └── CustomIOS7AlertView.m
│ │ ├── InAppSettingsKit/
│ │ │ ├── Controllers/
│ │ │ │ ├── IASKAppSettingsViewController.h
│ │ │ │ ├── IASKAppSettingsViewController.m
│ │ │ │ ├── IASKAppSettingsWebViewController.h
│ │ │ │ ├── IASKAppSettingsWebViewController.m
│ │ │ │ ├── IASKMultipleValueSelection.h
│ │ │ │ ├── IASKMultipleValueSelection.m
│ │ │ │ ├── IASKSpecifierValuesViewController.h
│ │ │ │ ├── IASKSpecifierValuesViewController.m
│ │ │ │ └── IASKViewController.h
│ │ │ ├── Models/
│ │ │ │ ├── IASKSettingsReader.h
│ │ │ │ ├── IASKSettingsReader.m
│ │ │ │ ├── IASKSettingsStore.h
│ │ │ │ ├── IASKSettingsStore.m
│ │ │ │ ├── IASKSettingsStoreFile.h
│ │ │ │ ├── IASKSettingsStoreFile.m
│ │ │ │ ├── IASKSettingsStoreUserDefaults.h
│ │ │ │ ├── IASKSettingsStoreUserDefaults.m
│ │ │ │ ├── IASKSpecifier.h
│ │ │ │ └── IASKSpecifier.m
│ │ │ ├── Resources/
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── de.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── el.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── en.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── es.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── fr.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── it.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── ja.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── nl.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── pt-PT.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── pt.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── ru.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── sv.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── th.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ ├── tr.lproj/
│ │ │ │ │ └── IASKLocalizable.strings
│ │ │ │ └── zh-Hant.lproj/
│ │ │ │ └── IASKLocalizable.strings
│ │ │ └── Views/
│ │ │ ├── IASKPSSliderSpecifierViewCell.h
│ │ │ ├── IASKPSSliderSpecifierViewCell.m
│ │ │ ├── IASKPSTextFieldSpecifierViewCell.h
│ │ │ ├── IASKPSTextFieldSpecifierViewCell.m
│ │ │ ├── IASKSlider.h
│ │ │ ├── IASKSlider.m
│ │ │ ├── IASKSwitch.h
│ │ │ ├── IASKSwitch.m
│ │ │ ├── IASKTextField.h
│ │ │ ├── IASKTextField.m
│ │ │ ├── IASKTextView.h
│ │ │ ├── IASKTextView.m
│ │ │ ├── IASKTextViewCell.h
│ │ │ └── IASKTextViewCell.m
│ │ ├── JNKeychain-master/
│ │ │ ├── JNKeychain.h
│ │ │ └── JNKeychain.m
│ │ ├── KeychainItemWrapper/
│ │ │ ├── KeychainItemWrapper.h
│ │ │ └── KeychainItemWrapper.m
│ │ ├── LTHPasscodeViewController3.50/
│ │ │ ├── LTHKeychainUtils.h
│ │ │ ├── LTHKeychainUtils.m
│ │ │ ├── LTHPasscodeViewController.h
│ │ │ └── LTHPasscodeViewController.m
│ │ ├── Localizations/
│ │ │ ├── de.lproj/
│ │ │ │ └── LTHPasscodeViewController.strings
│ │ │ ├── en.lproj/
│ │ │ │ └── LTHPasscodeViewController.strings
│ │ │ ├── es.lproj/
│ │ │ │ └── LTHPasscodeViewController.strings
│ │ │ ├── fr.lproj/
│ │ │ │ └── LTHPasscodeViewController.strings
│ │ │ ├── ja.lproj/
│ │ │ │ └── LTHPasscodeViewController.strings
│ │ │ ├── ro.lproj/
│ │ │ │ └── LTHPasscodeViewController.strings
│ │ │ ├── ru.lproj/
│ │ │ │ └── LTHPasscodeViewController.strings
│ │ │ ├── zh-Hans-CN.lproj/
│ │ │ │ └── LTHPasscodeViewController.strings
│ │ │ └── zh-Hant.lproj/
│ │ │ └── LTHPasscodeViewController.strings
│ │ ├── MySocketRocketExtras/
│ │ │ ├── SRWebSocket+Helpers.h
│ │ │ └── SRWebSocket+Helpers.m
│ │ ├── NSDate-Extensions/
│ │ │ ├── NSDate-Utilities.h
│ │ │ └── NSDate-Utilities.m
│ │ ├── QRCodeEncoderObjectiveCAtGithub/
│ │ │ ├── DataMatrix.h
│ │ │ ├── DataMatrix.mm
│ │ │ ├── QRCodeEncoderDemoViewController.h
│ │ │ ├── QRCodeEncoderDemoViewController.mm
│ │ │ ├── QRCodeEncoderObjectiveCAtGithub-Prefix.pch
│ │ │ ├── QREncoder-Prefix.pch
│ │ │ ├── QREncoder.h
│ │ │ ├── QREncoder.mm
│ │ │ ├── QR_Encode.cpp
│ │ │ └── QR_Encode.h
│ │ ├── SocketRocket/
│ │ │ ├── NSData+SRB64Additions.h
│ │ │ ├── NSData+SRB64Additions.m
│ │ │ ├── SRWebSocket.h
│ │ │ ├── SRWebSocket.m
│ │ │ ├── SocketRocket-Prefix.pch
│ │ │ ├── base64.c
│ │ │ └── base64.h
│ │ ├── TLCloudDocumentSyncWrapper/
│ │ │ ├── TLCloudDocumentSyncWrapper.h
│ │ │ └── TLCloudDocumentSyncWrapper.m
│ │ ├── UIAlertController+Blocks/
│ │ │ ├── UIAlertConrtoller+Blocks.m
│ │ │ └── UIAlertController+Blocks.h
│ │ ├── UINavigationBar-FixedHeightWhenStatusBarHidden-master/
│ │ │ ├── UINavigationBar+FixedHeightWhenStatusBarHidden.h
│ │ │ └── UINavigationBar+FixedHeightWhenStatusBarHidden.m
│ │ ├── iToast/
│ │ │ ├── iToast.h
│ │ │ └── iToast.m
│ │ └── socket.io-client-swift-10.0.0/
│ │ └── Source/
│ │ ├── SSLSecurity.swift
│ │ ├── SocketAckEmitter.swift
│ │ ├── SocketAckManager.swift
│ │ ├── SocketAnyEvent.swift
│ │ ├── SocketClientManager.swift
│ │ ├── SocketEngine.swift
│ │ ├── SocketEngineClient.swift
│ │ ├── SocketEnginePacketType.swift
│ │ ├── SocketEnginePollable.swift
│ │ ├── SocketEngineSpec.swift
│ │ ├── SocketEngineWebsocket.swift
│ │ ├── SocketEventHandler.swift
│ │ ├── SocketExtensions.swift
│ │ ├── SocketIOClient.swift
│ │ ├── SocketIOClientConfiguration.swift
│ │ ├── SocketIOClientOption.swift
│ │ ├── SocketIOClientSpec.swift
│ │ ├── SocketIOClientStatus.swift
│ │ ├── SocketLogger.swift
│ │ ├── SocketPacket.swift
│ │ ├── SocketParsable.swift
│ │ ├── SocketStringReader.swift
│ │ ├── SocketTypes.swift
│ │ └── WebSocket.swift
│ ├── Images.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── home3.imageset/
│ │ │ └── Contents.json
│ │ ├── lifebuoy.imageset/
│ │ │ └── Contents.json
│ │ ├── link.imageset/
│ │ │ └── Contents.json
│ │ ├── twitter.imageset/
│ │ │ └── Contents.json
│ │ └── vault.imageset/
│ │ └── Contents.json
│ ├── InAppSettings.bundle/
│ │ ├── Advanced.plist
│ │ ├── Root.plist
│ │ ├── de.lproj/
│ │ │ └── Root.strings
│ │ ├── en.lproj/
│ │ │ └── Root.strings
│ │ ├── es.lproj/
│ │ │ └── Root.strings
│ │ ├── ru.lproj/
│ │ │ └── Root.strings
│ │ ├── zh-Hans-CN.lproj/
│ │ │ └── Root.strings
│ │ └── zh-Hant.lproj/
│ │ └── Root.strings
│ ├── Info.plist
│ ├── de.lproj/
│ │ └── Localizable.strings
│ ├── es.lproj/
│ │ └── Localizable.strings
│ ├── model/
│ │ ├── TLAccountObject.swift
│ │ ├── TLAccounts.swift
│ │ ├── TLAchievements.swift
│ │ ├── TLAnalytics.swift
│ │ ├── TLBlockchainStatus.swift
│ │ ├── TLCoin.swift
│ │ ├── TLColdWallet.swift
│ │ ├── TLCoreBitcoinWrapper.swift
│ │ ├── TLCrypto.swift
│ │ ├── TLCurrencyFormat.swift
│ │ ├── TLDisplayStrings.swift
│ │ ├── TLHDWalletWrapper.swift
│ │ ├── TLHelpDoc.swift
│ │ ├── TLImportedAddress.swift
│ │ ├── TLImportedAddresses.swift
│ │ ├── TLOperationsManager.swift
│ │ ├── TLPreferences.swift
│ │ ├── TLSelectedObject.swift
│ │ ├── TLSendFormData.swift
│ │ ├── TLSpaghettiGodSend.swift
│ │ ├── TLStealthAddress.swift
│ │ ├── TLStealthWallet.swift
│ │ ├── TLSuggestions.swift
│ │ ├── TLTxObject.swift
│ │ ├── TLWallet+Stealth.swift
│ │ ├── TLWallet.swift
│ │ ├── TLWalletConfig.swift
│ │ ├── TLWalletJSONKeys.swift
│ │ ├── TLWalletJson.swift
│ │ ├── TLWalletPassphrase.swift
│ │ └── TLWalletUtils.swift
│ ├── ru.lproj/
│ │ ├── Localizable.strings
│ │ └── Main.strings
│ ├── utils/
│ │ ├── TLColors.swift
│ │ ├── TLHUDWrapper.swift
│ │ ├── TLMacros.swift
│ │ ├── TLNotificationEvents.swift
│ │ ├── TLPrompts.swift
│ │ ├── TLQRImageModal.swift
│ │ ├── TLStringLocalized.swift
│ │ ├── TLUpdateAppData.swift
│ │ ├── TLUtils.swift
│ │ ├── TransitionDelegate.swift
│ │ ├── UINavigationController+StatusBarStyle.swift
│ │ ├── UIView+FormScroll.swift
│ │ ├── UIViewController+Extras.swift
│ │ └── UIViewController+Style.swift
│ ├── viewControllers/
│ │ ├── TLAccountTableViewCell.swift
│ │ ├── TLAccountsViewController.swift
│ │ ├── TLAchievementsViewController.swift
│ │ ├── TLAddressBookViewController.swift
│ │ ├── TLAddressListViewController.swift
│ │ ├── TLAddressTableViewCell.swift
│ │ ├── TLAuthorizeColdWalletPaymentViewController.swift
│ │ ├── TLBrainWalletViewController.swift
│ │ ├── TLColdWalletViewController.swift
│ │ ├── TLCreateColdWalletViewController.swift
│ │ ├── TLHelpViewController.swift
│ │ ├── TLHistoryViewController.swift
│ │ ├── TLInstructionsViewController.swift
│ │ ├── TLLinksViewController.swift
│ │ ├── TLManageAccountsViewController.swift
│ │ ├── TLMenuViewController.swift
│ │ ├── TLPassPhraseViewController.swift
│ │ ├── TLPreloadViewController.swift
│ │ ├── TLQRCodeScannerViewController.swift
│ │ ├── TLReceiveViewController.swift
│ │ ├── TLRestoreWalletViewController.swift
│ │ ├── TLReviewPaymentViewController.swift
│ │ ├── TLSendViewController.swift
│ │ ├── TLSettingsViewController.swift
│ │ ├── TLTextViewViewController.swift
│ │ ├── TLTransactionTableViewCell.swift
│ │ ├── TransparentViewController.swift
│ │ └── tableViewCells/
│ │ ├── createColdWalletTableViewCells/
│ │ │ ├── TLAdvancedNewWalletTableViewCell.swift
│ │ │ ├── TLColdWalletSelectWayTableViewCell.swift
│ │ │ └── TLNewWalletTableViewCell.swift
│ │ ├── spendColdWalletTableViewCells/
│ │ │ ├── TLInputColdWalletKeyTableViewCell.swift
│ │ │ ├── TLPassSignedTxTableViewCell.swift
│ │ │ └── TLScanUnsignedTxTableViewCell.swift
│ │ └── walletTableViewCells/
│ │ ├── TLAccountTableViewCell.swift
│ │ ├── TLAddressTableViewCell.swift
│ │ └── TLTransactionTableViewCell.swift
│ ├── zh-Hans-CN.lproj/
│ │ └── Localizable.strings
│ └── zh-Hant.lproj/
│ ├── LaunchScreen.strings
│ ├── Localizable.strings
│ └── Main.strings
├── ArcBit.xcodeproj/
│ ├── project.pbxproj
│ └── project.xcworkspace/
│ └── contents.xcworkspacedata
├── ArcBit.xcworkspace/
│ └── contents.xcworkspacedata
├── ArcBitTests/
│ ├── ArcBitTests-Bridging-Header.h
│ ├── ArcBitTests.swift
│ ├── BreadWalletTests.m
│ └── Info.plist
├── Podfile
├── Pods/
│ ├── AFNetworking/
│ │ ├── AFNetworking/
│ │ │ ├── AFHTTPRequestOperation.h
│ │ │ ├── AFHTTPRequestOperation.m
│ │ │ ├── AFHTTPRequestOperationManager.h
│ │ │ ├── AFHTTPRequestOperationManager.m
│ │ │ ├── AFHTTPSessionManager.h
│ │ │ ├── AFHTTPSessionManager.m
│ │ │ ├── AFNetworkReachabilityManager.h
│ │ │ ├── AFNetworkReachabilityManager.m
│ │ │ ├── AFNetworking.h
│ │ │ ├── AFSecurityPolicy.h
│ │ │ ├── AFSecurityPolicy.m
│ │ │ ├── AFURLConnectionOperation.h
│ │ │ ├── AFURLConnectionOperation.m
│ │ │ ├── AFURLRequestSerialization.h
│ │ │ ├── AFURLRequestSerialization.m
│ │ │ ├── AFURLResponseSerialization.h
│ │ │ ├── AFURLResponseSerialization.m
│ │ │ ├── AFURLSessionManager.h
│ │ │ └── AFURLSessionManager.m
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── UIKit+AFNetworking/
│ │ ├── AFNetworkActivityIndicatorManager.h
│ │ ├── AFNetworkActivityIndicatorManager.m
│ │ ├── UIActivityIndicatorView+AFNetworking.h
│ │ ├── UIActivityIndicatorView+AFNetworking.m
│ │ ├── UIAlertView+AFNetworking.h
│ │ ├── UIAlertView+AFNetworking.m
│ │ ├── UIButton+AFNetworking.h
│ │ ├── UIButton+AFNetworking.m
│ │ ├── UIImageView+AFNetworking.h
│ │ ├── UIImageView+AFNetworking.m
│ │ ├── UIKit+AFNetworking.h
│ │ ├── UIProgressView+AFNetworking.h
│ │ ├── UIProgressView+AFNetworking.m
│ │ ├── UIRefreshControl+AFNetworking.h
│ │ ├── UIRefreshControl+AFNetworking.m
│ │ ├── UIWebView+AFNetworking.h
│ │ └── UIWebView+AFNetworking.m
│ ├── CoreBitcoin/
│ │ ├── CoreBitcoin/
│ │ │ ├── BTC256.h
│ │ │ ├── BTC256.m
│ │ │ ├── BTCAddress.h
│ │ │ ├── BTCAddress.m
│ │ │ ├── BTCAddressSubclass.h
│ │ │ ├── BTCAssetAddress.h
│ │ │ ├── BTCAssetAddress.m
│ │ │ ├── BTCAssetID.h
│ │ │ ├── BTCAssetID.m
│ │ │ ├── BTCAssetType.h
│ │ │ ├── BTCAssetType.m
│ │ │ ├── BTCBase58.h
│ │ │ ├── BTCBase58.m
│ │ │ ├── BTCBigNumber.h
│ │ │ ├── BTCBigNumber.m
│ │ │ ├── BTCBitcoinURL.h
│ │ │ ├── BTCBitcoinURL.m
│ │ │ ├── BTCBlindSignature.h
│ │ │ ├── BTCBlindSignature.m
│ │ │ ├── BTCBlock.h
│ │ │ ├── BTCBlock.m
│ │ │ ├── BTCBlockHeader.h
│ │ │ ├── BTCBlockHeader.m
│ │ │ ├── BTCBlockchainInfo.h
│ │ │ ├── BTCBlockchainInfo.m
│ │ │ ├── BTCChainCom.h
│ │ │ ├── BTCChainCom.m
│ │ │ ├── BTCCurrencyConverter.h
│ │ │ ├── BTCCurrencyConverter.m
│ │ │ ├── BTCCurvePoint.h
│ │ │ ├── BTCCurvePoint.m
│ │ │ ├── BTCData.h
│ │ │ ├── BTCData.m
│ │ │ ├── BTCEncryptedBackup.h
│ │ │ ├── BTCEncryptedBackup.m
│ │ │ ├── BTCEncryptedMessage.h
│ │ │ ├── BTCEncryptedMessage.m
│ │ │ ├── BTCErrors.h
│ │ │ ├── BTCErrors.m
│ │ │ ├── BTCFancyEncryptedMessage.h
│ │ │ ├── BTCFancyEncryptedMessage.m
│ │ │ ├── BTCHashID.h
│ │ │ ├── BTCHashID.m
│ │ │ ├── BTCKey.h
│ │ │ ├── BTCKey.m
│ │ │ ├── BTCKeychain.h
│ │ │ ├── BTCKeychain.m
│ │ │ ├── BTCMerkleTree.h
│ │ │ ├── BTCMerkleTree.m
│ │ │ ├── BTCMnemonic.h
│ │ │ ├── BTCMnemonic.m
│ │ │ ├── BTCNetwork.h
│ │ │ ├── BTCNetwork.m
│ │ │ ├── BTCNumberFormatter.h
│ │ │ ├── BTCNumberFormatter.m
│ │ │ ├── BTCOpcode.h
│ │ │ ├── BTCOpcode.m
│ │ │ ├── BTCOutpoint.h
│ │ │ ├── BTCOutpoint.m
│ │ │ ├── BTCPaymentMethod.h
│ │ │ ├── BTCPaymentMethod.m
│ │ │ ├── BTCPaymentMethodDetails.h
│ │ │ ├── BTCPaymentMethodDetails.m
│ │ │ ├── BTCPaymentMethodRequest.h
│ │ │ ├── BTCPaymentMethodRequest.m
│ │ │ ├── BTCPaymentProtocol.h
│ │ │ ├── BTCPaymentProtocol.m
│ │ │ ├── BTCPaymentRequest.h
│ │ │ ├── BTCPaymentRequest.m
│ │ │ ├── BTCPriceSource.h
│ │ │ ├── BTCPriceSource.m
│ │ │ ├── BTCProcessor.h
│ │ │ ├── BTCProcessor.m
│ │ │ ├── BTCProtocolBuffers.h
│ │ │ ├── BTCProtocolBuffers.m
│ │ │ ├── BTCProtocolSerialization.h
│ │ │ ├── BTCProtocolSerialization.m
│ │ │ ├── BTCQRCode.h
│ │ │ ├── BTCQRCode.m
│ │ │ ├── BTCScript.h
│ │ │ ├── BTCScript.m
│ │ │ ├── BTCScriptMachine.h
│ │ │ ├── BTCScriptMachine.m
│ │ │ ├── BTCSecretSharing.h
│ │ │ ├── BTCSecretSharing.m
│ │ │ ├── BTCSignatureHashType.h
│ │ │ ├── BTCTransaction.h
│ │ │ ├── BTCTransaction.m
│ │ │ ├── BTCTransactionBuilder.h
│ │ │ ├── BTCTransactionBuilder.m
│ │ │ ├── BTCTransactionInput.h
│ │ │ ├── BTCTransactionInput.m
│ │ │ ├── BTCTransactionOutput.h
│ │ │ ├── BTCTransactionOutput.m
│ │ │ ├── BTCUnitsAndLimits.h
│ │ │ ├── CoreBitcoin+Categories.h
│ │ │ ├── CoreBitcoin.h
│ │ │ ├── NS+BTCBase58.h
│ │ │ ├── NS+BTCBase58.m
│ │ │ ├── NSData+BTCData.h
│ │ │ ├── NSData+BTCData.m
│ │ │ └── SwiftBridgingHeader.h
│ │ ├── LICENSE.txt
│ │ └── README.md
│ ├── Crashlytics/
│ │ ├── Crashlytics.framework/
│ │ │ ├── README
│ │ │ └── submit
│ │ ├── README.md
│ │ ├── iOS/
│ │ │ └── Crashlytics.framework/
│ │ │ ├── Crashlytics
│ │ │ ├── Headers/
│ │ │ │ ├── ANSCompatibility.h
│ │ │ │ ├── Answers.h
│ │ │ │ ├── CLSAttributes.h
│ │ │ │ ├── CLSLogging.h
│ │ │ │ ├── CLSReport.h
│ │ │ │ ├── CLSStackFrame.h
│ │ │ │ └── Crashlytics.h
│ │ │ ├── Info.plist
│ │ │ ├── Modules/
│ │ │ │ └── module.modulemap
│ │ │ ├── run
│ │ │ ├── submit
│ │ │ └── uploadDSYM
│ │ └── submit
│ ├── ECSlidingViewController/
│ │ ├── ECSlidingViewController/
│ │ │ ├── ECPercentDrivenInteractiveTransition.h
│ │ │ ├── ECPercentDrivenInteractiveTransition.m
│ │ │ ├── ECSlidingAnimationController.h
│ │ │ ├── ECSlidingAnimationController.m
│ │ │ ├── ECSlidingConstants.h
│ │ │ ├── ECSlidingInteractiveTransition.h
│ │ │ ├── ECSlidingInteractiveTransition.m
│ │ │ ├── ECSlidingSegue.h
│ │ │ ├── ECSlidingSegue.m
│ │ │ ├── ECSlidingViewController.h
│ │ │ ├── ECSlidingViewController.m
│ │ │ ├── UIViewController+ECSlidingViewController.h
│ │ │ └── UIViewController+ECSlidingViewController.m
│ │ ├── LICENSE
│ │ └── README.md
│ ├── Fabric/
│ │ ├── Fabric.framework/
│ │ │ ├── README
│ │ │ └── run
│ │ ├── README.md
│ │ ├── iOS/
│ │ │ └── Fabric.framework/
│ │ │ ├── Fabric
│ │ │ ├── Headers/
│ │ │ │ ├── FABAttributes.h
│ │ │ │ └── Fabric.h
│ │ │ ├── Info.plist
│ │ │ ├── Modules/
│ │ │ │ └── module.modulemap
│ │ │ ├── run
│ │ │ └── uploadDSYM
│ │ ├── run
│ │ ├── upload-symbols
│ │ └── uploadDSYM
│ ├── ISO8601DateFormatter/
│ │ ├── ISO8601DateFormatter.h
│ │ ├── ISO8601DateFormatter.m
│ │ ├── LICENSE.txt
│ │ └── README.md
│ ├── Local Podspecs/
│ │ └── CoreBitcoin.podspec.json
│ ├── MBProgressHUD/
│ │ ├── LICENSE
│ │ ├── MBProgressHUD.h
│ │ ├── MBProgressHUD.m
│ │ └── README.mdown
│ ├── OpenSSL-Universal/
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── include-ios/
│ │ │ └── openssl/
│ │ │ ├── aes.h
│ │ │ ├── asn1.h
│ │ │ ├── asn1_mac.h
│ │ │ ├── asn1t.h
│ │ │ ├── bio.h
│ │ │ ├── blowfish.h
│ │ │ ├── bn.h
│ │ │ ├── buffer.h
│ │ │ ├── camellia.h
│ │ │ ├── cast.h
│ │ │ ├── cmac.h
│ │ │ ├── cms.h
│ │ │ ├── comp.h
│ │ │ ├── conf.h
│ │ │ ├── conf_api.h
│ │ │ ├── crypto.h
│ │ │ ├── des.h
│ │ │ ├── des_old.h
│ │ │ ├── dh.h
│ │ │ ├── dsa.h
│ │ │ ├── dso.h
│ │ │ ├── dtls1.h
│ │ │ ├── e_os2.h
│ │ │ ├── ebcdic.h
│ │ │ ├── ec.h
│ │ │ ├── ecdh.h
│ │ │ ├── ecdsa.h
│ │ │ ├── engine.h
│ │ │ ├── err.h
│ │ │ ├── evp.h
│ │ │ ├── hmac.h
│ │ │ ├── idea.h
│ │ │ ├── krb5_asn.h
│ │ │ ├── kssl.h
│ │ │ ├── lhash.h
│ │ │ ├── md4.h
│ │ │ ├── md5.h
│ │ │ ├── mdc2.h
│ │ │ ├── modes.h
│ │ │ ├── obj_mac.h
│ │ │ ├── objects.h
│ │ │ ├── ocsp.h
│ │ │ ├── opensslconf.h
│ │ │ ├── opensslv.h
│ │ │ ├── ossl_typ.h
│ │ │ ├── pem.h
│ │ │ ├── pem2.h
│ │ │ ├── pkcs12.h
│ │ │ ├── pkcs7.h
│ │ │ ├── pqueue.h
│ │ │ ├── rand.h
│ │ │ ├── rc2.h
│ │ │ ├── rc4.h
│ │ │ ├── ripemd.h
│ │ │ ├── rsa.h
│ │ │ ├── safestack.h
│ │ │ ├── seed.h
│ │ │ ├── sha.h
│ │ │ ├── srp.h
│ │ │ ├── srtp.h
│ │ │ ├── ssl.h
│ │ │ ├── ssl2.h
│ │ │ ├── ssl23.h
│ │ │ ├── ssl3.h
│ │ │ ├── stack.h
│ │ │ ├── symhacks.h
│ │ │ ├── tls1.h
│ │ │ ├── ts.h
│ │ │ ├── txt_db.h
│ │ │ ├── ui.h
│ │ │ ├── ui_compat.h
│ │ │ ├── whrlpool.h
│ │ │ ├── x509.h
│ │ │ ├── x509_vfy.h
│ │ │ └── x509v3.h
│ │ └── lib-ios/
│ │ ├── libcrypto.a
│ │ └── libssl.a
│ ├── Pods.xcodeproj/
│ │ └── project.pbxproj
│ ├── RNCryptor/
│ │ ├── README.md
│ │ └── RNCryptor/
│ │ ├── RNCryptor+Private.h
│ │ ├── RNCryptor.h
│ │ ├── RNCryptor.m
│ │ ├── RNCryptorEngine.h
│ │ ├── RNCryptorEngine.m
│ │ ├── RNDecryptor.h
│ │ ├── RNDecryptor.m
│ │ ├── RNEncryptor.h
│ │ ├── RNEncryptor.m
│ │ ├── RNOpenSSLCryptor.h
│ │ ├── RNOpenSSLCryptor.m
│ │ ├── RNOpenSSLDecryptor.h
│ │ ├── RNOpenSSLDecryptor.m
│ │ ├── RNOpenSSLEncryptor.h
│ │ └── RNOpenSSLEncryptor.m
│ ├── SwiftTryCatch/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SwiftTryCatch.h
│ │ └── SwiftTryCatch.m
│ ├── Target Support Files/
│ │ ├── AFNetworking/
│ │ │ ├── AFNetworking-dummy.m
│ │ │ ├── AFNetworking-prefix.pch
│ │ │ └── AFNetworking.xcconfig
│ │ ├── CoreBitcoin/
│ │ │ ├── CoreBitcoin-dummy.m
│ │ │ ├── CoreBitcoin-prefix.pch
│ │ │ └── CoreBitcoin.xcconfig
│ │ ├── ECSlidingViewController/
│ │ │ ├── ECSlidingViewController-dummy.m
│ │ │ ├── ECSlidingViewController-prefix.pch
│ │ │ └── ECSlidingViewController.xcconfig
│ │ ├── ISO8601DateFormatter/
│ │ │ ├── ISO8601DateFormatter-dummy.m
│ │ │ ├── ISO8601DateFormatter-prefix.pch
│ │ │ └── ISO8601DateFormatter.xcconfig
│ │ ├── MBProgressHUD/
│ │ │ ├── MBProgressHUD-dummy.m
│ │ │ ├── MBProgressHUD-prefix.pch
│ │ │ └── MBProgressHUD.xcconfig
│ │ ├── Pods-ArcBit/
│ │ │ ├── Pods-ArcBit-acknowledgements.markdown
│ │ │ ├── Pods-ArcBit-acknowledgements.plist
│ │ │ ├── Pods-ArcBit-dummy.m
│ │ │ ├── Pods-ArcBit-frameworks.sh
│ │ │ ├── Pods-ArcBit-resources.sh
│ │ │ ├── Pods-ArcBit.debug.xcconfig
│ │ │ └── Pods-ArcBit.release.xcconfig
│ │ ├── Pods-ArcBitTests/
│ │ │ ├── Pods-ArcBitTests-acknowledgements.markdown
│ │ │ ├── Pods-ArcBitTests-acknowledgements.plist
│ │ │ ├── Pods-ArcBitTests-dummy.m
│ │ │ ├── Pods-ArcBitTests-frameworks.sh
│ │ │ ├── Pods-ArcBitTests-resources.sh
│ │ │ ├── Pods-ArcBitTests.debug.xcconfig
│ │ │ └── Pods-ArcBitTests.release.xcconfig
│ │ ├── RNCryptor/
│ │ │ ├── RNCryptor-dummy.m
│ │ │ ├── RNCryptor-prefix.pch
│ │ │ └── RNCryptor.xcconfig
│ │ ├── SwiftTryCatch/
│ │ │ ├── SwiftTryCatch-dummy.m
│ │ │ ├── SwiftTryCatch-prefix.pch
│ │ │ └── SwiftTryCatch.xcconfig
│ │ └── iCloudDocumentSync/
│ │ ├── iCloudDocumentSync-dummy.m
│ │ ├── iCloudDocumentSync-prefix.pch
│ │ └── iCloudDocumentSync.xcconfig
│ └── iCloudDocumentSync/
│ ├── LICENSE.md
│ ├── README.md
│ └── iCloud/
│ ├── iCloud-Prefix.pch
│ ├── iCloud.h
│ ├── iCloud.m
│ ├── iCloudDocument.h
│ └── iCloudDocument.m
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
.DS_Store
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
#
# Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
ArcBit.xcworkspace/xcshareddata/
================================================
FILE: ArcBit/APIs/TLBitcoinListener.swift
================================================
//
// TLBitcoinListener.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
@objc class TLTransactionListener: NSObject, SRWebSocketDelegate {
let MAX_CONSECUTIVE_FAILED_CONNECTIONS = 5
let SEND_EMPTY_PACKET_TIME_INTERVAL = 60.0
fileprivate var blockExplorerAPI: TLBlockExplorer?
fileprivate var keepAliveTimer: Timer?
fileprivate var socket: SocketIOClient?
fileprivate var socketIsConnected: Bool = false
fileprivate var webSocket: SRWebSocket?
var consecutiveFailedConnections = 0
struct STATIC_MEMBERS {
static var instance: TLTransactionListener?
}
class func instance() -> (TLTransactionListener) {
if (STATIC_MEMBERS.instance == nil) {
STATIC_MEMBERS.instance = TLTransactionListener()
}
return STATIC_MEMBERS.instance!
}
override init() {
super.init()
blockExplorerAPI = TLPreferences.getBlockExplorerAPI()
}
func reconnect() -> () {
if (blockExplorerAPI == TLBlockExplorer.blockchain) {
DLog("websocket reconnect blockchain.info")
self.webSocket?.delegate = nil
self.webSocket?.close()
self.webSocket = SRWebSocket(urlRequest: URLRequest(url: URL(string: "wss://ws.blockchain.info/inv")!))
self.webSocket?.delegate = self
self.webSocket?.open()
} else {
DLog("websocket reconnect insight")
let url = String(format: "%@", TLPreferences.getBlockExplorerURL(TLBlockExplorer.insight)!)
self.socket = SocketIOClient(socketURL: URL(string: url)!, config: [.log(false), .forcePolling(true)])
weak var weakSelf = self
self.socket?.on("connect") {data, ack in
DLog("socketio onConnect")
self.consecutiveFailedConnections = 0
weakSelf!.socketIsConnected = true
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_TRANSACTION_LISTENER_OPEN()), object: nil, userInfo: nil)
weakSelf!.socket!.emit("subscribe", "inv")
}
self.socket?.on("disconnect") {data, ack in
DLog("socketio onDisconnect")
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_TRANSACTION_LISTENER_CLOSE()), object: nil, userInfo: nil)
if self.consecutiveFailedConnections < self.MAX_CONSECUTIVE_FAILED_CONNECTIONS {
self.reconnect()
}
self.consecutiveFailedConnections += 1
}
self.socket?.on("error") {data, ack in
DLog("socketio error: \(data as AnyObject)")
}
self.socket?.on("block") {data, ack in
let dataArray = data as NSArray
let firstObject: AnyObject? = dataArray.firstObject as AnyObject?
// data!.debugDescription is lastest block hash
// can't use this to update confirmations on transactions because insight tx does not contain blockheight field
DLog("socketio received lastest block hash: \(firstObject!.debugDescription)")
}
// self.socket?.on("tx") {data, ack in
// DLog("socketio__ tx \(data)")
// }
self.socket?.connect()
}
}
func isWebSocketOpen() -> Bool {
if (blockExplorerAPI == TLBlockExplorer.blockchain) {
guard let webSocket = self.webSocket else { return false }
return webSocket.readyState.rawValue == SR_OPEN.rawValue
} else {
return self.socketIsConnected
}
}
fileprivate func sendWebSocketMessage(_ msg: String) -> Bool {
DLog("sendWebSocketMessage msg: \(msg)")
if self.isWebSocketOpen() {
self.webSocket?.send(msg)
return true
} else {
DLog("Websocket Error: not connect to websocket server")
return false
}
}
@discardableResult func listenToIncomingTransactionForAddress(_ address: String) -> Bool {
//DLog("listen address: %@", address)
if (blockExplorerAPI == TLBlockExplorer.blockchain) {
if self.isWebSocketOpen() {
let msg = String(format: "{\"op\":\"addr_sub\", \"addr\":\"%@\"}", address)
self.sendWebSocketMessage(msg)
return true
} else {
DLog("Websocket Error: not connect to websocket server")
return false
}
} else {
if (self.socketIsConnected) {
guard let socket = self.socket else { return false }
//DLog("socketio emit address: \(address)")
socket.emit("unsubscribe", "bitcoind/addresstxid", [address])
socket.emit("subscribe", "bitcoind/addresstxid", [address])
socket.on("bitcoind/addresstxid") {data, ack in
DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.high).async {
DLog("socketio on data: \(data)")
let dataArray = data as NSArray
let dataDictionary = dataArray.firstObject as! NSDictionary
let addr = dataDictionary["address"] as! String
//bad api design, this on is not address specific, will call for every subscribe address
if (addr == address) {
let txHash = dataDictionary["txid"] as! String
//DLog("socketio on address: \(addr)")
//DLog("socketio transaction: \(txHash)")
TLBlockExplorerAPI.instance().getTx(txHash, success: {
(txDict: AnyObject?) in
if let txDict = txDict {
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_NEW_UNCONFIRMED_TRANSACTION()), object: txDict, userInfo: nil)
}
}, failure: {
(code, status) in
})
}
}
}
return true
} else {
return false
}
}
}
func close() -> () {
if (blockExplorerAPI == TLBlockExplorer.blockchain) {
DLog("closing blockchain.info websocket")
self.webSocket?.close()
} else {
DLog("closing socketio")
self.socket?.disconnect()
}
}
fileprivate func keepAlive() -> () {
keepAliveTimer?.invalidate()
keepAliveTimer = nil
keepAliveTimer = Timer.scheduledTimer(timeInterval: SEND_EMPTY_PACKET_TIME_INTERVAL,
target: self,
selector: #selector(TLTransactionListener.sendEmptyPacket),
userInfo: nil,
repeats: true)
}
func sendEmptyPacket() -> () {
DLog("blockchain.info Websocket sendEmptyPacket")
if self.isWebSocketOpen() {
self.sendWebSocketMessage("")
}
}
func webSocketDidOpen(_ webSocket: SRWebSocket) -> () {
DLog("blockchain.info webSocketDidOpen")
consecutiveFailedConnections = 0
self.sendWebSocketMessage("{\"op\":\"blocks_sub\"}")
self.keepAlive()
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_TRANSACTION_LISTENER_OPEN()), object: nil, userInfo: nil)
}
func webSocket(_ webSocket:SRWebSocket, didFailWithError error:NSError) -> () {
DLog("blockchain.info Websocket didFailWithError \(error.description)")
self.webSocket?.delegate = nil
self.webSocket?.close()
self.webSocket = nil
if consecutiveFailedConnections < MAX_CONSECUTIVE_FAILED_CONNECTIONS {
self.reconnect()
}
consecutiveFailedConnections += 1
}
public func webSocket(_ webSocket: SRWebSocket!, didReceiveMessage message: Any!) {
DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.high).async {
let data = (message as AnyObject).data(using: String.Encoding.utf8.rawValue)
let jsonDict = (try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions(rawValue: 0))) as! NSDictionary
DLog("blockchain.info didReceiveMessage \(jsonDict.description)")
if (jsonDict.object(forKey: "op") as! String == "utx") {
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_NEW_UNCONFIRMED_TRANSACTION()), object: jsonDict.object(forKey: "x"), userInfo: nil)
} else if (jsonDict.object(forKey: "op") as! String == "block") {
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_NEW_BLOCK()), object: jsonDict.object(forKey: "x"), userInfo: nil)
}
}
}
func webSocket(_ webSocket: SRWebSocket, didCloseWithCode code: Int, reason: String, wasClean: Bool) -> () {
if wasClean {
DLog("blockchain.info Websocket didCloseWithCode With No Error \(code) \(reason)")
} else {
DLog("blockchain.info Websocket didCloseWithCode With Error \(code) \(reason)")
}
self.webSocket?.delegate = nil
self.webSocket?.close()
self.webSocket = nil
if consecutiveFailedConnections < MAX_CONSECUTIVE_FAILED_CONNECTIONS {
self.reconnect()
}
consecutiveFailedConnections += 1
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_TRANSACTION_LISTENER_CLOSE()), object: nil, userInfo: nil)
}
}
================================================
FILE: ArcBit/APIs/TLBlockExplorerAPI.swift
================================================
//
// TLBlockExplorerAPI.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
enum TLBlockExplorer:Int {
case blockchain = 0
case insight = 1
case toshi = 2
case blockr = 3
}
class TLBlockExplorerAPI {
struct STATIC_MEMBERS {
static var blockExplorerAPI:TLBlockExplorer = .blockchain
static var BLOCKEXPLORER_BASE_URL:String? = "https://blockchain.info/"
static var _instance:TLBlockExplorerAPI? = nil
}
var blockchainAPI:TLBlockchainAPI? = nil
var insightAPI:TLInsightAPI? = nil
class func instance() -> (TLBlockExplorerAPI) {
if(STATIC_MEMBERS._instance == nil) {
var blockExplorerURL = TLPreferences.getBlockExplorerURL(TLPreferences.getBlockExplorerAPI())
if (blockExplorerURL == nil) {
TLPreferences.resetBlockExplorerAPIURL()
blockExplorerURL = TLPreferences.getBlockExplorerURL(TLPreferences.getBlockExplorerAPI())
}
STATIC_MEMBERS.BLOCKEXPLORER_BASE_URL = blockExplorerURL
STATIC_MEMBERS.blockExplorerAPI = TLPreferences.getBlockExplorerAPI()
STATIC_MEMBERS._instance = TLBlockExplorerAPI()
}
return STATIC_MEMBERS._instance!
}
init() {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
self.blockchainAPI = TLBlockchainAPI(baseURL: STATIC_MEMBERS.BLOCKEXPLORER_BASE_URL!)
//needed for push tx api for stealth addresses
self.insightAPI = TLInsightAPI(baseURL: "https://insight.bitpay.com/")
} else if (STATIC_MEMBERS.blockExplorerAPI == .insight) {
self.insightAPI = TLInsightAPI(baseURL: STATIC_MEMBERS.BLOCKEXPLORER_BASE_URL!)
}
}
func getBlockHeight(_ success: @escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> (){
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
self.blockchainAPI!.getBlockHeight({(height:AnyObject!) in
let blockHeight = ["height": NSNumber(value: (height as! NSString).longLongValue as Int64)]
success(blockHeight as AnyObject!)
}, failure:failure)
}
else {
//Insight does not have a good way to get block height
/*
self.insightAPI!.getBlockHeight({(jsonData:AnyObject!) in
let blockHeight = ["height": ((jsonData as! NSDictionary).objectForKey("txoutsetinfo") as! NSDictionary).objectForKey("height")!]
success(blockHeight)
}, failure:{(code:NSInteger, status:String!) in })
*/
}
}
func getAddressesInfoSynchronous(_ addressArray:Array<String>) -> NSDictionary {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
return self.blockchainAPI!.getAddressesInfoSynchronous(addressArray)
} else {
return self.insightAPI!.getAddressesInfoSynchronous(addressArray)
}
}
func getAddressesInfo(_ addressArray:Array<String>, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler)-> () {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
self.blockchainAPI!.getAddressesInfo(addressArray, success:success, failure:failure)
} else {
self.insightAPI!.getAddressesInfo(addressArray, success:success, failure:failure)
}
}
func getUnspentOutputs(_ addressArray:Array<String>, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
self.blockchainAPI!.getUnspentOutputs(addressArray, success:success, failure:failure)
} else {
self.insightAPI!.getUnspentOutputs(addressArray, success:success, failure:failure)
}
}
func getUnspentOutputsSynchronous(_ addressArray:NSArray) -> NSDictionary {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
return self.blockchainAPI!.getUnspentOutputsSynchronous(addressArray)
} else {
return self.insightAPI!.getUnspentOutputsSynchronous(addressArray)
}
}
func getAddressDataSynchronous(_ address:String) -> NSDictionary {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
return self.blockchainAPI!.getAddressDataSynchronous(address)
} else {
return self.insightAPI!.getAddressDataSynchronous(address)
}
}
func getAddressData(_ address:String, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
self.blockchainAPI!.getAddressData(address, success:success, failure:failure)
} else {
self.insightAPI!.getAddressData(address, success: success, failure: failure)
}
}
func getTx(_ txHash:String, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
self.blockchainAPI!.getTx(txHash, success:success, failure:failure)
} else {
self.insightAPI!.getTx(txHash, success:{(jsonData:AnyObject!) in
let transformedTx = TLInsightAPI.insightTxToBlockchainTx(jsonData as! NSDictionary)
success(transformedTx)
}, failure:{(code, status) in
failure(code, status)
})
}
}
func getTxBackground(_ txHash:String, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
self.blockchainAPI!.getTxBackground(txHash, success:success, failure:failure)
} else {
self.insightAPI!.getTxBackground(txHash, success:{(jsonData:AnyObject!) in
let transformedTx = TLInsightAPI.insightTxToBlockchainTx(jsonData as! NSDictionary)
success(transformedTx)
}, failure:{(code, status) in
failure(code, status)
})
}
}
func pushTx(_ txHex:String, txHash:String, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler)-> () {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
self.blockchainAPI!.pushTx(txHex, txHash:txHash, success:success, failure:failure)
} else {
self.insightAPI!.pushTx(txHex, success:success, failure:failure)
}
}
func openWebViewForAddress(_ address:String) -> () {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
let endPoint = "address/"
let url = String(format: "%@%@%@", STATIC_MEMBERS.BLOCKEXPLORER_BASE_URL!, endPoint, address)
UIApplication.shared.openURL(URL(string: url)!)
} else {
let endPoint = "address/"
let url = String(format: "%@%@%@",STATIC_MEMBERS.BLOCKEXPLORER_BASE_URL!, endPoint, address)
UIApplication.shared.openURL(URL(string:url)!)
}
}
func openWebViewForTransaction(_ txid:String) -> () {
if (STATIC_MEMBERS.blockExplorerAPI == .blockchain) {
let endPoint = "tx/"
let url = String(format: "%@%@%@",STATIC_MEMBERS.BLOCKEXPLORER_BASE_URL!, endPoint, txid)
UIApplication.shared.openURL(URL(string: url)!)
} else {
let endPoint = "tx/"
let url = String(format: "%@%@%@",STATIC_MEMBERS.BLOCKEXPLORER_BASE_URL!, endPoint, txid)
UIApplication.shared.openURL(URL(string: url)!)
}
}
}
================================================
FILE: ArcBit/APIs/TLBlockchainAPI.swift
================================================
//
// TLBlockchainAPI.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
class TLBlockchainAPI {
struct STATIC_MEMBERS {
static let BLOCKCHAIN_ENDPOINT_ADDRESS = "address/"
static let BLOCKCHAIN_ENDPOINT_TX = "tx/"
static let BC_REQ_FORMAT = "format"
static let BC_REQ_ACTIVE = "active"
}
var networking:TLNetworking
var baseURL:String
init(baseURL: String) {
self.networking = TLNetworking()
self.baseURL = baseURL
}
func getBlockHeight(_ success: @escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> (){
let endPoint = "q/getblockcount"
let url = URL(string: endPoint, relativeTo:URL(string:self.baseURL))
self.networking.httpGET(url!, parameters:nil,
success: {(jsonData:AnyObject!) in
success(jsonData!)
}, failure:{(code, status) in
if (code == 200) {
success(status as AnyObject!)
} else {
failure(code, status)
}
})
}
func getAddressData(_ address:String, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
let endPoint = String(format:"%@%@", STATIC_MEMBERS.BLOCKCHAIN_ENDPOINT_ADDRESS, address)
let parameters = [
STATIC_MEMBERS.BC_REQ_FORMAT: "json"
]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
self.networking.httpGET(url!, parameters:parameters as NSDictionary,
success:success, failure:failure)
}
func getAddressDataSynchronous(_ address:String) -> NSDictionary {
let endPoint = String(format:"%@%@", STATIC_MEMBERS.BLOCKCHAIN_ENDPOINT_ADDRESS, address)
let parameters = [
STATIC_MEMBERS.BC_REQ_FORMAT: "json"
]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
return self.networking.httpGETSynchronous(url!, parameters:parameters as NSDictionary) as! NSDictionary
}
func getTx(_ txHash:String, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
let endPoint = String(format:"%@%@", STATIC_MEMBERS.BLOCKCHAIN_ENDPOINT_TX, txHash)
let parameters = [
STATIC_MEMBERS.BC_REQ_FORMAT: "json"
]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
self.networking.httpGET(url!, parameters:parameters as NSDictionary,
success:success, failure:failure)
}
func getTxBackground(_ txHash:String, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
let endPoint = String(format:"%@%@", STATIC_MEMBERS.BLOCKCHAIN_ENDPOINT_TX, txHash)
let parameters = [
STATIC_MEMBERS.BC_REQ_FORMAT: "json"
]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
self.networking.httpGETBackground(url!, parameters:parameters as NSDictionary,
success:success, failure:failure)
}
func pushTx(_ txHex:String, txHash:String, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
let endPoint = "pushtx"
let parameters = [
STATIC_MEMBERS.BC_REQ_FORMAT: "plain",
"tx":txHex
]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
self.networking.httpPOST(url!, parameters:parameters as NSDictionary,
success:success, failure:failure)
}
func getUnspentOutputsSynchronous(_ addressArray:NSArray) -> NSDictionary {
let endPoint = "unspent"
let parameters = [
STATIC_MEMBERS.BC_REQ_ACTIVE:addressArray.componentsJoined(by: "|")
]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
return self.networking.httpGETSynchronous(url!, parameters:parameters as NSDictionary) as! NSDictionary
}
func getUnspentOutputs(_ addressArray:Array<String>, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
let endPoint = "unspent"
let parameters = [
STATIC_MEMBERS.BC_REQ_ACTIVE:addressArray.joined(separator: "|")
]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
self.networking.httpGET(url!, parameters:parameters as NSDictionary,
success:success, failure:failure)
}
func getAddressesInfoSynchronous(_ addressArray:Array<String>) -> NSDictionary{
let endPoint = "multiaddr"
let parameters = [
STATIC_MEMBERS.BC_REQ_ACTIVE:addressArray.joined(separator: "|"),
"no_buttons":"true"]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
return self.networking.httpGETSynchronous(url!, parameters:parameters as NSDictionary) as! NSDictionary
}
func getAddressesInfo(_ addressArray:Array<String>, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
let endPoint = "multiaddr"
let parameters = [
STATIC_MEMBERS.BC_REQ_ACTIVE:addressArray.joined(separator: "|"),
"no_buttons":"true"]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
self.networking.httpGET(url!, parameters:parameters as NSDictionary,
success:success, failure:failure)
}
}
================================================
FILE: ArcBit/APIs/TLBlockrAPI.swift
================================================
//
// TLBlockrAPI.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
class TLBlockrAPI {
var networking:TLNetworking
let baseURL:String = "https://btc.blockr.io/"
init() {
self.networking = TLNetworking()
}
// https://btc.blockr.io/documentation/api
/*
//success response from pushTx
{
code = 200
data = txid
message = ""
status = success
}
*/
func pushTx(_ txHex: String, success: @escaping TLNetworking.SuccessHandler, failure: @escaping TLNetworking.FailureHandler) {
let endPoint = "api/v1/tx/push"
let parameters = [
"hex": txHex
]
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
self.networking.httpPOST(url, parameters: parameters as NSDictionary,
success: success, failure: failure)
}
}
================================================
FILE: ArcBit/APIs/TLExchangeRate.swift
================================================
//
// TLExchangeRate.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
class TLExchangeRate {
struct STATIC_MEMBERS {
static var instance:TLExchangeRate?
}
fileprivate var exchangeRateDict:NSMutableDictionary? = nil
var networking:TLNetworking
class func instance() -> (TLExchangeRate) {
if(STATIC_MEMBERS.instance == nil) {
STATIC_MEMBERS.instance = TLExchangeRate()
}
return STATIC_MEMBERS.instance!
}
init() {
self.networking = TLNetworking()
self.exchangeRateDict = NSMutableDictionary()
updateExchangeRate()
}
func updateExchangeRate() {
let queue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.background)
queue.async {
self.getExchangeRates({ (jsonData:AnyObject!) in
let array = jsonData as! NSArray
for i in stride(from: 0, to: array.count, by: 1) {
let dict = array[i] as! NSDictionary
(self.exchangeRateDict!)[dict["code"] as! String] = dict
}
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_EXCHANGE_RATE_UPDATED()),
object: nil)
}, failure: {(code, status) in
DLog("getExchangeRates failure: code:\(code) status:\(status)")
})
} }
fileprivate func getExchangeRate(_ currency:String) -> (Double) {
if (self.exchangeRateDict == nil || self.exchangeRateDict![currency] == nil) {
return 0
} else {
return ((self.exchangeRateDict![currency] as! NSDictionary)["rate"] as! Double)
}
}
fileprivate func getExchangeRates(_ success: @escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler) -> () {
self.networking.httpGET(URL(string: "https://bitpay.com/api/rates")!,
parameters:[:], success:success, failure:failure)
}
fileprivate func fiatAmountFromBitcoin(_ currency:String, bitcoinAmount:TLCoin) -> (Double) {
let exchangeRate = getExchangeRate(currency)
return bitcoinAmount.bigIntegerToBitcoin() * exchangeRate
}
func bitcoinAmountFromFiat(_ currency:String, fiatAmount:Double) -> (TLCoin) {
let exchangeRate = getExchangeRate(currency)
let bitcoinAmount = TLCoin(doubleValue: fiatAmount/exchangeRate)
return bitcoinAmount
}
func fiatAmountStringFromBitcoin(_ currency:String, bitcoinAmount:TLCoin) -> (String){
//TODO move bitcoinFormatter to property
let bitcoinFormatter = NumberFormatter()
bitcoinFormatter.numberStyle = .decimal
bitcoinFormatter.maximumFractionDigits = 2
return bitcoinFormatter.string(from: NSNumber(value: fiatAmountFromBitcoin(currency, bitcoinAmount:bitcoinAmount) as Double))!
}
}
================================================
FILE: ArcBit/APIs/TLInsightAPI.swift
================================================
//
// TLInsightAPI.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
class TLInsightAPI {
var networking:TLNetworking
var baseURL:String
init(baseURL: String) {
self.networking = TLNetworking()
self.baseURL = baseURL
}
func getBlockHeight(_ success: @escaping (TLNetworking.SuccessHandler), failure: @escaping (TLNetworking.FailureHandler)) {
let endPoint = "api/status/"
let parameters = [
"q": "getTxOutSetInfo"
]
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
self.networking.httpGET(url, parameters: parameters as NSDictionary,
success: {
(jsonData) in
success(jsonData)
}, failure: {
(code, status) in
failure(code, status)
})
}
func getUnspentOutputsSynchronous(_ addressArray: NSArray) -> NSDictionary {
let endPoint = String(format: "%@%@%@", "api/addrs/", addressArray.componentsJoined(by: ","), "/utxo")
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
let jsonData: AnyObject? = self.networking.httpGETSynchronous(url, parameters: nil)
if jsonData is NSDictionary { // if don't get dict http error, will get array
return jsonData as! NSDictionary
}
let transansformedJsonData = TLInsightAPI.insightUnspentOutputsToBlockchainUnspentOutputs(jsonData as! NSArray)
return transansformedJsonData
}
func getUnspentOutputs(_ addressArray: Array<String>, success: @escaping TLNetworking.SuccessHandler, failure: @escaping TLNetworking.FailureHandler) {
let endPoint = String(format: "%@%@%@", "api/addrs/", addressArray.joined(separator: ","), "/utxo")
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
self.networking.httpGET(url, parameters: nil,
success: {
(jsonData) in
let transansformedJsonData = TLInsightAPI.insightUnspentOutputsToBlockchainUnspentOutputs(jsonData as! NSArray) as NSDictionary
success(transansformedJsonData)
}, failure: {
(code, status) in
failure(code, status)
})
}
func getAddressesInfoSynchronous(_ addressArray: Array<String>, txCountFrom: Int=0, allTxs: NSMutableArray=[]) -> NSDictionary {
let endPoint = String(format: "%@%@%@", "api/addrs/", addressArray.joined(separator: ","), "/txs")
let parameters = ["from":txCountFrom, "to":txCountFrom+50]
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
let jsonData: AnyObject? = self.networking.httpGETSynchronous(url, parameters: parameters as NSDictionary)
if ((jsonData as! NSDictionary).object(forKey: TLNetworking.STATIC_MEMBERS.HTTP_ERROR_CODE) != nil) {
return jsonData as! NSDictionary
}
let txs = (jsonData as! NSDictionary).object(forKey: "items") as! NSArray
let to = ((jsonData as! NSDictionary).object(forKey: "to") as! NSNumber)
let totalItems = ((jsonData as! NSDictionary).object(forKey: "totalItems") as! NSNumber).uint64Value
if to.uint64Value >= totalItems {
if allTxs.count == 0 {
let transansformedJsonData = TLInsightAPI.insightAddressesTxsToBlockchainMultiaddr(addressArray as NSArray, txs: txs)
return transansformedJsonData
} else {
allTxs.addObjects(from: txs as [AnyObject])
let transansformedJsonData = TLInsightAPI.insightAddressesTxsToBlockchainMultiaddr(addressArray as NSArray, txs: allTxs)
return transansformedJsonData
}
} else {
allTxs.addObjects(from: txs as [AnyObject])
return self.getAddressesInfoSynchronous(addressArray, txCountFrom: to.intValue, allTxs: allTxs)
}
}
func getAddressesInfo(_ addressArray: Array<String>, txCountFrom: Int=0, allTxs: NSMutableArray=[], success: @escaping TLNetworking.SuccessHandler, failure: @escaping TLNetworking.FailureHandler) {
let endPoint = String(format: "%@%@%@", "api/addrs/", addressArray.joined(separator: ","), "/txs")
let parameters = ["from":txCountFrom, "to":txCountFrom+50]
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
self.networking.httpGET(url, parameters: parameters as NSDictionary,
success: {
(jsonData) in
let txs = (jsonData as! NSDictionary).object(forKey: "items") as! NSArray
let to = ((jsonData as! NSDictionary).object(forKey: "to") as! NSNumber)
let totalItems = ((jsonData as! NSDictionary).object(forKey: "totalItems") as! NSNumber).uint64Value
if to.uint64Value >= totalItems {
if allTxs.count == 0 {
let transformedJsonData = TLInsightAPI.insightAddressesTxsToBlockchainMultiaddr(addressArray as NSArray, txs: txs)
success(transformedJsonData)
} else {
allTxs.addObjects(from: txs as [AnyObject])
let transformedJsonData = TLInsightAPI.insightAddressesTxsToBlockchainMultiaddr(addressArray as NSArray, txs: allTxs)
success(transformedJsonData)
}
} else {
allTxs.addObjects(from: txs as [AnyObject])
self.getAddressesInfo(addressArray, txCountFrom: to.intValue, allTxs: allTxs, success: success, failure: failure)
}
}, failure: failure)
}
func getAddressData(_ address: String, success: @escaping TLNetworking.SuccessHandler, failure: @escaping TLNetworking.FailureHandler) {
let endPoint = String(format: "%@%@", "api/txs/?address=", address)
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
self.networking.httpGET(url, parameters: nil,
success: {
(jsonData) in
let txs = (jsonData as! NSDictionary!).object(forKey: "txs") as! NSArray
let transformedTxs = NSMutableArray(capacity:txs.count)
for tx in txs as! [NSDictionary] {
if let transformedTx = TLInsightAPI.insightTxToBlockchainTx(tx) {
transformedTxs.add(transformedTx)
}
}
let transansformedJsonData = NSMutableDictionary()
transansformedJsonData.setObject(transformedTxs, forKey:"txs" as NSCopying)
success(transansformedJsonData)
}, failure: failure)
}
func getAddressDataSynchronous(_ address: String) -> NSDictionary {
let endPoint = String(format: "%@%@", "api/txs/?address=", address)
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
let jsonData: AnyObject? = self.networking.httpGETSynchronous(url, parameters: nil)
let txs = (jsonData as! NSDictionary!).object(forKey: "txs") as! NSArray
let transformedTxs = NSMutableArray(capacity:txs.count)
for tx in txs as! [NSDictionary] {
if let transformedTx = TLInsightAPI.insightTxToBlockchainTx(tx) {
transformedTxs.add(transformedTx)
}
}
let transansformedJsonData = NSMutableDictionary()
transansformedJsonData.setObject(transformedTxs, forKey:"txs" as NSCopying)
return transansformedJsonData
}
func getTx(_ txHash: String, success: @escaping TLNetworking.SuccessHandler, failure: @escaping TLNetworking.FailureHandler) {
let endPoint = String(format: "%@%@", "api/tx/", txHash)
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
self.networking.httpGET(url, parameters: nil, success: success, failure: failure)
}
func getTxBackground(_ txHash: String, success: @escaping TLNetworking.SuccessHandler, failure: @escaping TLNetworking.FailureHandler) {
let endPoint = String(format: "%@%@", "api/tx/", txHash)
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
self.networking.httpGETBackground(url, parameters: nil, success: success, failure: failure)
}
class func insightToBlockchainUnspentOutput(_ unspentOutputDict: NSDictionary) -> NSDictionary? {
// bug in insight, see https://insight.bitpay.com/api/addrs/1GjuCPLhmrdrAdifz1XLdpVVeQjsvZYGou/utxo
if unspentOutputDict.object(forKey: "scriptPubKey") == nil {
// got following so far
// insight bug for txid 1cf031f8ac2896994e57c299e23b4ed35e2d218a7c6877302da0e3292337f530 when tried to do f5b0e820f23a6724f669463a6bf2e03806169b3d7fee7b6d27a642840109823d
DLog("no scriptPubKey, insight bug? txid \(unspentOutputDict.object(forKey: "txid") as! String)")
return nil
}
let blockchainUnspentOutputDict = NSMutableDictionary()
let txid = unspentOutputDict.object(forKey: "txid") as! String
let txHash = TLWalletUtils.reverseHexString(txid)
blockchainUnspentOutputDict.setObject(txHash, forKey: "tx_hash" as NSCopying)
blockchainUnspentOutputDict.setObject(txid, forKey: "tx_hash_big_endian" as NSCopying)
blockchainUnspentOutputDict.setObject(unspentOutputDict.object(forKey: "vout")!, forKey: "tx_output_n" as NSCopying)
blockchainUnspentOutputDict.setObject(unspentOutputDict.object(forKey: "scriptPubKey")!, forKey: "script" as NSCopying)
let value = (unspentOutputDict.object(forKey: "satoshis") as! NSNumber).uint64Value
blockchainUnspentOutputDict.setObject(value, forKey: "value" as NSCopying)
let confirmations: AnyObject? = unspentOutputDict.object(forKey: "confirmations") as AnyObject?
if (confirmations != nil) {
blockchainUnspentOutputDict.setObject(confirmations!, forKey: "confirmations" as NSCopying)
} else {
blockchainUnspentOutputDict.setObject(0, forKey: "confirmations" as NSCopying)
}
return blockchainUnspentOutputDict
}
func pushTx(_ txHex: String, success: @escaping TLNetworking.SuccessHandler, failure: @escaping TLNetworking.FailureHandler) {
let endPoint = "api/tx/send"
let parameters = [
"rawtx": txHex
]
let url = URL(string: endPoint, relativeTo: URL(string: self.baseURL))!
self.networking.httpPOST(url, parameters: parameters as NSDictionary,
success: success, failure: failure)
}
class func insightUnspentOutputsToBlockchainUnspentOutputs(_ unspentOutputs: NSArray) -> NSDictionary {
let transansformedUnspentOutputs = NSMutableArray(capacity: unspentOutputs.count)
for _unspentOutput in unspentOutputs {
let unspentOutput = _unspentOutput as! NSDictionary
if let dict = TLInsightAPI.insightToBlockchainUnspentOutput(unspentOutput) {
transansformedUnspentOutputs.add(dict)
}
}
let transansformedJsonData = NSMutableDictionary()
transansformedJsonData.setObject(transansformedUnspentOutputs, forKey: "unspent_outputs" as NSCopying)
return transansformedJsonData
}
class func insightAddressesTxsToBlockchainMultiaddr(_ addressArray: NSArray, txs: NSArray) -> NSDictionary {
let addressExistDict = NSMutableDictionary(capacity: addressArray.count)
let transansformedAddressesDict = NSMutableDictionary(capacity: addressArray.count)
for _address in addressArray {
let address = _address as! String
addressExistDict.setObject("", forKey: address as NSCopying)
let transformedAddress = NSMutableDictionary()
transformedAddress.setObject(0, forKey: "n_tx" as NSCopying)
transformedAddress.setObject(address, forKey: "address" as NSCopying)
transformedAddress.setObject(TLCoin.zero(), forKey: "final_balance" as NSCopying)
transansformedAddressesDict.setObject(transformedAddress, forKey: address as NSCopying)
}
let transformedTxs = NSMutableArray(capacity: txs.count)
let transansformedAddresses = NSMutableArray(capacity: addressArray.count)
var i = txs.count - 1
while i >= 0 {
if txs.object(at: i) as! NSObject == NSNull() {
i -= 1
continue
}
let tx = txs.object(at: i) as! NSDictionary
let transformedTx = TLInsightAPI.insightTxToBlockchainTx(tx)
if (transformedTx == nil) {
i -= 1
continue;
}
transformedTxs.add(transformedTx!)
let inputsArray = transformedTx!.object(forKey: "inputs") as? NSArray
if (inputsArray != nil) {
for _input in inputsArray! {
let input = _input as! NSDictionary
let prevOut = input.object(forKey: "prev_out") as? NSDictionary
if (prevOut != nil) {
let addr = prevOut!.object(forKey: "addr") as? String
if (addr != nil && addressExistDict.object(forKey: addr!) != nil) {
let transformedAddress = transansformedAddressesDict.object(forKey: addr!) as! NSMutableDictionary
var addressBalance = transformedAddress.object(forKey: "final_balance") as! TLCoin
let value = (prevOut!.object(forKey: "value") as! NSNumber).uint64Value
addressBalance = addressBalance.subtract(TLCoin(uint64: value))
transformedAddress.setObject(addressBalance, forKey: "final_balance" as NSCopying)
let nTxs = transformedAddress.object(forKey: "n_tx") as! Int
transformedAddress.setObject(nTxs + 1, forKey: "n_tx" as NSCopying)
}
}
}
}
let outsArray = transformedTx!.object(forKey: "out") as? NSArray
if (outsArray != nil) {
for _output in outsArray! {
let output = _output as! NSDictionary
let addr = output.object(forKey: "addr") as? String
if (addr != nil && addressExistDict.object(forKey: addr!) != nil) {
let transformedAddress = transansformedAddressesDict.object(forKey: addr!) as! NSMutableDictionary
var addressBalance = transformedAddress.object(forKey: "final_balance") as! TLCoin
let value = (output.object(forKey: "value") as! NSNumber).uint64Value
addressBalance = addressBalance.add(TLCoin(uint64: value))
transformedAddress.setObject(addressBalance, forKey: "final_balance" as NSCopying)
let nTxs = transformedAddress.object(forKey: "n_tx") as! Int
transformedAddress.setObject(nTxs + 1, forKey: "n_tx" as NSCopying)
}
}
}
i -= 1
}
//TODO: need to sort txs because insight does not sort it for you, ask devs to sort array
let sortedtransformedTxs = transformedTxs.sortedArray(comparator: {
(a, b) -> ComparisonResult in
let first = (a as! NSDictionary).object(forKey: "time") as! Int
if (first == 0) {
return ComparisonResult.orderedAscending
}
let second = (b as! NSDictionary).object(forKey: "time") as! Int
if (second == 0) {
return ComparisonResult.orderedDescending
}
if(second > first) {
return ComparisonResult.orderedDescending
}
else if (second == first) {
return ComparisonResult.orderedSame
}
return ComparisonResult.orderedAscending
})
for _key in transansformedAddressesDict {
let key = _key.key as! String
let transformedAddress = transansformedAddressesDict.object(forKey: key) as! NSMutableDictionary
let addressBalance = transformedAddress.object(forKey: "final_balance") as! TLCoin
transformedAddress.setObject(NSNumber(value: addressBalance.toUInt64() as UInt64), forKey: "final_balance" as NSCopying)
transansformedAddresses.add(transformedAddress)
}
let transansformedJsonData = NSMutableDictionary()
transansformedJsonData.setObject(sortedtransformedTxs, forKey: "txs" as NSCopying)
transansformedJsonData.setObject(transansformedAddresses, forKey: "addresses" as NSCopying)
return transansformedJsonData
}
class func insightTxToBlockchainTx(_ txDict: NSDictionary) -> NSDictionary? {
let blockchainTxDict = NSMutableDictionary()
let vins = txDict.object(forKey: "vin") as? NSArray
let vouts = txDict.object(forKey: "vout") as? NSArray
//if (vins == nil && vouts == nil && txDict.objectForKey("possibleDoubleSpend") != nil) {
if (vins == nil && vouts == nil) {
return nil;
}
if let txid = txDict.object(forKey: "txid") {
blockchainTxDict.setObject(txid, forKey: "hash" as NSCopying)
}
if let version = txDict.object(forKey: "version") {
blockchainTxDict.setObject(version, forKey: "ver" as NSCopying)
}
if let size = txDict.object(forKey: "size") {
blockchainTxDict.setObject(size, forKey: "size" as NSCopying)
}
//WARNING: time dont match on different blockexplorers, and field does not exist if unconfirmed
let time: AnyObject? = txDict.object(forKey: "time") as AnyObject?
if (time != nil) {
blockchainTxDict.setObject(time!, forKey: "time" as NSCopying)
} else {
blockchainTxDict.setObject(0, forKey: "time" as NSCopying)
}
//TODO: get current block and compute block_height
let confirmations: AnyObject? = txDict.object(forKey: "confirmations") as AnyObject?
if (confirmations != nil) {
blockchainTxDict.setObject(confirmations!, forKey:"block_height" as NSCopying)
blockchainTxDict.setObject(confirmations!, forKey:"confirmations" as NSCopying)
} else {
blockchainTxDict.setObject(0, forKey: "block_height" as NSCopying)
blockchainTxDict.setObject(0, forKey: "confirmations" as NSCopying)
}
if vins != nil {
let inputs = NSMutableArray()
for _vin in vins! {
let vin = _vin as! NSDictionary
let input = NSMutableDictionary()
if let sequence = vin.object(forKey: "sequence") {
input.setObject(sequence, forKey: "sequence" as NSCopying)
}
let prev_out = NSMutableDictionary()
let addr = vin.object(forKey: "addr") as? String
if (addr != nil) {
prev_out.setObject(addr!, forKey: "addr" as NSCopying)
} else {
//can be nil, for example, mined coins on tx 32ee55597c590bb104c524298b14fd1c0ac96a230810bd1e68d109df532a46a0
}
if let valueSat = vin.object(forKey: "valueSat") {
prev_out.setObject(valueSat, forKey: "value" as NSCopying)
}
if let n = vin.object(forKey: "n") {
prev_out.setObject(n, forKey: "n" as NSCopying)
}
input.setObject(prev_out, forKey: "prev_out" as NSCopying)
inputs.add(input)
}
blockchainTxDict.setObject(inputs, forKey: "inputs" as NSCopying)
}
if vouts != nil {
let outs = NSMutableArray()
for _vout in vouts! {
let vout = _vout as! NSDictionary
let aOut = NSMutableDictionary()
if let n = vout.object(forKey: "n") {
aOut.setObject(n, forKey: "n" as NSCopying)
}
if let scriptPubKey = (vout.object(forKey: "scriptPubKey") as? NSDictionary) {
let addresses = scriptPubKey.object(forKey: "addresses") as? NSArray
if (addresses != nil) {
if (addresses!.count == 1) {
aOut.setObject(addresses!.object(at: 0), forKey: "addr" as NSCopying)
}
}
if let hex = scriptPubKey.object(forKey: "hex") {
aOut.setObject(hex, forKey: "script" as NSCopying)
}
}
if let value = vout.object(forKey: "value") as? String {
let coinValue = TLCoin(bitcoinAmount: value, bitcoinDenomination: .bitcoin, locale: Locale(identifier: "en_US"))
aOut.setObject(Int(coinValue.toUInt64()), forKey: "value" as NSCopying)
}
outs.add(aOut)
}
blockchainTxDict.setObject(outs, forKey: "out" as NSCopying)
}
return blockchainTxDict
}
}
================================================
FILE: ArcBit/APIs/TLNetworking.swift
================================================
//
// TLNetworking.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
enum TLDOMAINREACHABLE:Int {
case wwan = 0
case wifi = 1
case notreachable = 2
}
class TLNetworking {
typealias ReachableHandler = (TLDOMAINREACHABLE) -> ()
typealias SuccessHandler = (AnyObject!) -> ()
typealias FailureHandler = (Int, String?) -> ()
struct STATIC_MEMBERS {
static var _instance:TLNetworking? = nil
static let HTTP_ERROR_CODE = "HTTPErrorCode"
static let HTTP_ERROR_MSG = "HTTPErrorMsg"
}
let getManager:AFHTTPRequestOperationManager
let postManager:AFHTTPRequestOperationManager
let getSynchronousManager:AFHTTPRequestOperationManager
let postSynchronousManager:AFHTTPRequestOperationManager
let getManagerBackground:AFHTTPRequestOperationManager
init(certificateData: Data? = nil) {
let ua = "Mozilla/5.0 (Macintosh Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36"
self.getManager = AFHTTPRequestOperationManager()
var requestSerializer = AFHTTPRequestSerializer()
requestSerializer.setValue(ua, forHTTPHeaderField:"User-Agent")
requestSerializer.setValue("utf-8", forHTTPHeaderField:"charset")
self.getManager.requestSerializer = requestSerializer
self.getManagerBackground = AFHTTPRequestOperationManager()
requestSerializer = AFHTTPRequestSerializer()
requestSerializer.setValue(ua, forHTTPHeaderField:"User-Agent")
requestSerializer.setValue("utf-8", forHTTPHeaderField:"charset")
self.getManagerBackground.requestSerializer = requestSerializer
self.getManagerBackground.completionQueue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default)
self.getSynchronousManager = AFHTTPRequestOperationManager()
requestSerializer = AFHTTPRequestSerializer()
requestSerializer.setValue(ua, forHTTPHeaderField:"User-Agent")
requestSerializer.setValue("utf-8", forHTTPHeaderField:"charset")
self.getSynchronousManager.requestSerializer = requestSerializer
self.getSynchronousManager.completionQueue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default)
self.postManager = AFHTTPRequestOperationManager()
var postRequestSerializer = AFHTTPRequestSerializer()
postRequestSerializer.setValue(ua, forHTTPHeaderField:"User-Agent")
postRequestSerializer.setValue("utf-8", forHTTPHeaderField:"charset")
self.postManager.requestSerializer = postRequestSerializer
self.postSynchronousManager = AFHTTPRequestOperationManager()
postRequestSerializer = AFHTTPRequestSerializer()
postRequestSerializer.setValue(ua, forHTTPHeaderField:"User-Agent")
postRequestSerializer.setValue("utf-8", forHTTPHeaderField:"charset")
self.postSynchronousManager.requestSerializer = postRequestSerializer
self.postSynchronousManager.completionQueue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default)
if certificateData != nil {
let securityPolicy = AFSecurityPolicy(pinningMode: AFSSLPinningMode.certificate)
securityPolicy?.allowInvalidCertificates = true
securityPolicy?.validatesCertificateChain = false
securityPolicy?.validatesDomainName = false
securityPolicy?.pinnedCertificates = [certificateData!]
self.getManager.securityPolicy = securityPolicy
self.getManagerBackground.securityPolicy = securityPolicy
self.getSynchronousManager.securityPolicy = securityPolicy
self.postManager.securityPolicy = securityPolicy
self.postSynchronousManager.securityPolicy = securityPolicy
}
}
class func isReachable(_ url: URL, reachable: @escaping ReachableHandler) -> () {
let manager = AFHTTPRequestOperationManager(baseURL:url)
let operationQueue = manager?.operationQueue
manager?.reachabilityManager.setReachabilityStatusChange({(status: AFNetworkReachabilityStatus) in
switch (status) {
case AFNetworkReachabilityStatus.reachableViaWWAN:
DLog("AFNetworkReachabilityStatusReachableViaWWAN")
operationQueue?.isSuspended = false
reachable(TLDOMAINREACHABLE.wwan)
break
case AFNetworkReachabilityStatus.reachableViaWiFi:
DLog("AFNetworkReachabilityStatusReachableViaWiFi")
operationQueue?.isSuspended = false
reachable(TLDOMAINREACHABLE.wifi)
break
case AFNetworkReachabilityStatus.notReachable:
reachable(TLDOMAINREACHABLE.notreachable)
DLog("AFNetworkReachabilityStatusNotReachable")
default:
operationQueue?.isSuspended = true
break
}
})
manager?.reachabilityManager.startMonitoring()
}
func httpGETSynchronous(_ url: URL, parameters: NSDictionary?) -> AnyObject? {
var response:AnyObject? = nil
let semaphore = DispatchSemaphore(value: 0)
DLog("httpGETSynchronous: url \(url.absoluteString)")
_ = self.getSynchronousManager.get(url.absoluteString,
parameters: parameters,
success:{(operation, responseObject) in
response = responseObject as AnyObject?
semaphore.signal()
},
failure:{(operation, error) in
DLog("httpGETSynchronous: requestFailed url \(url.absoluteString)")
if operation?.response != nil {
response = [STATIC_MEMBERS.HTTP_ERROR_CODE: operation?.response.statusCode, STATIC_MEMBERS.HTTP_ERROR_MSG:operation?.responseString] as AnyObject
} else {
response = [STATIC_MEMBERS.HTTP_ERROR_CODE: "499", STATIC_MEMBERS.HTTP_ERROR_MSG:"No Response"] as AnyObject
}
semaphore.signal()
})
semaphore.wait(timeout: DispatchTime.distantFuture)
return response
}
func httpGET(_ url: URL, parameters: NSDictionary?,
success: SuccessHandler?, failure: FailureHandler?) -> () {
DLog("httpGET: url \(url.absoluteString)")
self.getManager.get(url.absoluteString,
parameters:parameters,
success:{(operation, responseObject) in
if success != nil {
success!(responseObject as AnyObject!)
}
} ,
failure:{(operation, error) in
DLog("httpGET: requestFailed url \(url.absoluteString)")
if (failure != nil) {
failure!(operation?.response == nil ? 0 : (operation?.response.statusCode)!, operation?.response == nil ? "" : operation?.responseString)
}
})
}
func httpGETBackground(_ url: URL, parameters: NSDictionary?,
success: SuccessHandler?, failure: FailureHandler?) -> () {
DLog("httpGETBackground: url \(url.absoluteString)")
self.getManagerBackground.get(url.absoluteString,
parameters:parameters,
success:{(operation, responseObject) in
if success != nil {
success!(responseObject as AnyObject!)
}
} ,
failure:{(operation, error) in
DLog("httpGETBackground: requestFailed url \(url.absoluteString)")
if (failure != nil) {
failure!(operation?.response == nil ? 0 : (operation?.response.statusCode)!, operation?.response == nil ? "" : operation?.responseString)
}
})
}
func httpPOST(_ url: URL, parameters: NSDictionary?,
success: SuccessHandler?, failure: FailureHandler?) -> () {
DLog("httpPOST:function: url \(url.absoluteString)")
self.postManager.post(url.absoluteString,
parameters:parameters,
success:{(operation, responseObject) in
if success != nil {
success!(responseObject as AnyObject!)
}
},
failure:{(operation, error) in
DLog("httpPOST: requestFailed url \(url.absoluteString)")
if (failure != nil) {
failure!(operation?.response == nil ? 0 : (operation?.response.statusCode)!, operation?.response == nil ? "" : operation?.responseString)
}
})
}
func httpPOSTSynchronous(_ url: URL, parameters: NSDictionary?) -> AnyObject? {
var response:AnyObject?
let semaphore = DispatchSemaphore(value: 0)
DLog("httpPOSTSynchronous: url \(url.absoluteString)")
_ = self.postSynchronousManager.post(url.absoluteString,
parameters: parameters,
success:{(operation, responseObject) in
response = responseObject as AnyObject?
semaphore.signal()
},
failure:{(operation, error) in
DLog("httpPOSTSynchronous: requestFailed url \(url.absoluteString)")
if operation?.response != nil {
response = [STATIC_MEMBERS.HTTP_ERROR_CODE: operation?.response.statusCode, STATIC_MEMBERS.HTTP_ERROR_MSG:operation?.responseString] as AnyObject
} else {
response = [STATIC_MEMBERS.HTTP_ERROR_CODE: "499", STATIC_MEMBERS.HTTP_ERROR_MSG:"No Response"] as AnyObject
}
semaphore.signal()
})
semaphore.wait(timeout: DispatchTime.distantFuture)
return response
}
}
================================================
FILE: ArcBit/APIs/TLPushTxAPI.swift
================================================
//
// TLPushTxAPI.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
class TLPushTxAPI {
struct STATIC_MEMBERS {
static var _instance:TLPushTxAPI? = nil
}
class func instance() -> (TLPushTxAPI) {
if(STATIC_MEMBERS._instance == nil) {
STATIC_MEMBERS._instance = TLPushTxAPI()
}
return STATIC_MEMBERS._instance!
}
func sendTx(_ txHex:String, txHash:String, toAddress:String, success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler)-> () {
DLog("TLPushTxAPI pushTx txHex \(txHex)")
DLog("TLPushTxAPI pushTx txHash \(txHash)")
DLog("TLPushTxAPI pushTx toAddress \(toAddress)")
if TLStealthAddress.isStealthAddress(toAddress, isTestnet:false) == false {
DLog("TLPushTxAPI TLBlockExplorerAPI")
TLBlockExplorerAPI.instance().pushTx(txHex, txHash: txHash, success:success, failure:failure)
} else {
var pushTxMethod = TLBlockExplorerAPI.instance().insightAPI!.pushTx
//pushTxMethod = TLBlockrAPI().pushTx
pushTxMethod(txHex, { (jsonData) -> () in
DLog("TLPushTxAPI pushTxMethod \(jsonData)")
func getTxidFromInsightPushTx(_ jsonData:NSDictionary) -> String {
return jsonData.object(forKey: "txid") as! String
}
func getTxidFromBlockrPushTx(_ jsonData:NSDictionary) -> String? {
if jsonData.object(forKey: "status") as! String != "success" {
let code = jsonData.object(forKey: "code") as! Int
let message = jsonData.object(forKey: "message") as! String
failure(code, message)
return nil
}
return jsonData.object(forKey: "data") as? String
}
let txid = getTxidFromInsightPushTx(jsonData as! NSDictionary)
//let txid = getTxidFromBlockrPushTx(jsonData as! NSDictionary)
//if txid == nil { return }
TLStealthExplorerAPI.instance().lookupTx(toAddress, txid: txid, success: { (jsonData) -> () in
DLog("TLPushTxAPI TLStealthExplorerAPI success \(jsonData.description)")
if let errorCode = (jsonData as! NSDictionary).object(forKey: TLStealthExplorerAPI.STATIC_MEMBERS.SERVER_ERROR_CODE) as? Int {
let errorMsg = (jsonData as! NSDictionary).object(forKey: TLStealthExplorerAPI.STATIC_MEMBERS.SERVER_ERROR_MSG) as! String
DLog(String(format: "TLPushTxAPI TLStealthExplorerAPI success failure \(errorCode) \(errorMsg)"))
if errorCode == TLStealthExplorerAPI.STATIC_MEMBERS.SEND_TX_ERROR {
DLog("TLPushTxAPI TLStealthExplorerAPI SEND_TX_ERROR \(errorMsg)")
}
failure(errorCode, errorMsg)
} else {
DLog("TLPushTxAPI TLStealthExplorerAPI success success")
success(["txid":txid] as AnyObject)
}
}) { (code, status) -> () in
DLog("TLPushTxAPI TLStealthExplorerAPI failure")
DLog("TLPushTxAPI TLStealthExplorerAPI failure code: \(code)")
DLog("TLPushTxAPI TLStealthExplorerAPI failure status: \(status)")
if status != nil {
failure(code, "No status")
} else {
failure(code, status)
}
}
}) { (code, status) -> () in
failure(code, status)
}
}
}
}
================================================
FILE: ArcBit/APIs/TLStealthServerAPI.swift
================================================
//
// TLStealthServerAPI.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
class TLStealthExplorerAPI {
struct STATIC_MEMBERS {
static let STEALTH_PAYMENTS_FETCH_COUNT = 50
static let UNEXPECTED_ERROR = -1000
static let DATABASE_ERROR = -1001
static let INVALID_STEALTH_ADDRESS_ERROR = -1002
static let INVALID_SIGNATURE_ERROR = -1003
static let INVALID_SCAN_KEY_ERROR = -1004
static let TX_DECODE_FAILED_ERROR = -1005
static let INVALID_PARAMETER_ERROR = -1006
static let SEND_TX_ERROR = -1007
static let SERVER_ERROR_CODE = "error_code"
static let SERVER_ERROR_MSG = "error_msg"
static var instance:TLStealthExplorerAPI? = nil
}
var networking:TLNetworking
var baseURL:String
class func instance() -> (TLStealthExplorerAPI) {
if(STATIC_MEMBERS.instance == nil) {
TLPreferences.resetStealthExplorerAPIURL()
TLPreferences.resetStealthServerPort()
let baseURL = TLStealthServerConfig.instance().getWebServerProtocol()+"://"+TLPreferences.getStealthExplorerURL()!+":"+String(TLPreferences.getStealthServerPort()!)
STATIC_MEMBERS.instance = TLStealthExplorerAPI(baseURL: baseURL)
}
return STATIC_MEMBERS.instance!
}
init(baseURL: String) {
//let certificateData = TLStealthServerConfig.instance().getSSLCertificate()
//self.networking = TLNetworking(certificateData: certificateData)
self.networking = TLNetworking()
self.baseURL = baseURL
}
func ping(_ success: @escaping TLNetworking.SuccessHandler, failure: @escaping TLNetworking.FailureHandler) -> () {
let endPoint = "ping"
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
self.networking.httpGET(url!, parameters:nil,
success:success, failure:failure)
}
func getChallenge() -> NSDictionary {
let endPoint = "challenge"
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
let jsonDict = self.networking.httpGETSynchronous(url!, parameters: nil) as! NSDictionary
return jsonDict
}
func getStealthPaymentsSynchronous(_ stealthAddress:String, signature:String, offset:Int) -> NSDictionary {
let endPoint = "payments"
let parameters = [
"addr": stealthAddress,
"sig":signature,
"offset":offset
] as [String : Any]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
let jsonDict = self.networking.httpGETSynchronous(url!, parameters: parameters as NSDictionary?) as! NSDictionary
return jsonDict
}
func watchStealthAddressSynchronous(_ stealthAddress:String, scanPriv:String, signature:String) -> NSDictionary {
let endPoint = "watch"
let parameters = [
"addr": stealthAddress,
"scan_key":scanPriv,
"sig":signature
]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
let jsonDict = self.networking.httpGETSynchronous(url!, parameters: parameters as NSDictionary?) as! NSDictionary
return jsonDict
}
func lookupTx(_ stealthAddress:String, txid:String, success: @escaping TLNetworking.SuccessHandler, failure: @escaping TLNetworking.FailureHandler) -> () {
let endPoint = "lookuptx"
let parameters = [
"addr": stealthAddress,
"txid":txid,
]
let url = URL(string:endPoint, relativeTo:URL(string:self.baseURL))
self.networking.httpGET(url!, parameters:parameters as NSDictionary!, success:success, failure:failure)
}
}
================================================
FILE: ArcBit/APIs/TLStealthServerConfig.swift
================================================
//
// TLStealthServerConfig.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
class TLStealthServerConfig {
struct STATIC_MEMBERS {
static var instance:TLStealthServerConfig?
}
fileprivate var stealthServerUrl = "www.arcbit.net"
fileprivate var stealthServerPort = 443
fileprivate var webSocketServerPort = 443
fileprivate var webServerProtocol = "https"
fileprivate var webSocketProtocol = "wss"
fileprivate var webSocketEndpoint = "/inv"
class func instance() -> (TLStealthServerConfig) {
if(STATIC_MEMBERS.instance == nil) {
STATIC_MEMBERS.instance = TLStealthServerConfig()
}
return STATIC_MEMBERS.instance!
}
func getSSLCertificate() -> Data {
let certificatePath = Bundle.main.path(forResource: "live", ofType: "cer")!
let certificateData = try! Data(contentsOf: URL(fileURLWithPath: certificatePath))
return certificateData
}
func getWebServerProtocol() -> String {
return self.webServerProtocol
}
func getWebSocketProtocol() -> String {
return self.webSocketProtocol
}
func getWebSocketEndpoint() -> String {
return self.webSocketEndpoint
}
func getStealthServerUrl() -> String {
return self.stealthServerUrl
}
func getStealthServerPort() -> Int {
return self.stealthServerPort
}
func getWebSocketServerPort() -> Int {
return self.webSocketServerPort
}
}
================================================
FILE: ArcBit/APIs/TLStealthWebSocket.swift
================================================
//
// TLStealthWebSocket.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
@objc class TLStealthWebSocket: NSObject, SRWebSocketDelegate {
fileprivate var webSocket: SRWebSocket?
fileprivate var consecutiveFailedConnections = 0
var challenge = "0"
fileprivate let MAX_CONSECUTIVE_FAILED_CONNECTIONS = 5
struct STATIC_MEMBERS {
static var instance: TLStealthWebSocket?
}
class func instance() -> (TLStealthWebSocket) {
if (STATIC_MEMBERS.instance == nil) {
STATIC_MEMBERS.instance = TLStealthWebSocket()
TLPreferences.resetStealthExplorerAPIURL()
TLPreferences.resetStealthWebSocketPort()
}
return STATIC_MEMBERS.instance!
}
func reconnect() -> () {
if (self.webSocket != nil) {
self.webSocket!.delegate = nil
self.webSocket!.close()
}
let urlString = String(format: "%@://%@:%d%@", TLStealthServerConfig.instance().getWebSocketProtocol(), TLPreferences.getStealthExplorerURL()!, TLPreferences.getStealthWebSocketPort()!, TLStealthServerConfig.instance().getWebSocketEndpoint())
DLog("StealthWebSocket reconnect url: \(urlString)")
//let certificateData = TLStealthServerConfig.instance().getSSLCertificate()
//let urlRequest = SRWebSocket.createURLRequest(urlString, withPinnedCert: certificateData)
//self.webSocket = SRWebSocket(URLRequest: urlRequest)
self.webSocket = SRWebSocket(urlRequest: URLRequest(url: URL(string: urlString)!))
self.webSocket!.delegate = self
self.webSocket!.open()
}
func isWebSocketOpen() -> Bool {
return self.webSocket != nil && self.webSocket!.readyState.rawValue == SR_OPEN.rawValue
}
func close() -> () {
self.webSocket!.close()
}
func sendMessagePing() -> Bool {
let msg = TLUtils.dictionaryToJSONString(false, dict: ["op":"ping"])
return self.sendMessage(msg)
}
func sendMessageGetChallenge() -> Bool {
let msg = TLUtils.dictionaryToJSONString(false, dict: ["op":"challenge"])
return self.sendMessage(msg)
}
@discardableResult func sendMessageSubscribeToStealthAddress(_ stealthAddress: String, signature: String) -> Bool {
let msgDict = ["op":"addr_sub", "x":["addr":stealthAddress,"sig":signature]] as [String : Any]
let msg = TLUtils.dictionaryToJSONString(false, dict: msgDict as NSDictionary)
return self.sendMessage(msg)
}
func sendMessage(_ msg: String) -> Bool {
DLog("StealthWebSocket sendMessage: \(msg)")
if self.isWebSocketOpen() {
self.webSocket!.send(msg)
return true
} else {
DLog("StealthWebSocket Error: not connect to websocket server")
return false
}
}
func periodicPing() {
let PERIODIC_PING_INTERVAL = 55.0
DispatchQueue.main.async {
NSObject.cancelPreviousPerformRequests(withTarget: self, selector:#selector(TLStealthWebSocket.sendMessagePing), object:nil)
Timer.scheduledTimer(timeInterval: PERIODIC_PING_INTERVAL, target: self,
selector: #selector(TLStealthWebSocket.sendMessagePing), userInfo: nil, repeats: true)
}
}
func webSocketDidOpen(_ webSocket: SRWebSocket) -> () {
DLog("StealthWebSocket webSocketDidOpen")
self.sendMessageGetChallenge()
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_STEALTH_PAYMENT_LISTENER_OPEN()), object: nil, userInfo: nil)
self.periodicPing()
}
func webSocket(_ webSocket:SRWebSocket, didFailWithError error:NSError) -> () {
DLog("StealthWebSocket didFailWithError \(error.description)")
self.webSocket!.delegate = nil
self.webSocket!.close()
self.webSocket = nil
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_STEALTH_PAYMENT_LISTENER_CLOSE()), object: nil)
if consecutiveFailedConnections < MAX_CONSECUTIVE_FAILED_CONNECTIONS {
self.reconnect()
} else {
DispatchQueue.main.async {
NSObject.cancelPreviousPerformRequests(withTarget: self, selector:#selector(TLStealthWebSocket.sendMessagePing), object:nil)
}
}
consecutiveFailedConnections += 1
}
public func webSocket(_ webSocket: SRWebSocket!, didReceiveMessage message: Any!) {
DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.high).async {
self.consecutiveFailedConnections = 0
let data = (message as AnyObject).data(using: String.Encoding.utf8.rawValue)
let jsonDict = (try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions(rawValue: 0))) as! NSDictionary
DLog("StealthWebSocket didReceiveMessage \(jsonDict.description)")
if (jsonDict.object(forKey: "op") as! String == "challenge") {
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_RECEIVED_STEALTH_CHALLENGE()), object: jsonDict.object(forKey: "x"), userInfo: nil)
} else if (jsonDict.object(forKey: "op") as! String == "addr_sub") {
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_RECEIVED_STEALTH_ADDRESS_SUBSCRIPTION()), object: jsonDict.object(forKey: "x"), userInfo: nil)
} else if (jsonDict.object(forKey: "op") as! String == "tx") {
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_RECEIVED_STEALTH_PAYMENT()), object: jsonDict.object(forKey: "x"), userInfo: nil)
}
}
}
func webSocket(_ webSocket: SRWebSocket, didCloseWithCode code: Int, reason: String, wasClean: Bool) -> () {
if wasClean {
DLog("StealthWebSocket didCloseWithCode With No Error \(code) \(reason)")
} else {
DLog("StealthWebSocket didCloseWithCode With Error \(code) \(reason)")
}
self.webSocket!.delegate = nil
self.webSocket!.close()
self.webSocket = nil
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_STEALTH_PAYMENT_LISTENER_CLOSE()), object: nil)
if consecutiveFailedConnections < MAX_CONSECUTIVE_FAILED_CONNECTIONS {
self.reconnect()
} else {
DispatchQueue.main.async {
NSObject.cancelPreviousPerformRequests(withTarget: self, selector:#selector(TLStealthWebSocket.sendMessagePing), object:nil)
}
}
consecutiveFailedConnections += 1
}
}
================================================
FILE: ArcBit/APIs/TLTxFeeAPI.swift
================================================
//
// TLTxFeeAPI.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
enum TLDynamicFeeSetting:String {
case FastestFee = "0"
case HalfHourFee = "1"
case HourFee = "2"
static func getAPIValue(_ dynamicFeeSetting: TLDynamicFeeSetting) -> String {
if dynamicFeeSetting == FastestFee {
return "fastestFee"
} else if dynamicFeeSetting == HalfHourFee {
return "halfHourFee"
} else if dynamicFeeSetting == HourFee {
return "hourFee"
}
return ""
}
}
class TLTxFeeAPI {
var networking:TLNetworking
fileprivate var cachedDynamicFees: NSDictionary?
var cachedDynamicFeesTime: TimeInterval?
init() {
self.networking = TLNetworking()
}
func getCachedDynamicFee() -> NSNumber? {
var dynamicFee:NSNumber? = nil
if self.cachedDynamicFees != nil {
let dynamicFeeSetting = TLPreferences.getInAppSettingsKitDynamicFeeSetting()
if dynamicFeeSetting == TLDynamicFeeSetting.FastestFee {
dynamicFee = self.cachedDynamicFees!.object(forKey: TLDynamicFeeSetting.getAPIValue(TLDynamicFeeSetting.FastestFee)) as? NSNumber
} else if dynamicFeeSetting == TLDynamicFeeSetting.HalfHourFee {
dynamicFee = self.cachedDynamicFees!.object(forKey: TLDynamicFeeSetting.getAPIValue(TLDynamicFeeSetting.HalfHourFee)) as? NSNumber
} else if dynamicFeeSetting == TLDynamicFeeSetting.HourFee {
dynamicFee = self.cachedDynamicFees!.object(forKey: TLDynamicFeeSetting.getAPIValue(TLDynamicFeeSetting.HourFee)) as? NSNumber
}
}
return dynamicFee
}
func haveUpdatedCachedDynamicFees() -> Bool {
let nowUnixTime = Date().timeIntervalSince1970
let tenMinutesInSeconds = 600.0
if self.cachedDynamicFeesTime == nil || nowUnixTime - self.cachedDynamicFeesTime! > tenMinutesInSeconds {
return false
}
return true
}
func getDynamicTxFee(_ success:@escaping TLNetworking.SuccessHandler, failure:@escaping TLNetworking.FailureHandler)-> () {
self.networking.httpGET(URL(string: "https://bitcoinfees.21.co/api/v1/fees/recommended")!,
parameters:[:], success:{
(_jsonData) in
if let jsonData = _jsonData as? NSDictionary {
self.cachedDynamicFeesTime = Date().timeIntervalSince1970
self.cachedDynamicFees = jsonData
DLog("TLTxFeeAPI getDynamicTxFee success \(jsonData.description)")
} else {
self.cachedDynamicFees = nil
}
success(_jsonData)
}, failure: {
(code, status) in
self.cachedDynamicFees = nil
DLog("TLTxFeeAPI getDynamicTxFee failure")
failure(code, status)
})
}
}
================================================
FILE: ArcBit/AppDelegate.swift
================================================
//
// AppDelegate.swift
// ArcBit
//
// Created by Timothy Lee on 3/14/15.
// Copyright (c) 2015 Timothy Lee <stequald01@gmail.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
import Foundation
import UIKit
import AVFoundation
import Fabric
import Crashlytics
@UIApplicationMain
@objc(AppDelegate) class AppDelegate: UIResponder, UIApplicationDelegate, LTHPasscodeViewControllerDelegate {
let MAX_CONSECUTIVE_FAILED_STEALTH_CHALLENGE_COUNT = 8
let SAVE_WALLET_PAYLOAD_DELAY = 2.0
let DEFAULT_BLOCKEXPLORER_API = TLBlockExplorer.blockchain
let RESPOND_TO_STEALTH_PAYMENT_GET_TX_TRIES_MAX_TRIES = 3
var window:UIWindow?
fileprivate var storyboard:UIStoryboard?
fileprivate var modalDelegate:AnyObject?
var appWallet = TLWallet(walletName: "App Wallet", walletConfig: TLWalletConfig(isTestnet: false))
var accounts:TLAccounts?
var coldWalletAccounts:TLAccounts?
var importedAccounts:TLAccounts?
var importedWatchAccounts:TLAccounts?
var importedAddresses:TLImportedAddresses?
var importedWatchAddresses:TLImportedAddresses?
var godSend:TLSpaghettiGodSend?
var receiveSelectedObject:TLSelectedObject?
var historySelectedObject:TLSelectedObject?
var bitcoinURIOptionsDict:NSDictionary?
var justSetupHDWallet = false
var giveExitAppNoticeForBlockExplorerAPIToTakeEffect = false
fileprivate var isAccountsAndImportsLoaded = false
var saveWalletJSONEnabled = true
var consecutiveFailedStealthChallengeCount = 0
fileprivate var savedPasscodeViewDefaultBackgroundColor: UIColor?
fileprivate var savedPasscodeViewDefaultLabelTextColor: UIColor?
fileprivate var savedPasscodeViewDefaultPasscodeTextColor: UIColor?
fileprivate var hasFinishLaunching = false
fileprivate var respondToStealthPaymentGetTxTries = 0
var scannedEncryptedPrivateKey:String? = nil
var scannedAddressBookAddress:String? = nil
let pendingOperations = PendingOperations()
lazy var webSocketNotifiedTxHashSet:NSMutableSet = NSMutableSet()
var pendingSelfStealthPaymentTxid: String? = nil
lazy var txFeeAPI = TLTxFeeAPI();
class func instance() -> AppDelegate {
return UIApplication.shared.delegate as! (AppDelegate)
}
func aAccountNeedsRecovering() -> Bool {
guard let accounts = AppDelegate.instance().accounts else { return false }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
if (accountObject.needsRecovering()) {
return true
}
}
guard let coldWalletAccounts = AppDelegate.instance().coldWalletAccounts else { return false }
for i in stride(from: 0, to: coldWalletAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = coldWalletAccounts.getAccountObjectForIdx(i)
if (accountObject.needsRecovering()) {
return true
}
}
guard let importedAccounts = AppDelegate.instance().importedAccounts else { return false }
for i in stride(from: 0, to: importedAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedAccounts.getAccountObjectForIdx(i)
if (accountObject.needsRecovering()) {
return true
}
}
guard let importedWatchAccounts = AppDelegate.instance().importedWatchAccounts else { return false }
for i in stride(from: 0, to: importedWatchAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedWatchAccounts.getAccountObjectForIdx(i)
if (accountObject.needsRecovering()) {
return true
}
}
return false
}
func checkToRecoverAccounts() {
guard let accounts = AppDelegate.instance().accounts else { return }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
if (accountObject.needsRecovering()) {
accountObject.clearAllAddresses()
accountObject.recoverAccount(false, recoverStealthPayments: true)
}
}
guard let coldWalletsAccounts = AppDelegate.instance().coldWalletAccounts else { return }
for i in stride(from: 0, to: coldWalletsAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = coldWalletAccounts?.getAccountObjectForIdx(i)
if let accountObject = accountObject, accountObject.needsRecovering() {
accountObject.clearAllAddresses()
accountObject.recoverAccount(false, recoverStealthPayments: true)
}
}
guard let importedAccounts = AppDelegate.instance().importedAccounts else { return }
for i in stride(from: 0, to: importedAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedAccounts.getAccountObjectForIdx(i)
if (accountObject.needsRecovering()) {
accountObject.clearAllAddresses()
accountObject.recoverAccount(false, recoverStealthPayments: true)
}
}
guard let importedWatchAccounts = AppDelegate.instance().importedWatchAccounts else { return }
for i in stride(from: 0, to: importedWatchAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedWatchAccounts.getAccountObjectForIdx(i)
if (accountObject.needsRecovering()) {
accountObject.clearAllAddresses()
accountObject.recoverAccount(false, recoverStealthPayments: true)
}
}
}
func updateGodSend() {
var sendFromType = TLPreferences.getSendFromType()
var sendFromIndex = Int(TLPreferences.getSendFromIndex())
if (sendFromType == .hdWallet) {
if let accounts = accounts, sendFromIndex > accounts.getNumberOfAccounts() - 1 {
sendFromType = TLSendFromType.hdWallet
sendFromIndex = 0
}
} else if (sendFromType == .coldWalletAccount) {
if let coldWalletAccounts = coldWalletAccounts, sendFromIndex > coldWalletAccounts.getNumberOfAccounts() - 1 {
sendFromType = TLSendFromType.hdWallet
sendFromIndex = 0
}
} else if (sendFromType == .importedAccount) {
if let importedAccounts = importedAccounts, sendFromIndex > importedAccounts.getNumberOfAccounts() - 1 {
sendFromType = TLSendFromType.hdWallet
sendFromIndex = 0
}
} else if (sendFromType == .importedWatchAccount) {
if let importedWatchAccounts = importedWatchAccounts, sendFromIndex > importedWatchAccounts.getNumberOfAccounts() - 1 {
sendFromType = TLSendFromType.hdWallet
sendFromIndex = 0
}
} else if (sendFromType == .importedAddress) {
if let importedAddresses = importedAddresses, sendFromIndex > importedAddresses.getCount() - 1 {
sendFromType = TLSendFromType.hdWallet
sendFromIndex = 0
}
} else if (sendFromType == .importedWatchAddress) {
if let importedWatchAddresses = importedWatchAddresses, sendFromIndex > importedWatchAddresses.getCount() - 1 {
sendFromType = TLSendFromType.hdWallet
sendFromIndex = 0
}
}
updateGodSend(sendFromType, sendFromIndex:sendFromIndex)
}
func updateGodSend(_ sendFromType: TLSendFromType, sendFromIndex: Int) {
TLPreferences.setSendFromType(sendFromType)
TLPreferences.setSendFromIndex(UInt(sendFromIndex))
if let accounts = accounts, sendFromType == .hdWallet {
let accountObject = accounts.getAccountObjectForIdx(sendFromIndex)
godSend?.setOnlyFromAccount(accountObject)
} else if let coldWalletAccounts = coldWalletAccounts, sendFromType == .coldWalletAccount {
let accountObject = coldWalletAccounts.getAccountObjectForIdx(sendFromIndex)
godSend?.setOnlyFromAccount(accountObject)
} else if let importedAccounts = importedAccounts, sendFromType == .importedAccount {
let accountObject = importedAccounts.getAccountObjectForIdx(sendFromIndex)
godSend?.setOnlyFromAccount(accountObject)
} else if let importedWatchAccounts = importedWatchAccounts, sendFromType == .importedWatchAccount {
let accountObject = importedWatchAccounts.getAccountObjectForIdx(sendFromIndex)
godSend?.setOnlyFromAccount(accountObject)
} else if let importedAddresses = importedAddresses, sendFromType == .importedAddress {
let importedAddress = importedAddresses.getAddressObjectAtIdx(sendFromIndex)
godSend?.setOnlyFromAddress(importedAddress)
} else if let importedWatchAddresses = importedWatchAddresses, sendFromType == .importedWatchAddress {
let importedAddress = importedWatchAddresses.getAddressObjectAtIdx(sendFromIndex)
godSend?.setOnlyFromAddress(importedAddress)
}
}
func updateReceiveSelectedObject(_ sendFromType: TLSendFromType, sendFromIndex: Int) {
switch sendFromType {
case .hdWallet:
guard let accounts = accounts, let receiveSelectedObject = receiveSelectedObject else { return }
let accountObject = accounts.getAccountObjectForIdx(sendFromIndex)
receiveSelectedObject.setSelectedAccount(accountObject)
case .coldWalletAccount:
guard let coldWalletAccounts = coldWalletAccounts, let receiveSelectedObject = receiveSelectedObject else { return }
let accountObject = coldWalletAccounts.getAccountObjectForIdx(sendFromIndex)
receiveSelectedObject.setSelectedAccount(accountObject)
case .importedAccount:
guard let importedAccounts = importedAccounts, let receiveSelectedObject = receiveSelectedObject else { return }
let accountObject = importedAccounts.getAccountObjectForIdx(sendFromIndex)
receiveSelectedObject.setSelectedAccount(accountObject)
case .importedWatchAccount:
guard let importedWatchAccounts = importedWatchAccounts, let receiveSelectedObject = receiveSelectedObject else { return }
let accountObject = importedWatchAccounts.getAccountObjectForIdx(sendFromIndex)
receiveSelectedObject.setSelectedAccount(accountObject)
case .importedAddress:
guard let importedAddresses = importedAddresses,
let receiveSelectedObject = receiveSelectedObject else { return }
let importedAddress = importedAddresses.getAddressObjectAtIdx(sendFromIndex)
receiveSelectedObject.setSelectedAddress(importedAddress)
case .importedWatchAddress:
guard let importedWatchAddresses = importedWatchAddresses,
let receiveSelectedObject = receiveSelectedObject else { return }
let importedAddress = importedWatchAddresses.getAddressObjectAtIdx(sendFromIndex)
receiveSelectedObject.setSelectedAddress(importedAddress)
}
}
func updateHistorySelectedObject(_ sendFromType: TLSendFromType, sendFromIndex: Int) {
if let accounts = accounts, let historySelectedObject = historySelectedObject, sendFromType == .hdWallet {
let accountObject = accounts.getAccountObjectForIdx(sendFromIndex)
historySelectedObject.setSelectedAccount(accountObject)
} else if let coldWalletAccounts = coldWalletAccounts, let historySelectedObject = historySelectedObject, sendFromType == .coldWalletAccount {
let accountObject = coldWalletAccounts.getAccountObjectForIdx(sendFromIndex)
historySelectedObject.setSelectedAccount(accountObject)
} else if let importedAccounts = importedAccounts, let historySelectedObject = historySelectedObject, sendFromType == .importedAccount {
let accountObject = importedAccounts.getAccountObjectForIdx(sendFromIndex)
historySelectedObject.setSelectedAccount(accountObject)
} else if let importedWatchAccounts = importedWatchAccounts, let historySelectedObject = historySelectedObject, sendFromType == .importedWatchAccount {
let accountObject = importedWatchAccounts.getAccountObjectForIdx(sendFromIndex)
historySelectedObject.setSelectedAccount(accountObject)
} else if let importedAddresses = importedAddresses, let historySelectedObject = historySelectedObject, sendFromType == .importedAddress {
let importedAddress = importedAddresses.getAddressObjectAtIdx(sendFromIndex)
historySelectedObject.setSelectedAddress(importedAddress)
} else if let importedWatchAddresses = importedWatchAddresses, let historySelectedObject = historySelectedObject, sendFromType == .importedWatchAddress {
let importedAddress = importedWatchAddresses.getAddressObjectAtIdx(sendFromIndex)
historySelectedObject.setSelectedAddress(importedAddress)
}
}
func showLockViewForEnteringPasscode(_ notification: Notification) {
if !hasFinishLaunching && LTHPasscodeViewController.doesPasscodeExist() {
//LTHPasscodeViewController.sharedUser().maxNumberOfAllowedFailedAttempts = 0
UIApplication.shared.isStatusBarHidden = true
LTHPasscodeViewController.sharedUser().delegate = self
LTHPasscodeViewController.sharedUser().showLockScreen(withAnimation: false,
withLogout:false ,
andLogoutTitle:nil)
}
hasFinishLaunching = true
}
func recoverHDWallet(_ mnemonic: String, shouldRefreshApp: Bool = true) {
if shouldRefreshApp {
refreshApp(mnemonic)
} else {
let masterHex = TLHDWalletWrapper.getMasterHex(mnemonic)
appWallet.createInitialWalletPayload(mnemonic, masterHex:masterHex)
accounts = TLAccounts(appWallet: appWallet, accountsArray:appWallet.getAccountObjectArray(), accountType:.hdWallet)
coldWalletAccounts = TLAccounts(appWallet: appWallet, accountsArray:appWallet.getColdWalletAccountArray(), accountType:.coldWallet)
importedAccounts = TLAccounts(appWallet: appWallet, accountsArray:appWallet.getImportedAccountArray(), accountType:.imported)
importedWatchAccounts = TLAccounts(appWallet: appWallet, accountsArray: appWallet.getWatchOnlyAccountArray(), accountType:.importedWatch)
importedAddresses = TLImportedAddresses(appWallet: appWallet, importedAddresses: appWallet.getImportedPrivateKeyArray(), accountAddressType:.imported)
importedWatchAddresses = TLImportedAddresses(appWallet: appWallet, importedAddresses: appWallet.getWatchOnlyAddressArray(), accountAddressType:.importedWatch)
}
var accountIdx = 0
var consecutiveUnusedAccountCount = 0
let MAX_CONSECUTIVE_UNUSED_ACCOUNT_LOOK_AHEAD_COUNT = 4
guard let accounts = accounts else { return }
while true {
let accountName = String(format:TLDisplayStrings.ACCOUNT_X_STRING(), (accountIdx + 1))
let accountObject = accounts.createNewAccount(accountName, accountType:.normal, preloadStartingAddresses:false)
guard let stealthWallet = accountObject.stealthWallet else { return }
DLog("recoverHDWalletaccountName \(accountName)")
let sumMainAndChangeAddressMaxIdx = accountObject.recoverAccount(false)
DLog(String(format: "accountName \(accountName) sumMainAndChangeAddressMaxIdx: \(sumMainAndChangeAddressMaxIdx)"))
if sumMainAndChangeAddressMaxIdx > -2 || TLWalletUtils.ENABLE_STEALTH_ADDRESS() && stealthWallet.checkIfHaveStealthPayments() {
consecutiveUnusedAccountCount = 0
} else {
consecutiveUnusedAccountCount += 1
if consecutiveUnusedAccountCount == MAX_CONSECUTIVE_UNUSED_ACCOUNT_LOOK_AHEAD_COUNT {
break
}
}
accountIdx += 1
}
DLog("recoverHDWallet getNumberOfAccounts: \(accounts.getNumberOfAccounts())")
if accounts.getNumberOfAccounts() == 0 {
accounts.createNewAccount(TLDisplayStrings.ACCOUNT_1_STRING(), accountType:.normal)
} else if accounts.getNumberOfAccounts() > 1 {
while accounts.getNumberOfAccounts() > 1 && consecutiveUnusedAccountCount > 0 {
accounts.popTopAccount()
consecutiveUnusedAccountCount -= 1
}
}
}
// work around to show SendView
func checkToShowSendViewWithURL(_ notification: Notification) {
if bitcoinURIOptionsDict != nil {
assert(window?.rootViewController is ECSlidingViewController, "rootViewController != ECSlidingViewController")
let vc = window?.rootViewController as! ECSlidingViewController
vc.topViewController.showSendView()
}
}
func setSettingsPasscodeViewColors() {
LTHPasscodeViewController.sharedUser().view.backgroundColor = savedPasscodeViewDefaultBackgroundColor
LTHPasscodeViewController.sharedUser().failedAttemptLabel.textColor = savedPasscodeViewDefaultLabelTextColor
LTHPasscodeViewController.sharedUser().enterPasscodeLabel.textColor = savedPasscodeViewDefaultLabelTextColor
LTHPasscodeViewController.sharedUser().okButton.setTitleColor(savedPasscodeViewDefaultLabelTextColor, for:UIControlState())
LTHPasscodeViewController.sharedUser().firstDigitTextField.textColor = savedPasscodeViewDefaultPasscodeTextColor
LTHPasscodeViewController.sharedUser().secondDigitTextField.textColor = savedPasscodeViewDefaultPasscodeTextColor
LTHPasscodeViewController.sharedUser().thirdDigitTextField.textColor = savedPasscodeViewDefaultPasscodeTextColor
LTHPasscodeViewController.sharedUser().fourthDigitTextField.textColor = savedPasscodeViewDefaultPasscodeTextColor
}
fileprivate func setupPasscodeViewColors() {
savedPasscodeViewDefaultBackgroundColor = LTHPasscodeViewController.sharedUser().backgroundColor
savedPasscodeViewDefaultLabelTextColor = LTHPasscodeViewController.sharedUser().labelTextColor
savedPasscodeViewDefaultPasscodeTextColor = LTHPasscodeViewController.sharedUser().passcodeTextColor
LTHPasscodeViewController.sharedUser().backgroundColor = TLColors.mainAppColor()
LTHPasscodeViewController.sharedUser().labelTextColor = TLColors.mainAppOppositeColor()
LTHPasscodeViewController.sharedUser().passcodeTextColor = TLColors.mainAppOppositeColor()
LTHPasscodeViewController.sharedUser().navigationBarTintColor = TLColors.mainAppColor()
LTHPasscodeViewController.sharedUser().navigationTintColor = TLColors.mainAppOppositeColor()
LTHPasscodeViewController.sharedUser().navigationTitleColor = TLColors.mainAppOppositeColor()
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
Fabric.with([Crashlytics.self])
AFNetworkActivityIndicatorManager.shared().isEnabled = true
window?.backgroundColor = TLColors.mainAppColor()
application.statusBarStyle = UIStatusBarStyle.lightContent
justSetupHDWallet = false
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String
if TLPreferences.getInstallDate() == nil {
// before version 1.4.0, install date was not getting set properly, this fixes things
if TLPreferences.getAppVersion() == "0" {
TLPreferences.setHasSetupHDWallet(false)
TLPreferences.setInstallDate()
DLog("set InstallDate \(TLPreferences.getInstallDate())")
TLPreferences.setAppVersion(appVersion)
} else {
TLPreferences.setInstallDate()
DLog("set fake InstallDate \(TLPreferences.getInstallDate())")
if appVersion != TLPreferences.getAppVersion() {
TLUpdateAppData.instance().beforeUpdatedAppVersion = TLPreferences.getAppVersion()
DLog("set new appVersion \(appVersion)")
TLPreferences.setAppVersion(appVersion)
TLPreferences.setDisabledPromptRateApp(false)
}
}
} else if appVersion != TLPreferences.getAppVersion() {
TLUpdateAppData.instance().beforeUpdatedAppVersion = TLPreferences.getAppVersion()
DLog("set new appVersion \(appVersion)")
TLPreferences.setAppVersion(appVersion)
TLPreferences.setDisabledPromptRateApp(false)
}
self.setupPasscodeViewColors()
self.isAccountsAndImportsLoaded = false
if (TLPreferences.hasSetupHDWallet() && UIApplication.instancesRespond(to: "registerUserNotificationSettings"))
{
application.registerUserNotificationSettings(UIUserNotificationSettings(types: [.alert, .badge, .sound], categories:nil))
}
NotificationCenter.default.addObserver(self, selector:#selector(AppDelegate.checkToShowSendViewWithURL(_:)), name:NSNotification.Name.UIApplicationDidBecomeActive, object:nil)
// condition is used so that I dont prompt user to setup notifactions when just installed app
if (TLPreferences.hasSetupHDWallet()) {
//setUpLocalNotification()
}
hasFinishLaunching = false
NotificationCenter.default.addObserver(self, selector:#selector(AppDelegate.showLockViewForEnteringPasscode(_:)), name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_SEND_SCREEN_LOADING()), object:nil)
return true
}
func refreshApp(_ passphrase: String, clearWalletInMemory: Bool = true) {
if (TLPreferences.getCloudBackupWalletFileName() == nil) {
TLPreferences.setCloudBackupWalletFileName()
}
TLPreferences.deleteWalletPassphrase()
TLPreferences.deleteEncryptedWalletJSONPassphrase()
TLPreferences.setWalletPassphrase(passphrase, useKeychain: true)
TLPreferences.setEncryptedWalletJSONPassphrase(passphrase, useKeychain: true)
TLPreferences.clearEncryptedWalletPassphraseKey()
TLPreferences.setCanRestoreDeletedApp(true)
TLPreferences.setInAppSettingsCanRestoreDeletedApp(true)
TLPreferences.setEnableBackupWithiCloud(false)
TLPreferences.setInAppSettingsKitEnableBackupWithiCloud(false)
TLPreferences.setInAppSettingsKitEnabledDynamicFee(true)
TLPreferences.setInAppSettingsKitDynamicFeeSettingIdx(TLDynamicFeeSetting.FastestFee);
TLPreferences.setInAppSettingsKitTransactionFee(TLWalletUtils.DEFAULT_FEE_AMOUNT_IN_BITCOINS())
TLPreferences.setEnablePINCode(false)
TLSuggestions.instance().enabledAllSuggestions()
TLPreferences.resetBlockExplorerAPIURL()
TLPreferences.setBlockExplorerAPI(String(format:"%ld", DEFAULT_BLOCKEXPLORER_API.rawValue))
TLPreferences.setInAppSettingsKitBlockExplorerAPI(String(format:"%ld", DEFAULT_BLOCKEXPLORER_API.rawValue))
TLPreferences.resetStealthExplorerAPIURL()
TLPreferences.resetStealthServerPort()
TLPreferences.resetStealthWebSocketPort()
LTHPasscodeViewController.deletePasscode()
let DEFAULT_CURRENCY_IDX = "20"
TLPreferences.setCurrency(DEFAULT_CURRENCY_IDX)
TLPreferences.setInAppSettingsKitCurrency(DEFAULT_CURRENCY_IDX)
TLPreferences.setSendFromType(.hdWallet)
TLPreferences.setSendFromIndex(0)
if clearWalletInMemory {
let masterHex = TLHDWalletWrapper.getMasterHex(passphrase)
self.appWallet.createInitialWalletPayload(passphrase, masterHex:masterHex)
self.accounts = TLAccounts(appWallet: self.appWallet, accountsArray:self.appWallet.getAccountObjectArray(), accountType:.hdWallet)
self.coldWalletAccounts = TLAccounts(appWallet: self.appWallet, accountsArray:self.appWallet.getColdWalletAccountArray(), accountType:.coldWallet)
self.importedAccounts = TLAccounts(appWallet:self.appWallet, accountsArray:self.appWallet.getImportedAccountArray(), accountType:.imported)
self.importedWatchAccounts = TLAccounts(appWallet: self.appWallet, accountsArray:self.appWallet.getWatchOnlyAccountArray(), accountType:.importedWatch)
self.importedAddresses = TLImportedAddresses(appWallet: self.appWallet, importedAddresses:self.appWallet.getImportedPrivateKeyArray(), accountAddressType:.imported)
self.importedWatchAddresses = TLImportedAddresses(appWallet: self.appWallet, importedAddresses:self.appWallet.getWatchOnlyAddressArray(), accountAddressType:.importedWatch)
}
self.receiveSelectedObject = TLSelectedObject()
self.historySelectedObject = TLSelectedObject()
//self.appWallet.addAddressBookEntry("vJmwhHhMNevDQh188gSeHd2xxxYGBQmnVuMY2yG2MmVTC31UWN5s3vaM3xsM2Q1bUremdK1W7eNVgPg1BnvbTyQuDtMKAYJanahvse", label: "ArcBit Donation")
}
func setAccountsListeningToStealthPaymentsToFalse() {
guard let accounts = accounts else { return }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
if accountObject.stealthWallet != nil {
accountObject.stealthWallet?.isListeningToStealthPayment = false
}
}
guard let importedAccounts = importedAccounts else { return }
for i in stride(from: 0, to: importedAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedAccounts.getAccountObjectForIdx(i)
if let stealthWallet = accountObject.stealthWallet {
stealthWallet.isListeningToStealthPayment = false
}
}
}
func respondToStealthChallegeNotification(_ note: Notification) {
let responseDict = note.object as! NSDictionary
let challenge = responseDict.object(forKey: "challenge") as! String
let lock = NSLock()
lock.lock()
TLStealthWebSocket.instance().challenge = challenge
lock.unlock()
respondToStealthChallege(challenge)
}
func respondToStealthChallege(_ challenge: String) {
if (!isAccountsAndImportsLoaded || !TLStealthWebSocket.instance().isWebSocketOpen()) {
return
}
guard let accounts = accounts else { return }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
if accountObject.hasFetchedAccountData() &&
accountObject.stealthWallet != nil && accountObject.stealthWallet?.isListeningToStealthPayment == false {
if let addrAndSignature = accountObject.stealthWallet?.getStealthAddressAndSignatureFromChallenge(challenge){
TLStealthWebSocket.instance().sendMessageSubscribeToStealthAddress(addrAndSignature.0, signature: addrAndSignature.1)
}
}
}
guard let importedAccounts = importedAccounts else { return }
for i in stride(from: 0, to: importedAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedAccounts.getAccountObjectForIdx(i)
if let stealthWallet = accountObject.stealthWallet, accountObject.hasFetchedAccountData() &&
stealthWallet.isListeningToStealthPayment == false {
let addrAndSignature = stealthWallet.getStealthAddressAndSignatureFromChallenge(challenge)
TLStealthWebSocket.instance().sendMessageSubscribeToStealthAddress(addrAndSignature.0, signature: addrAndSignature.1)
}
}
}
func respondToStealthAddressSubscription(_ note: Notification) {
let responseDict = note.object as! NSDictionary
let stealthAddress = responseDict.object(forKey: "addr") as! String
let subscriptionSuccess = responseDict.object(forKey: "success") as! String
if subscriptionSuccess == "False" && consecutiveFailedStealthChallengeCount < MAX_CONSECUTIVE_FAILED_STEALTH_CHALLENGE_COUNT {
consecutiveFailedStealthChallengeCount += 1
TLStealthWebSocket.instance().sendMessageGetChallenge()
return
}
consecutiveFailedStealthChallengeCount = 0
guard let accounts = accounts else { return }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
if let stealthWallet = accountObject.stealthWallet, stealthWallet.getStealthAddress() == stealthAddress {
stealthWallet.isListeningToStealthPayment = true
}
}
guard let importedAccounts = importedAccounts else { return }
for i in stride(from: 0, to: importedAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedAccounts.getAccountObjectForIdx(i)
if let stealthWallet = accountObject.stealthWallet, stealthWallet.getStealthAddress() == stealthAddress {
stealthWallet.isListeningToStealthPayment = true
}
}
}
func handleGetTxSuccessForRespondToStealthPayment(_ stealthAddress: String, paymentAddress: String,
txid: String, txTime: UInt64, txObject: TLTxObject) {
let inputAddresses = txObject.getInputAddressArray()
let outputAddresses = txObject.getOutputAddressArray()
if outputAddresses.index(of: paymentAddress) == nil {
return
}
let possibleStealthDataScripts = txObject.getPossibleStealthDataScripts()
func processStealthPayment(_ accountObject: TLAccountObject) {
if let stealthWallet = accountObject.stealthWallet, stealthWallet.getStealthAddress() == stealthAddress {
if accountObject.hasFetchedAccountData() {
for stealthDataScript in possibleStealthDataScripts {
let privateKey = stealthWallet.generateAndAddStealthAddressPaymentKey(stealthDataScript, expectedAddress: paymentAddress,
txid: txid, txTime: txTime, stealthPaymentStatus: TLStealthPaymentStatus.unspent)
if privateKey != nil {
handleNewTxForAccount(accountObject, txObject: txObject)
break
}
}
}
} else {
// must refresh account balance if a input address belongs to account
// this is needed because websocket api does not notify of addresses being used as inputs
for address in inputAddresses {
if accountObject.hasFetchedAccountData() && accountObject.isAddressPartOfAccount(address) {
handleNewTxForAccount(accountObject, txObject: txObject)
}
}
}
}
guard let accounts = accounts else { return }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
processStealthPayment(accountObject)
}
guard let coldWalletAccounts = coldWalletAccounts else { return }
for i in stride(from: 0, to: coldWalletAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = coldWalletAccounts.getAccountObjectForIdx(i)
for address in inputAddresses {
if accountObject.isAddressPartOfAccount(address) {
handleNewTxForAccount(accountObject, txObject: txObject)
}
}
}
guard let importedAccounts = importedAccounts else { return }
for i in stride(from: 0, to: importedAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedAccounts.getAccountObjectForIdx(i)
processStealthPayment(accountObject)
}
guard let importedWatchAccounts = importedWatchAccounts else { return }
for i in stride(from: 0, to: importedWatchAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedWatchAccounts.getAccountObjectForIdx(i)
for address in inputAddresses {
if accountObject.isAddressPartOfAccount(address) {
handleNewTxForAccount(accountObject, txObject: txObject)
}
}
}
guard let importedAddresses = importedAddresses else { return }
for i in stride(from: 0, to: importedAddresses.getCount(), by: 1) {
let importedAddress = importedAddresses.getAddressObjectAtIdx(i)
for addr in inputAddresses {
if (addr == importedAddress.getAddress()) {
handleNewTxForImportedAddress(importedAddress, txObject: txObject)
}
}
}
guard let importedWatchAddresses = importedWatchAddresses else { return }
for i in stride(from: 0, to: importedWatchAddresses.getCount(), by: 1) {
let importedAddress = importedWatchAddresses.getAddressObjectAtIdx(i)
for addr in inputAddresses {
if (addr == importedAddress.getAddress()) {
handleNewTxForImportedAddress(importedAddress, txObject: txObject)
}
}
}
}
func respondToStealthPayment(_ note: Notification) {
let responseDict = note.object as! NSDictionary
let stealthAddress = responseDict.object(forKey: "stealth_addr") as! String
let txid = responseDict.object(forKey: "txid") as! String
let paymentAddress = responseDict.object(forKey: "addr") as! String
let txTime = UInt64((responseDict.object(forKey: "time") as! NSNumber).uint64Value)
DLog("respondToStealthPayment stealthAddress: \(stealthAddress)")
DLog("respondToStealthPayment respondToStealthPaymentGetTxTries: \(self.respondToStealthPaymentGetTxTries)")
if self.respondToStealthPaymentGetTxTries < self.RESPOND_TO_STEALTH_PAYMENT_GET_TX_TRIES_MAX_TRIES {
TLBlockExplorerAPI.instance().getTx(txid, success: { (jsonData:AnyObject?) -> () in
if jsonData == nil {
return;
}
let txObject = TLTxObject(dict:jsonData as! NSDictionary)
self.handleGetTxSuccessForRespondToStealthPayment(stealthAddress,
paymentAddress: paymentAddress, txid: txid, txTime: txTime, txObject: txObject)
self.respondToStealthPaymentGetTxTries = 0
}, failure: { (code, status) -> () in
DLog("respondToStealthPayment getTx fail \(txid)")
self.respondToStealthPayment(note)
self.respondToStealthPaymentGetTxTries += 1
})
}
}
func setWalletTransactionListenerClosed() {
DLog("setWalletTransactionListenerClosed")
guard let accounts = accounts else { return }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
accountObject.listeningToIncomingTransactions = false
}
guard let coldWalletAccounts = coldWalletAccounts else { return }
for i in stride(from: 0, to: coldWalletAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = coldWalletAccounts.getAccountObjectForIdx(i)
accountObject.listeningToIncomingTransactions = false
}
guard let importedAccounts = importedAccounts else { return }
for i in stride(from: 0, to: importedAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedAccounts.getAccountObjectForIdx(i)
accountObject.listeningToIncomingTransactions = false
}
guard let importedWatchAccounts = importedWatchAccounts else { return }
for i in stride(from: 0, to: importedWatchAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedWatchAccounts.getAccountObjectForIdx(i)
accountObject.listeningToIncomingTransactions = false
}
guard let importedAddresses = importedAddresses else { return }
for i in stride(from: 0, to: importedAddresses.getCount(), by: 1) {
let importedAddress = importedAddresses.getAddressObjectAtIdx(i)
importedAddress.listeningToIncomingTransactions = false
}
guard let importedWatchAddresses = importedWatchAddresses else { return }
for i in stride(from: 0, to: importedWatchAddresses.getCount(), by: 1) {
let importedAddress = importedWatchAddresses.getAddressObjectAtIdx(i)
importedAddress.listeningToIncomingTransactions = false
}
}
func listenToIncomingTransactionForGeneratedAddress(_ note: Notification) {
let address: AnyObject? = note.object as AnyObject?
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address as! String)
}
func updateModelWithNewTransaction(_ note: Notification) {
let txDict = note.object as! NSDictionary
DLog("updateModelWithNewTransaction txDict: \(txDict.debugDescription)")
DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.background).async {
let txObject = TLTxObject(dict:txDict)
if self.pendingSelfStealthPaymentTxid != nil {
// Special case where receiving stealth payment from same sending account.
// Let stealth websocket handle it
// Need this cause, must generate private key and add address to account so that the bitcoins can be accounted for.
if txObject.getHash() as? String == self.pendingSelfStealthPaymentTxid {
//self.pendingSelfStealthPaymentTxid = nil
return
}
}
let addressesInTx = txObject.getAddresses()
guard let accounts = self.accounts else { return }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
if !accountObject.hasFetchedAccountData() {
continue
}
for address in addressesInTx {
if (accountObject.isAddressPartOfAccount(address )) {
DLog("updateModelWithNewTransaction accounts \(accountObject.getAccountID())")
self.handleNewTxForAccount(accountObject, txObject: txObject)
}
}
}
guard let coldWalletAccounts = self.coldWalletAccounts else { return }
for i in stride(from: 0, to: coldWalletAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = coldWalletAccounts.getAccountObjectForIdx(i)
if !accountObject.hasFetchedAccountData() {
continue
}
for address in addressesInTx {
if (accountObject.isAddressPartOfAccount(address)) {
DLog("updateModelWithNewTransaction coldWalletAccounts \(accountObject.getAccountID())")
self.handleNewTxForAccount(accountObject, txObject: txObject)
}
}
}
guard let importedAccounts = self.importedAccounts else { return }
for i in stride(from: 0, to: importedAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedAccounts.getAccountObjectForIdx(i)
if !accountObject.hasFetchedAccountData() {
continue
}
for address in addressesInTx {
if (accountObject.isAddressPartOfAccount(address)) {
DLog("updateModelWithNewTransaction importedAccounts \(accountObject.getAccountID())")
self.handleNewTxForAccount(accountObject, txObject: txObject)
}
}
}
guard let importedWatchAccounts = self.importedWatchAccounts else { return }
for i in stride(from: 0, to: importedWatchAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedWatchAccounts.getAccountObjectForIdx(i)
if !accountObject.hasFetchedAccountData() {
continue
}
for address in addressesInTx {
if (accountObject.isAddressPartOfAccount(address)) {
DLog("updateModelWithNewTransaction importedWatchAccounts \(accountObject.getAccountID())")
self.handleNewTxForAccount(accountObject, txObject: txObject)
}
}
}
guard let importedAddresses = self.importedAddresses else { return }
for i in stride(from: 0, to: importedAddresses.getCount(), by: 1) {
let importedAddress = importedAddresses.getAddressObjectAtIdx(i)
if !importedAddress.hasFetchedAccountData() {
continue
}
let address = importedAddress.getAddress()
for addr in addressesInTx {
if (addr == address) {
DLog("updateModelWithNewTransaction importedAddresses \(address)")
self.handleNewTxForImportedAddress(importedAddress, txObject: txObject)
}
}
}
guard let importedWatchAddresses = self.importedWatchAddresses else { return }
for i in stride(from: 0, to: importedWatchAddresses.getCount(), by: 1) {
let importedAddress = importedWatchAddresses.getAddressObjectAtIdx(i)
if !importedAddress.hasFetchedAccountData() {
continue
}
let address = importedAddress.getAddress()
for addr in addressesInTx {
if (addr == address) {
DLog("updateModelWithNewTransaction importedWatchAddresses \(address)")
self.handleNewTxForImportedAddress(importedAddress, txObject: txObject)
}
}
}
}
}
func handleNewTxForAccount(_ accountObject: TLAccountObject, txObject: TLTxObject) {
let receivedAmount = accountObject.processNewTx(txObject)
let receivedTo = accountObject.getAccountNameOrAccountPublicKey()
//AppDelegate.instance().pendingOperations.addSetUpAccountOperation(accountObject, fetchDataAgain: true, success: {
updateUIForNewTx(txObject.getHash() as! String, receivedAmount: receivedAmount, receivedTo: receivedTo)
//})
}
func handleNewTxForImportedAddress(_ importedAddress: TLImportedAddress, txObject: TLTxObject) {
let receivedAmount = importedAddress.processNewTx(txObject)
let receivedTo = importedAddress.getLabel()
//AppDelegate.instance().pendingOperations.addSetUpImportedAddressOperation(importedAddress, fetchDataAgain: true, success: {
updateUIForNewTx(txObject.getHash() as! String, receivedAmount: receivedAmount, receivedTo: receivedTo)
//})
}
func updateUIForNewTx(_ txHash: String, receivedAmount: TLCoin?, receivedTo: String) {
DispatchQueue.main.async {
DLog("updateUIForNewTx txHash \(txHash)")
self.webSocketNotifiedTxHashSet.add(txHash)
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_MODEL_UPDATED_NEW_UNCONFIRMED_TRANSACTION()), object: txHash, userInfo:nil)
if let receivedAmount = receivedAmount {
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_RECEIVE_PAYMENT()), object:nil, userInfo:nil)
self.promptReceivedPayment(receivedTo, receivedAmount: receivedAmount)
}
}
}
func promptReceivedPayment(_ receivedTo:String, receivedAmount:TLCoin) {
let delayTime = DispatchTime.now() + Double(Int64(1 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: delayTime) {
let msg = "\(receivedTo) received \(TLCurrencyFormat.getProperAmount(receivedAmount))"
TLPrompts.promptSuccessMessage(msg, message: "")
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
}
}
func updateModelWithNewBlock(_ note: Notification) {
let jsonData = note.object as! NSDictionary
let blockHeight = jsonData.object(forKey: "height") as! NSNumber
DLog("updateModelWithNewBlock: \(blockHeight)")
TLBlockchainStatus.instance().blockHeight = blockHeight.uint64Value
NotificationCenter.default.post(name: Notification.Name(rawValue: TLNotificationEvents.EVENT_MODEL_UPDATED_NEW_BLOCK()), object:nil, userInfo:nil)
}
func initializeWalletAppAndShowInitialScreen(_ recoverHDWalletIfNewlyInstalledApp:(Bool), walletPayload:(NSDictionary?)) {
TLAnalytics.instance()
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.saveWalletPayloadDelay(_:)),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_WALLET_PAYLOAD_UPDATED()), object:nil)
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.updateModelWithNewTransaction(_:)),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_NEW_UNCONFIRMED_TRANSACTION()), object:nil)
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.updateModelWithNewBlock(_:)),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_NEW_BLOCK()), object:nil)
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.listenToIncomingTransactionForGeneratedAddress(_:)),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_NEW_ADDRESS_GENERATED()), object:nil)
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.setWalletTransactionListenerClosed),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_TRANSACTION_LISTENER_CLOSE()), object:nil)
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.listenToIncomingTransactionForWallet),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_TRANSACTION_LISTENER_OPEN()), object:nil)
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.setAccountsListeningToStealthPaymentsToFalse),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_STEALTH_PAYMENT_LISTENER_CLOSE()), object:nil)
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.respondToStealthChallegeNotification(_:)),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_RECEIVED_STEALTH_CHALLENGE()), object:nil)
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.respondToStealthAddressSubscription(_:)),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_RECEIVED_STEALTH_ADDRESS_SUBSCRIPTION()), object:nil)
NotificationCenter.default.addObserver(self
,selector:#selector(AppDelegate.respondToStealthPayment(_:)),
name:NSNotification.Name(rawValue: TLNotificationEvents.EVENT_RECEIVED_STEALTH_PAYMENT()), object:nil)
var passphrase = TLWalletPassphrase.getDecryptedWalletPassphrase()
if !TLPreferences.hasSetupHDWallet() {
if (recoverHDWalletIfNewlyInstalledApp) {
self.recoverHDWallet(passphrase!)
} else {
passphrase = TLHDWalletWrapper.generateMnemonicPassphrase()
self.refreshApp(passphrase!)
let accountObject = self.accounts!.createNewAccount(TLDisplayStrings.ACCOUNT_1_STRING(), accountType:.normal, preloadStartingAddresses:true)
accountObject.updateAccountNeedsRecovering(false)
AppDelegate.instance().updateGodSend(TLSendFromType.hdWallet, sendFromIndex:0)
AppDelegate.instance().updateReceiveSelectedObject(TLSendFromType.hdWallet, sendFromIndex:0)
AppDelegate.instance().updateHistorySelectedObject(TLSendFromType.hdWallet, sendFromIndex:0)
}
justSetupHDWallet = true
guard let password = TLWalletJson.getDecryptedEncryptedWalletJSONPassphrase(),
let walletsJson = appWallet.getWalletsJson() else { return }
let encryptedWalletJson = TLWalletJson.getEncryptedWalletJsonContainer(walletsJson,
password: password)
let success = saveWalletJson(encryptedWalletJson as NSString, date:Date())
if success {
TLPreferences.setHasSetupHDWallet(true)
} else {
NSException(name: NSExceptionName(rawValue: "Error"), reason: "Error saving wallet JSON file", userInfo: nil).raise()
}
} else {
let masterHex = TLHDWalletWrapper.getMasterHex(passphrase ?? "")
if let walletPayload = walletPayload {
appWallet.loadWalletPayload(walletPayload, masterHex:masterHex)
} else {
TLPrompts.promptErrorMessage(TLDisplayStrings.ERROR_STRING(), message:TLDisplayStrings.ERROR_LOADING_WALLET_JSON_FILE_STRING())
NSException(name: NSExceptionName(rawValue: "Error"), reason: "Error loading wallet JSON file", userInfo: nil).raise()
}
}
accounts = TLAccounts(appWallet: appWallet, accountsArray: appWallet.getAccountObjectArray(), accountType:.hdWallet)
coldWalletAccounts = TLAccounts(appWallet: appWallet, accountsArray: appWallet.getColdWalletAccountArray(), accountType: .coldWallet)
importedAccounts = TLAccounts(appWallet: appWallet, accountsArray: appWallet.getImportedAccountArray(), accountType: .imported)
importedWatchAccounts = TLAccounts(appWallet: appWallet, accountsArray: appWallet.getWatchOnlyAccountArray(), accountType:.importedWatch)
importedAddresses = TLImportedAddresses(appWallet: appWallet, importedAddresses: appWallet.getImportedPrivateKeyArray(), accountAddressType:TLAccountAddressType.imported)
importedWatchAddresses = TLImportedAddresses(appWallet: appWallet, importedAddresses: appWallet.getWatchOnlyAddressArray(), accountAddressType:TLAccountAddressType.importedWatch)
isAccountsAndImportsLoaded = true
godSend = TLSpaghettiGodSend(appWallet: appWallet)
receiveSelectedObject = TLSelectedObject()
historySelectedObject = TLSelectedObject()
updateGodSend()
let selectObjected: AnyObject? = self.godSend?.getSelectedSendObject()
if let receiveSelectedObject = receiveSelectedObject,
let historySelectedObject = historySelectedObject {
if selectObjected is TLAccountObject {
receiveSelectedObject.setSelectedAccount(selectObjected as! TLAccountObject)
historySelectedObject.setSelectedAccount(selectObjected as! TLAccountObject)
} else if (selectObjected is TLImportedAddress) {
receiveSelectedObject.setSelectedAddress(selectObjected as! TLImportedAddress)
historySelectedObject.setSelectedAddress(selectObjected as! TLImportedAddress)
}
}
guard let accounts = accounts else { return }
assert(accounts.getNumberOfAccounts() > 0, "")
TLBlockExplorerAPI.instance()
TLExchangeRate.instance()
TLAchievements.instance()
guard let blockExplorerURL = TLPreferences.getBlockExplorerURL(TLPreferences.getBlockExplorerAPI()),
let baseURL = URL(string: blockExplorerURL) else { return }
TLNetworking.isReachable(baseURL, reachable:{(reachable: TLDOMAINREACHABLE) in
if reachable == TLDOMAINREACHABLE.notreachable {
TLPrompts.promptErrorMessage(TLDisplayStrings.NETWORK_ERROR_STRING(),
message:String(format:TLDisplayStrings.X_SERVERS_NOT_REACHABLE_STRING(), blockExplorerURL))
}
})
TLBlockExplorerAPI.instance().getBlockHeight({(jsonData: AnyObject!) in
let blockHeight = (jsonData.object(forKey: "height") as! NSNumber).uint64Value
DLog("setBlockHeight: \((jsonData.object(forKey: "height") as! NSNumber))")
TLBlockchainStatus.instance().blockHeight = blockHeight
}, failure:{(code, status) in
DLog("Error getting block height.")
// TLPrompts.promptErrorMessage(TLDisplayStrings.NETWORK_ERROR_STRING(),
// message:String(format:TLDisplayStrings.ERROR_GETTING_BLOCK_HEIGHT_STRING()))
})
}
func refreshHDWalletAccounts(_ isRestoringWallet: Bool) {
let group = DispatchGroup()
guard let accounts = accounts else { return }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
group.enter()
// if account needs recovering dont fetch account data
if (accountObject.needsRecovering()) {
return
}
guard var activeAddresses = accountObject.getActiveMainAddresses() as? [String] else { return }
activeAddresses += accountObject.getActiveChangeAddresses() as! [String]
if TLWalletUtils.ENABLE_STEALTH_ADDRESS() {
if let stealthWallet = accountObject.stealthWallet {
activeAddresses += stealthWallet.getPaymentAddresses()
group.enter()
DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default).async {
accountObject.fetchNewStealthPayments(isRestoringWallet)
group.leave()
}
}
}
accountObject.getAccountData(activeAddresses, shouldResetAccountBalance: true, success: {
() in
group.leave()
}, failure: {
() in
group.leave()
})
}
group.wait(timeout: DispatchTime.distantFuture)
}
fileprivate func setUpLocalNotification() {
if (TLUtils.getiOSVersion() >= 8) {
let types: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.sound, UIUserNotificationType.alert]
let mySettings =
UIUserNotificationSettings(types: types, categories:nil)
UIApplication.shared.registerUserNotificationSettings(mySettings)
}
}
func application(_ applcation: UIApplication, didReceive notification: UILocalNotification) {
if let alertBody = notification.alertBody {
DLog("didReceiveLocalNotification: \(alertBody)")
let av = UIAlertView(title: alertBody,
message:"",
delegate:nil,
cancelButtonTitle:nil,
otherButtonTitles:TLDisplayStrings.OK_STRING())
av.show()
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
}
}
fileprivate func showLocalNotification(_ message: String) {
DLog("showLocalNotification: \(message)")
let localNotification = UILocalNotification()
localNotification.soundName = UILocalNotificationDefaultSoundName
localNotification.fireDate = Date(timeIntervalSinceNow:1)
localNotification.alertBody = message
localNotification.timeZone = TimeZone.current
UIApplication.shared.scheduleLocalNotification(localNotification)
}
fileprivate func isCameraAllowed() -> Bool {
return AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) != AVAuthorizationStatus.denied
}
fileprivate func promptAppNotAllowedCamera() {
let displayName = TLUtils.defaultAppName()
let av = UIAlertView(title: String(format:TLDisplayStrings.X_NOT_ALLOWED_TO_ACCESS_THE_CAMERA_STRING(), displayName),
message: String(format:TLDisplayStrings.ALLOW_CAMERA_ACCESS_IN_STRING(), displayName),
delegate:nil ,
cancelButtonTitle:TLDisplayStrings.OK_STRING())
av.show()
}
func showPrivateKeyReaderController(_ viewController: UIViewController, success: @escaping TLWalletUtils.SuccessWithDictionary, error: @escaping TLWalletUtils.ErrorWithString) {
if !isCameraAllowed() {
self.promptAppNotAllowedCamera()
return
}
let reader = TLQRCodeScannerViewController(success:{(data: String?) in
if let data = data, TLCoreBitcoinWrapper.isBIP38EncryptedKey(data, isTestnet: self.appWallet.walletConfig.isTestnet) {
self.scannedEncryptedPrivateKey = data
}
else {
guard let data = data else {
error("No Data")
return
}
success(["privateKey": data])
}
}, error:{(e: String?) in
error(e)
})
viewController.present(reader, animated:true, completion:nil)
}
func showAddressReaderControllerFromViewController(_ viewController: (UIViewController), success: @escaping (TLWalletUtils.SuccessWithString), error: @escaping (TLWalletUtils.ErrorWithString)) {
if (!isCameraAllowed()) {
promptAppNotAllowedCamera()
return
}
let reader = TLQRCodeScannerViewController(success:{(data: String?) in
success(data)
}, error:{(e: String?) in
error(e)
})
viewController.present(reader, animated:true, completion:nil)
}
func showExtendedPrivateKeyReaderController(_ viewController: (UIViewController), success: @escaping (TLWalletUtils.SuccessWithString), error: @escaping (TLWalletUtils.ErrorWithString)) {
if (!isCameraAllowed()) {
promptAppNotAllowedCamera()
return
}
let reader = TLQRCodeScannerViewController(success:{(data: String?) in
success(data)
}, error:{(e: String?) in
error(e)
})
viewController.present(reader, animated:true, completion:nil)
}
func showExtendedPublicKeyReaderController(_ viewController: (UIViewController), success: @escaping (TLWalletUtils.SuccessWithString), error: @escaping (TLWalletUtils.ErrorWithString)) {
if (!isCameraAllowed()) {
promptAppNotAllowedCamera()
return
}
let reader = TLQRCodeScannerViewController(success:{(data: String?) in
success(data)
}, error:{(e: String?) in
error(e)
})
viewController.present(reader, animated:true, completion:nil)
}
func showColdWalletSpendReaderControllerFromViewController(_ viewController: (UIViewController), success: @escaping (TLWalletUtils.SuccessWithString), error: @escaping (TLWalletUtils.ErrorWithString)) {
if (!isCameraAllowed()) {
promptAppNotAllowedCamera()
return
}
let reader = TLQRCodeScannerViewController(success:{(data: String?) in
success(data)
}, error:{(e: String?) in
error(e)
})
viewController.present(reader, animated:true, completion:nil)
}
func listenToIncomingTransactionForWallet() {
if (!isAccountsAndImportsLoaded || !TLTransactionListener.instance().isWebSocketOpen()) {
return
}
guard let accounts = accounts else { return }
for i in stride(from: 0, to: accounts.getNumberOfAccounts(), by: 1) {
let accountObject = accounts.getAccountObjectForIdx(i)
if accountObject.downloadState != .downloaded {
continue
}
guard let activeMainAddresses = accountObject.getActiveMainAddresses() else { return }
for address in activeMainAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address as! String)
}
guard let activeChangeAddresses = accountObject.getActiveChangeAddresses() else { return }
for address in activeChangeAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address as! String)
}
if let stealthWallet = accountObject.stealthWallet {
let stealthPaymentAddresses = stealthWallet.getUnspentPaymentAddresses()
for address in stealthPaymentAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address)
}
}
accountObject.listeningToIncomingTransactions = true
}
guard let coldWalletAccounts = coldWalletAccounts else { return }
for i in stride(from: 0, to: coldWalletAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = coldWalletAccounts.getAccountObjectForIdx(i)
if accountObject.downloadState != .downloaded {
continue
}
guard let activeMainAddresses = accountObject.getActiveMainAddresses() else { return }
for address in activeMainAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address as! String)
}
guard let activeChangeAddresses = accountObject.getActiveChangeAddresses() else { return }
for address in activeChangeAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address as! String)
}
accountObject.listeningToIncomingTransactions = true
}
guard let importedAccounts = importedAccounts else { return }
for i in stride(from: 0, to: importedAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedAccounts.getAccountObjectForIdx(i)
if accountObject.downloadState != .downloaded {
continue
}
guard let activeMainAddresses = accountObject.getActiveMainAddresses() else { return }
for address in activeMainAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address as! String)
}
guard let activeChangeAddresses = accountObject.getActiveChangeAddresses() else { return }
for address in activeChangeAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address as! String)
}
if let stealthWallet = accountObject.stealthWallet {
let stealthPaymentAddresses = stealthWallet.getUnspentPaymentAddresses()
for address in stealthPaymentAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address)
}
}
accountObject.listeningToIncomingTransactions = true
}
guard let importedWatchAccounts = importedWatchAccounts else { return }
for i in stride(from: 0, to: importedWatchAccounts.getNumberOfAccounts(), by: 1) {
let accountObject = importedWatchAccounts.getAccountObjectForIdx(i)
if accountObject.downloadState != .downloaded {
continue
}
guard let activeMainAddresses = accountObject.getActiveMainAddresses() else { return }
for address in activeMainAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address as! String)
}
guard let activeChangeAddresses = accountObject.getActiveChangeAddresses() else { return }
for address in activeChangeAddresses {
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address as! String)
}
accountObject.listeningToIncomingTransactions = true
}
guard let importedAddresses = importedAddresses else { return }
for i in stride(from: 0, to: importedAddresses.getCount(), by: 1) {
let importedAddress = importedAddresses.getAddressObjectAtIdx(i)
if importedAddress.downloadState != .downloaded {
continue
}
let address = importedAddress.getAddress()
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address)
importedAddress.listeningToIncomingTransactions = true
}
guard let importedWatchAddresses = importedWatchAddresses else { return }
for i in stride(from: 0, to: importedWatchAddresses.getCount(), by: 1) {
let importedAddress = importedWatchAddresses.getAddressObjectAtIdx(i)
if importedAddress.downloadState != .downloaded {
continue
}
let address = importedAddress.getAddress()
TLTransactionListener.instance().listenToIncomingTransactionForAddress(address)
importedAddress.listeningToIncomingTransactions = true
}
}
func application(_ application: (UIApplication), open url: URL, sourceApplication: (String)?, annotation:Any) -> Bool {
self.bitcoinURIOptionsDict = TLWalletUtils.parseBitcoinURI(url.absoluteString)
return true
}
func applicationWillResignActive(_ application: UIApplication) {
}
func applicationDidEnterBackground(_ application: UIApplication) {
}
func applicationWillEnterForeground(_ application: UIApplication) {
TLExchangeRate.instance().updateExchangeRate()
}
func applicationDidBecomeActive(_ application: UIApplication) {
}
func applicationWillTerminate(_ application: UIApplication) {
saveWalletJsonCloud()
}
func saveWalletPayloadDelay(_ notification: Notification) {
DispatchQueue.main.async {
if self.saveWalletJSONEnabled == false {
return
}
NSObject.cancelPreviousPerformRequests(withTarget: self, selector:#selector(AppDelegate.saveWalletJsonCloudBackground), object:nil)
Timer.scheduledTimer(timeInterval: self.SAVE_WALLET_PAYLOAD_DELAY, target: self,
selector: #selector(AppDelegate.saveWalletJsonCloudBackground), userInfo: nil, repeats: false)
}
}
func saveWalletJsonCloudBackground() {
DLog("saveWalletJsonCloudBackground starting...")
let queue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.background)
queue.async {
self.saveWalletJsonCloud()
}
}
func printOutWalletJSON() {
guard let walletJson = appWallet.getWalletsJson() else { return }
DLog("printOutWalletJSON:\n\(walletJson)")
}
func saveWalletJsonCloud() -> Bool {
if saveWalletJSONEnabled == false {
DLog("saveWalletJSONEnabled disabled")
return false
}
DLog("saveFileToCloud starting...")
guard let walletJson = appWallet.getWalletsJson(),
let password = TLWalletJson.getDecryptedEncryptedWalletJSONPassphrase() else { return false }
let encryptedWalletJson = TLWalletJson.getEncryptedWalletJsonContainer(walletJson,
password: password)
saveWalletJson(encryptedWalletJson as (NSString), date:Date())
DLog("saveFileToCloud local done")
return true
}
fileprivate func saveWalletJson(_ encryptedWalletJson: (NSString), date: (Date)) -> Bool {
let success = TLWalletJson.saveWalletJson(encryptedWalletJson as String, date:date)
if (!success) {
DispatchQueue.main.async {
TLPrompts.promptErrorMessage(TLDisplayStrings.LOCAL_BACK_UP_TO_WALLET_FAILED_STRING(), message:TLDisplayStrings.LOCAL_BACK_UP_TO_WALLET_FAILED_STRING())
}
}
return success
}
func getLocalWalletJsonDict() -> NSDictionary? {
return TLWalletJson.getWalletJsonDict(TLWalletJson.getLocalWalletJSONFile(),
password:TLWalletJson.getDecryptedEncryptedWalletJSONPassphrase())
}
fileprivate func menuShownHideStatusBar() {
UIApplication.shared.isStatusBarHidden = true
}
fileprivate func menuHiddenShowStatusBar() {
UIApplication.shared.isStatusBarHidden = false
}
func passcodeViewControllerWillClose() {
UIApplication.shared.isStatusBarHidden = false
}
func maxNumberOfFailedAttemptsReached() {
}
func passcodeWasEnteredSuccessfully() {
UIApplication.shared.isStatusBarHidden = false
}
func logoutButtonWasPressed() {
UIApplication.shared.isStatusBarHidden = false
}
}
================================================
FILE: ArcBit/ArcBit-Bridging-Header.h
================================================
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import <CoreBitcoin/BTCAddress.h>
#import <CoreBitcoin/BTCBase58.h>
#import <CoreBitcoin/BTCBigNumber.h>
#import <CoreBitcoin/BTCBlock.h>
#import <CoreBitcoin/BTCBlockchainInfo.h>
#import <CoreBitcoin/BTCBlockHeader.h>
#import <CoreBitcoin/BTCCurvePoint.h>
#import <CoreBitcoin/BTCData.h>
#import <CoreBitcoin/BTCErrors.h>
#import <CoreBitcoin/BTCKey.h>
#import <CoreBitcoin/BTCKeychain.h>
#import <CoreBitcoin/BTCMnemonic.h>
#import <CoreBitcoin/BTCBlindSignature.h>
#import <CoreBitcoin/BTCOpcode.h>
#import <CoreBitcoin/BTCProtocolSerialization.h>
#import <CoreBitcoin/BTCScript.h>
#import <CoreBitcoin/BTCScriptMachine.h>
#import <CoreBitcoin/BTCSignatureHashType.h>
#import <CoreBitcoin/BTCTransaction.h>
#import <CoreBitcoin/BTCTransactionInput.h>
#import <CoreBitcoin/BTCTransactionOutput.h>
#import <CoreBitcoin/BTCOutpoint.h>
#import <CoreBitcoin/BTCUnitsAndLimits.h>
#import <CoreBitcoin/NSData+BTCData.h>
#import <CoreBitcoin/BTCKeychain.h>
#import <CoreBitcoin/BTCData.h>
#import <CoreBitcoin/BTCBase58.h>
#import <CoreBitcoin/BTCKey.h>
#import <CoreBitcoin/BTCAddress.h>
#import <SwiftTryCatch.h>
#import "UIAlertController+Blocks.h"
#import "NSMutableData+Bitcoin.h"
#import "UIViewController+ECSlidingViewController.h"
#import "UINavigationBar+FixedHeightWhenStatusBarHidden.h"
#import <BTCBigNumber.h>
#import "JNKeyChain.h"
#import "MBProgressHUD.h"
#import <iCloud.h>
#import "RNCryptor/RNCryptor.h"
#import "BRKey.h"
#import "BRKey+BIP38.h"
#import "NSString+Base58.h"
#import <CoreBitcoin/BTCBitcoinURL.h>
#import "BRTransaction.h"
#import "NSData+Hash.h"
#import "QREncoder.h"
#import "RNEncryptor.h"
#import "RNDecryptor.h"
#import "NSDate-Utilities.h"
#import "RNCryptor.h"
#import "iToast.h"
#import "AFNetworking.h"
#import "SRWebSocket.h"
#import "SRWebSocket+Helpers.h"
#import "AFNetworkActivityIndicatorManager.h"
#import "CustomIOS7AlertView.h"
#import "ECSlidingConstants.h"
#import "IASKAppSettingsViewController.h"
#import "IASKSettingsReader.h"
#import "LTHPasscodeViewController.h"
#import "TLCloudDocumentSyncWrapper.h"
================================================
FILE: ArcBit/ArcBit.entitlements
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>
================================================
FILE: ArcBit/Base.lproj/LaunchScreen.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="1200X1200logo.png" translatesAutoresizingMaskIntoConstraints="NO" id="YKD-be-5DR">
<rect key="frame" x="40" y="40" width="400" height="400"/>
<constraints>
<constraint firstAttribute="width" secondItem="YKD-be-5DR" secondAttribute="height" multiplier="1:1" id="AUq-a9-IEW"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="YKD-be-5DR" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="40" id="C3m-bh-TIM"/>
<constraint firstItem="YKD-be-5DR" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="40" id="Ikz-gw-lXS"/>
<constraint firstItem="YKD-be-5DR" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="nPV-mb-s3z"/>
<constraint firstAttribute="trailing" secondItem="YKD-be-5DR" secondAttribute="trailing" constant="40" id="toO-Kd-C6w"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
<resources>
<image name="1200X1200logo.png" width="1200" height="1200"/>
</resources>
</document>
================================================
FILE: ArcBit/Base.lproj/Localizable.strings
================================================
"" = "";
"%@ is not allowed to access the camera" = "%@ is not allowed to access the camera";
"%@ servers not reachable." = "%@ servers not reachable.";
"%d/%d parts scanned." = "%d/%d parts scanned.";
"%llu confirmations" = "%llu confirmations";
"1 Confirmation" = "1 Confirmation";
"A bitcoin address typically begins with a '1' or '3'. You can see the transactions and track the balance of an address, but you cannot spend from an imported address.\nYou can temporarily import this watch addresses private key to spend its bitcoins. Simply go the Send screen and select a watch address to spend from and you will be prompted to temporarily import your addresses' private key when you click 'Review Payment' in the Send screen. The private key will stay in memory until the app exits or until you remove it manually in the Accounts screen." = "A bitcoin address typically begins with a '1' or '3'. You can see the transactions and track the balance of an address, but you cannot spend from an imported address.\nYou can however temporarily import this watch addresses' private key to spend its bitcoins. Simply go to the Send screen and select a watch address to spend from and you will be prompted to temporarily import your addresses' private key when you click 'Review Payment' on the Send screen. The private key will stay in memory until the app exits or until you remove it manually on the Accounts screen.";
"A bitcoin wallet is a software application that allows people to send, receive and manage their bitcoins.\nBe aware of how other bitcoin applications store your bitcoins' private keys, which are needed to spend your bitcoins.\nThere are generally three different ways applications can your store your bitcoins.\n1.\nThe banking model, where your bitcoin private keys are held for you by someone else.\n2.\nThe security box model, where your bitcoin private keys are stored encrypted on someone else’s servers.\n3.\nThe wallet model, where your bitcoin private keys are stored only on your device." = "A bitcoin wallet is a software application that allows people to send, receive and manage their bitcoins.\nBe aware of how other bitcoin applications store your bitcoins' private keys, which are needed to spend your bitcoins.\nThere are generally three different ways applications can your store your bitcoins.\n1.\nThe banking model, where your bitcoin private keys are held for you by someone else.\n2.\nThe security box model, where your bitcoin private keys are stored encrypted on someone else’s servers.\n3.\nThe wallet model, where your bitcoin private keys are stored only on your device.";
"A private key begins with an 'L', 'K', or '5'.\nBIP 38 encrypted private keys can also be imported. They can either be imported encrypted or unencrypted. If you choose to import it encrypted, you will need to input the password each time you spend from your encrypted private key." = "A private key begins with an 'L', 'K', or '5'.\nBIP 38 encrypted private keys can also be imported. They can either be imported encrypted or unencrypted. If you choose to import it encrypted, you will need to input the password each time you spend from your encrypted private key.";
"Account %@ imported" = "Account %@ imported";
"Account %lu" = "Account %lu";
"Account 1" = "Account 1";
"Account ID" = "Account ID";
"Account ID: %u" = "Account ID: %u";
"Account Private Key" = "Account Private Key";
"Account Public Key" = "Account Public Key";
"Account private key does not match imported account public key" = "Account private key does not match imported account public key";
"Account private key missing" = "Account private key missing";
"Accounts" = "Accounts";
"Achievement List" = "Achievement List";
"Achievements" = "Achievements";
"Actions" = "Actions";
"Active Change Addresses" = "Active Change Addresses";
"Active Main Addresses" = "Active Main Addresses";
"Add Contacts Entry" = "Add Contacts Entry";
"Address" = "Address";
"Address ID " = "Address ID ";
"Address ID: %lu" = "Address ID: %lu";
"Addresses" = "Addresses";
"Advanced Achievement List" = "Advanced Achievement List";
"Advanced FAQ" = "Advanced FAQ";
"Advanced how To:" = "Advanced how To:";
"After a transaction is broadcast to the Bitcoin network, it may be included in a block that is published to the network. When that happens, it is said that the transaction has been mined at a depth of 1 block. With each subsequent block that is found, the number of blocks deep is increased by one. To be secure against double spending, a transaction should not be considered as confirmed until it is a certain number of blocks deep.\nA good rule of thumb is that 1 confirmation is good for small value amounts of bitcoins and a user should wait for more confirmations for larger value amounts.\nArcBit will display the confirmation number up until the 6th confirmation." = "After a transaction is broadcast to the Bitcoin network, it may be included in a block that is published to the network. When that happens, it is said that the transaction has been mined at a depth of 1 block. With each subsequent block that is found, the number of blocks deep is increased by one. To be secure against double spending, a transaction should not be considered as confirmed until it is a certain number of blocks deep.\nA good rule of thumb is that 1 confirmation is good for small value amounts of bitcoins and a user should wait for more confirmations for larger value amounts.\nArcBit will display the confirmation number up until the 6th confirmation.";
"Amount:" = "Amount:";
"An account is a collection of bitcoin addresses. With accounts, you will no longer have to manage bitcoin addresses directly anymore. Since address reuse results in a loss of privacy for people using Bitcoin, ArcBit’s HD wallet account system will automatically handle the cycling of bitcoin addresses for you. This ensures you don’t use the same bitcoin address more then once.\nEach account also has a reusable address. You can find it in your Receive screen. Swipe all the way to right on the QRCode in your Receive screen and you will find a reusable address.\nYou can create an unlimited amount of accounts with ArcBit. See the help section on how to create a new account in ArcBit." = "An account is a collection of bitcoin addresses. With accounts, you will no longer have to manage bitcoin addresses directly anymore. Since address reuse results in a loss of privacy for people using Bitcoin, ArcBit’s HD wallet account system will automatically handle the cycling of bitcoin addresses for you. This ensures you don’t use the same bitcoin address more then once.\nEach account also has a reusable address. You can find it in your Receive screen. Swipe all the way to right on the QRCode in your Receive screen and you will find a reusable address.\nYou can create an unlimited amount of accounts with ArcBit. See the help section on how to create a new account in ArcBit.";
"An account private key begins with the letters 'xprv'. You can see, spend and recover the transactions and bitcoins of an entire account from an account private key." = "An account private key begins with the letters 'xprv'. You can see, spend and recover the transactions and bitcoins of an entire account from an account private key.";
"An account public key begins with the letters 'xpub'. You can see the transactions and bitcoins of an entire account from an account private key, with the exception of reusable address payments. Future releases will address this issue.\nYou can temporarily import the corresponding account private key for this accounts' account public key to spend your watch accounts' bitcoins. Simply go to the Send screen and select a watch account to spend from and you will be prompted to temporarily import your account's private key when you click 'Review Payment' on the Send screen. The private key will stay in memory until the app exits or until you remove it manually on the Accounts screen." = "An account public key begins with the letters 'xpub'. You can see the transactions and bitcoins of an entire account from an account private key, with the exception of reusable address payments. Future releases will address this issue.\nYou can temporarily import the corresponding account private key for this accounts' account public key to spend your watch accounts' bitcoins. Simply go to the Send screen and select a watch account to spend from and you will be prompted to temporarily import your account's private key when you click 'Review Payment' on the Send screen. The private key will stay in memory until the app exits or until you remove it manually on the Accounts screen.";
"ArcBit Brain Wallet" = "ArcBit Brain Wallet";
"ArcBit Web Wallet" = "ArcBit Web Wallet";
"ArcBit uses the the bitcoin wallet model (See the section ’What is a bitcoin wallet?’ to understand the 3 different security models of bitcoin software). However, if you use iCloud to backup your wallet, you will be using the security box model. It is recommended that you do not use iCloud and be responsible for your bitcoins yourself. For those who don’t want to remember a simple backup passphrase, iCloud backup is a good alternative." = "ArcBit uses the the bitcoin wallet model (See the section ’What is a bitcoin wallet?’ to understand the 3 different security models of bitcoin software). However, if you use iCloud to backup your wallet, you will be using the security box model. It is recommended that you do not use iCloud and be responsible for your bitcoins yourself. For those who don’t want to remember a simple backup passphrase, iCloud backup is a good alternative.";
"Archive Account" = "Archive Account";
"Archive address" = "Archive address";
"Archived Accounts" = "Archived Accounts";
"Archived Change Addresses" = "Archived Change Addresses";
"Archived Cold Wallet Accounts" = "Archived Cold Wallet Accounts";
"Archived Imported Accounts" = "Archived Imported Accounts";
"Archived Imported Addresses" = "Archived Imported Addresses";
"Archived Imported Watch Accounts" = "Archived Imported Watch Accounts";
"Archived Imported Watch Addresses" = "Archived Imported Watch Addresses";
"Archived Main Addresses" = "Archived Main Addresses";
"Are you sure you want to archive account %@?" = "Are you sure you want to archive account %@?";
"Are you sure you want to archive address %@?" = "Are you sure you want to archive address %@?";
"Are you sure you want to delete this account?" = "Are you sure you want to delete this account?";
"Are you sure you want to unarchive account %@" = "Are you sure you want to unarchive account %@";
"Are you sure you want to unarchive address %@?" = "Are you sure you want to unarchive address %@?";
"Authorize Cold Wallet Account Payment" = "Authorize Cold Wallet Account Payment";
"Authorize Payment" = "Authorize Payment";
"Backup Passphrase" = "Backup Passphrase";
"Backup wallet" = "Backup wallet";
"Backup local wallet" = "Backup local wallet";
"Backup passphrase found in keychain" = "Backup passphrase found in keychain";
"Bitcoin cuts out the middleman and allows you to send money anywhere in the world with an internet connection with minimum to zero fees." = "Bitcoin cuts out the middleman and allows you to send money anywhere in the world with an internet connection with minimum to zero fees.";
"Bitcoin, uppercase 'B', is an online payment system invented in 2008 and released as open-source software in 2009 by a programmer named Satoshi Nakamoto. The system is decentralized and peer-to-peer allowing users to transact directly without needing an intermediary.\nBitcoin is also a platform of which other decentralized applications can be built upon. Bitcoin, lowercase 'b' is the currency unit that Bitcoin uses." = "Bitcoin, uppercase 'B', is an online payment system invented in 2008 and released as open-source software in 2009 by a programmer named Satoshi Nakamoto. The system is decentralized and peer-to-peer allowing users to transact directly without needing an intermediary.\nBitcoin is also a platform of which other decentralized applications can be built upon. Bitcoin, lowercase 'b' is the currency unit that Bitcoin uses.";
"Bitcoins can be purchased from various bitcoin exchanges. ArcBit is not a bitcoin exchange. ArcBit is a bitcoin wallet. After you purchase some bitcoins from an exchange, you can move it to a bitcoin wallet." = "Bitcoins can be purchased from various bitcoin exchanges. ArcBit is not a bitcoin exchange. ArcBit is a bitcoin wallet. After you purchase some bitcoins from an exchange, you can move it to a bitcoin wallet.";
"Cancel" = "Cancel";
"Cannot archive your default account" = "Cannot archive your default account";
"Cannot archive your one and only account" = "Cannot archive your one and only account";
"Cannot create transactions with outputs less then %@" = "Cannot create transactions with outputs less then %@";
"Cannot decrypt iCloud backup wallet." = "Cannot decrypt iCloud backup wallet.";
"Cannot import reusable address" = "Cannot import reusable address";
"Change Address ID " = "Change Address ID ";
"Change Automatic Transaction Fee" = "Change Automatic Transaction Fee";
"Change Block Explorer URL" = "Change Block Explorer URL";
"Change Blockexplorer Type" = "Change Blockexplorer Type";
"Check out the ArcBit Brain Wallet" = "Check out the ArcBit Brain Wallet";
"Check out the ArcBit Web Wallet" = "Check out the ArcBit Web Wallet";
"Check out the ArcBit Web Wallet!" = "Check out the ArcBit Web Wallet!";
"Checking Transaction" = "Checking Transaction";
"Clear account private key from memory" = "Clear account private key from memory";
"Clear private key from memory" = "Clear private key from memory";
"Cleared from memory" = "Cleared from memory";
"Click an address" = "Click an address";
"Click the button with the arrow" = "Click the button with the arrow";
"Click the plus button at the top right" = "Click the plus button at the top right";
"Click the ‘Contacts’ button" = "Click the ‘Contacts’ button";
"Click ‘Accounts’" = "Click ‘Accounts’";
"Click ‘Advanced settings’" = "Click ‘Advanced settings’";
"Click ‘Archive Account’" = "Click ‘Archive Account’";
"Click ‘Create New Account’" = "Click ‘Create New Account’";
"Click ‘Delete’" = "Click ‘Delete’";
"Click ‘Done’" = "Click ‘Done’";
"Click ‘Edit Account Name’" = "Click ‘Edit Account Name’";
"Click ‘Edit’" = "Click ‘Edit’";
"Click ‘Enable PIN Code’" = "Click ‘Enable PIN Code’";
"Click ‘History’" = "Click ‘History’";
"Click ‘Import Account’" = "Click ‘Import Account’";
"Click ‘Import Private Key’" = "Click ‘Import Private Key’";
"Click ‘Import Watch Only Account’" = "Click ‘Import Watch Only Account’";
"Click ‘Import Watch Only Address’" = "Click ‘Import Watch Only Address’";
"Click ‘Label transaction’" = "Click ‘Label transaction’";
"Click ‘Restore Wallet’" = "Click ‘Restore Wallet’";
"Click ‘Restore’" = "Click ‘Restore’";
"Click ‘Review Payment’" = "Click ‘Review Payment’";
"Click ‘Send’" = "Click ‘Send’";
"Click ‘Set Transaction Fee’" = "Click ‘Set Transaction Fee’";
"Click ‘Settings’" = "Click ‘Settings’";
"Click ‘Show Backup Passphrase’" = "Click ‘Show Backup Passphrase’";
"Click ‘View Addresses’" = "Click ‘View Addresses’";
"Click ‘View account private key QR code’" = "Click ‘View account private key QR code’";
"Click ‘View account public key QR code’" = "Click ‘View account public key QR code’";
"Click ‘View address QR code’" = "Click ‘View address QR code’";
"Click ‘View in web’" = "Click ‘View in web’";
"Click ‘View private key QR code’" = "Click ‘View private key QR code’";
"Click ‘blockexplorer API type’" = "Click ‘blockexplorer API type’";
"Click ’Receive’" = "Click ’Receive’";
"Close" = "Close";
"Cold Wallet" = "Cold Wallet";
"Cold Wallet Accounts" = "Cold Wallet Accounts";
"Cold Wallet Accounts can't see reusable address payments, thus this accounts' reusable address is not available." = "Cold Wallet Accounts can't see reusable address payments, thus this accounts' reusable address is not available.";
"Cold Wallet Overview" = "Cold Wallet Overview";
"Cold wallet private keys are not stored here and cannot be viewed" = "Cold wallet private keys are not stored here and cannot be viewed";
"Complete" = "Complete";
"Complete step 1" = "Complete step 1";
"Confirm Payment" = "Confirm Payment";
"Confirm Pin Code" = "Confirm Pin Code";
"Contacts" = "Contacts";
"Continue" = "Continue";
"Copied To clipboard" = "Copied To clipboard";
"Copy" = "Copy";
"Copy Transaction ID to Clipboard" = "Copy Transaction ID to Clipboard";
"Create Cold Wallet" = "Create Cold Wallet";
"Create New Account" = "Create New Account";
"Create new contact" = "Create new contact";
"Customize Fee" = "Customize Fee";
"Decrypting" = "Decrypting";
"Delete" = "Delete";
"Delete %@" = "Delete %@";
"Delete Account" = "Delete Account";
"Delete Contact" = "Delete Contact";
"Delete address" = "Delete address";
"Do not use the QR code from here to receive bitcoins. Go to the Receive screen to get a QR code to receive bitcoins." = "Do not use the QR code from here to receive bitcoins. Go to the Receive screen to get a QR code to receive bitcoins.";
"Do you like using ArcBit?" = "Do you like using ArcBit?";
"Do you want to load and backup your current local wallet file?" = "Do you want to load and backup your current local wallet file?";
"Do you want to load local wallet file?" = "Do you want to load local wallet file?";
"Do you want to restore from your backup passphrase or start a new wallet?" = "Do you want to restore from your backup passphrase or start a new wallet?";
"Do you want to temporary import your account private key?" = "Do you want to temporary import your account private key?";
"Do you want to temporary import your private key?" = "Do you want to temporary import your private key?";
"Don't remind me" = "Don't remind me";
"Done" = "Done";
"Each account has a public and private account key. Account keys should be kept secret as they are used to view the account's transactions and spend the account's bitcoins." = "Each account has a public and private account key. Account keys should be kept secret as they are used to view the account's transactions and spend the account's bitcoins.";
"Edit" = "Edit";
"Edit Account Name" = "Edit Account Name";
"Edit Contact Name" = "Edit Contact Name";
"Edit Label" = "Edit Label";
"Edit Transaction label" = "Edit Transaction label";
"Email Support" = "Email Support";
"Enable PIN code in settings to better secure your wallet." = "Enable PIN code in settings to better secure your wallet.";
"Enable Pin Code" = "Enable Pin Code";
"Enable Transaction Fee" = "Enable Transaction Fee";
"Enable advanced mode" = "Enable advanced mode";
"Encountered error creating transaction. Please try again." = "Encountered error creating transaction. Please try again.";
"Encrypted" = "Encrypted";
"Enter Label" = "Enter Label";
"Enter PIN" = "Enter PIN";
"Enter a wallet backup passphrase to wipe the current wallet and start/restore another." = "Enter a wallet backup passphrase to wipe the current wallet and start/restore another.";
"Enter account private key" = "Enter account private key";
"Enter account public key" = "Enter account public key";
"Enter address" = "Enter address";
"Enter an account ID and click 'QR Code'. Then on your primary online device, enable Cold Wallet in settings. Then go to the Accounts screen and click 'Import Cold Wallet Account' and scan the Account Public Key QR Code. Afterwards use this cold wallet account as you would a normal account and deposit bitcoins into it. When you want to make a payment from a cold wallet account, go to the next section on the previous screen and follow the step by step instructions there." = "Enter an account ID and click 'QR Code'. Then on your primary online device, enable Cold Wallet in settings. Then go to the Accounts screen and click 'Import Cold Wallet Account' and scan the Account Public Key QR Code. Afterwards use this cold wallet account as you would a normal account and deposit bitcoins into it. When you want to make a payment from a cold wallet account, go to the next section on the previous screen and follow the step by step instructions there.";
"Enter backup passphrase" = "Enter backup passphrase";
"Enter passphrase for your iCloud backup wallet." = "Enter passphrase for your iCloud backup wallet.";
"Enter password for encrypted private key" = "Enter password for encrypted private key";
"Enter the 12 word passphrase that belongs to the cold wallet account that you want to make a payment from. This is the passphrase that was used to generate your account public key that was generated on the 'Create Cold Wallet' section found on the previous screen." = "Enter the 12 word passphrase that belongs to the cold wallet account that you want to make a payment from. This is the passphrase that was used to generate your account public key that was generated on the 'Create Cold Wallet' section found on the previous screen.";
"Error" = "Error";
"Error fetching Transaction." = "Error fetching Transaction.";
"Error fetching unspent outputs. Try again later." = "Error fetching unspent outputs. Try again later.";
"Error fetching unspent outputs. Try again." = "Error fetching unspent outputs. Try again.";
"Error getting block height." = "Error getting block height.";
"Error importing account" = "Error importing account";
"Error loading wallet JSON file" = "Error loading wallet JSON file";
"Explanation" = "Explanation";
"FAQ" = "FAQ";
"Fee:" = "Fee:";
"Fill address field" = "Fill address field";
"Finished Passing Transaction Data" = "Finished Passing Transaction Data";
"First make sure you are using your secondary offline device for this screen (as mentioned in the overview on the previous screen). Click 'New Wallet' and write down or memorize the generated 12 word passphrase. This passphrase can recover and generate all your accounts and the bitcoins associated with it, so keep it safe and to yourself. Also instead of creating a new wallet, you can also input an existing 12 word passphrase that was generated here to create additional accounts." = "First make sure you are using your secondary offline device for this screen (as mentioned in the overview on the previous screen). Click 'New Wallet' and write down or memorize the generated 12 word passphrase. This passphrase can recover and generate all your accounts and the bitcoins associated with it, so keep it safe and to yourself. Also instead of creating a new wallet, you can also input an existing 12 word passphrase that was generated here to create additional accounts.";
"Follow us on Twitter" = "Follow us on Twitter";
"From:" = "From:";
"Funds have been claimed already." = "Funds have been claimed already.";
"Funds imported" = "Funds imported";
"Go" = "Go";
"Go to the side menu" = "Go to the side menu";
"Have sender scan QR code" = "Have sender scan QR code";
"Have sender send you payment" = "Have sender send you payment";
"Help" = "Help";
"Here are some features that no other mobile bitcoin wallet supports.\n- Reusable address support\n- Ability to import individual account (extended) keys\n- iCloud backup support\n- Over 150 local currencies supported" = "Here are some features that no other mobile bitcoin wallet supports.\n- Reusable address support\n- Ability to import individual account (extended) keys\n- iCloud backup support\n- Over 150 local currencies supported";
"Hierarchical Deterministic Wallet" = "Hierarchical Deterministic Wallet";
"History" = "History";
"How To:" = "How To:";
"How do I get bitcoins?" = "How do I get bitcoins?";
"How does ArcBit Wallet work?" = "How does ArcBit Wallet work?";
"Import Account" = "Import Account";
"Import Cold Wallet Account" = "Import Cold Wallet Account";
"Import Feature" = "Import Feature";
"Import Private Key" = "Import Private Key";
"Import Private/Encrypted Key" = "Import Private/Encrypted Key";
"Import Watch Account" = "Import Watch Account";
"Import Watch Address" = "Import Watch Address";
"Import private key encrypted or unencrypted?" = "Import private key encrypted or unencrypted?";
"Import with QR code" = "Import with QR code";
"Import with text input" = "Import with text input";
"Imported Account %@" = "Imported Account %@";
"Imported Accounts" = "Imported Accounts";
"Imported Address" = "Imported Address";
"Imported Addresses" = "Imported Addresses";
"Imported Cold Wallet Account %@" = "Imported Cold Wallet Account %@";
"Imported Watch Account %@" = "Imported Watch Account %@";
"Imported Watch Accounts" = "Imported Watch Accounts";
"Imported Watch Addresses" = "Imported Watch Addresses";
"Imported Watch Only Accounts can't see reusable address payments, thus this accounts' reusable address is not available. If you want see the reusable address for this account, import the account private key that corresponds to this accounts public key." = "Imported Watch Only Accounts can't see reusable address payments, thus this accounts' reusable address is not available. If you want see the reusable address for this account, import the account private key that corresponds to this accounts public key.";
"Importing Account" = "Importing Account";
"Importing Cold Wallet Account" = "Importing Cold Wallet Account";
"Importing a Private Key" = "Importing a Private Key";
"Importing a Watch Only Account" = "Importing a Watch Only Account";
"Importing a Watch Only Address" = "Importing a Watch Only Address";
"Importing an Account" = "Importing an Account";
"Importing an encrypted key will require you to input the password every time you want to send bitcoins from it." = "Importing an encrypted key will require you to input the password every time you want to send bitcoins from it.";
"In advanced mode, you can import bitcoin keys and addresses from other sources. You can import account private keys, account public keys, private keys, and addresses.\nPlease note that your 12 word passphrase cannot recover your bitcoins, so it is recommended that you backup imported keys and addresses separately." = "In advanced mode, you can import bitcoin keys and addresses from other sources. You can import account private keys, account public keys, private keys, and addresses.\nPlease note that your 12 word passphrase cannot recover your bitcoins, so it is recommended that you backup imported keys and addresses separately.";
"Incomplete" = "Incomplete";
"Incorrect passphrase, could not decrypt iCloud wallet backup." = "Incorrect passphrase, could not decrypt iCloud wallet backup.";
"Input a bitcoin address" = "Input a bitcoin address";
"Input a label" = "Input a label";
"Input a new label" = "Input a new label";
"Input a recommended amount. Somewhere between %@ and %@ BTC" = "Input a recommended amount. Somewhere between %@ and %@ BTC";
"Input amount" = "Input amount";
"Input label" = "Input label";
"Input new account name" = "Input new account name";
"Input transaction fee in bitcoins" = "Input transaction fee in bitcoins";
"Instructions" = "Instructions";
"Insufficient Funds" = "Insufficient Funds";
"Insufficient Funds. Account balance is %@ when %@ is required." = "Insufficient Funds. Account balance is %@ when %@ is required.";
"Insufficient Funds. Account contains bitcoin dust. You can only send up to %@ for now." = "Insufficient Funds. Account contains bitcoin dust. You can only send up to %@ for now.";
"Internal Wallet Data" = "Internal Wallet Data";
"Internal account transfer" = "Internal account transfer";
"Invalid Address" = "Invalid Address";
"Invalid Passphrase" = "Invalid Passphrase";
"Invalid URL" = "Invalid URL";
"Invalid account private key" = "Invalid account private key";
"Invalid account public Key" = "Invalid account public Key";
"Invalid amount" = "Invalid amount";
"Invalid backup passphrase" = "Invalid backup passphrase";
"Invalid private key" = "Invalid private key";
"Invalid scanned data" = "Invalid scanned data";
"Invalid transaction ID" = "Invalid transaction ID";
"It is not recommended that you manually manage private keys yourself. A leak of a private key can lead to the compromise of your accounts." = "It is not recommended that you manually manage private keys yourself. A leak of a private key can lead to the compromise of your accounts.";
"It is not recommended that you use a regular bitcoin address for multiple payments, but instead you should import a reusable address. Add address anyways?" = "It is not recommended that you use a regular bitcoin address for multiple payments, but instead you should import a reusable address. Add address anyways?";
"Label" = "Label";
"Label Transaction" = "Label Transaction";
"Local backup to wallet failed!" = "Local backup to wallet failed!";
"Local wallet will be lost. Are you sure you want to restore wallet from iCloud?" = "Local wallet will be lost. Are you sure you want to restore wallet from iCloud?";
"Maximum accounts reached" = "Maximum accounts reached";
"More" = "More";
"Name" = "Name";
"Network Error" = "Network Error";
"New Wallet" = "New Wallet";
"New addresses will be automatically generated and cycled for you as you use your current available addresses." = "New addresses will be automatically generated and cycled for you as you use your current available addresses.";
"Next" = "Next";
"No" = "No";
"None currently" = "None currently";
"Not now" = "Not now";
"Now authorize the transaction on your air gap device. When you have done so, click continue on this device to scan the authorized transaction data and make your payment." = "Now authorize the transaction on your air gap device. When you have done so, click continue on this device to scan the authorized transaction data and make your payment.";
"OK" = "OK";
"On your primary online device, when you want to make a payment from a cold wallet account, simply do it as you normally would on a normal account. When you click 'Send' on the Review Payment screen, instead of the payment going out immediately, you will be prompted to pass the unauthorized transaction data. Then on your secondary offline device, within this screen click 'Scan' to import the transaction so it can be authorized." = "On your primary online device, when you want to make a payment from a cold wal
gitextract_uro7xozv/ ├── .gitignore ├── ArcBit/ │ ├── APIs/ │ │ ├── TLBitcoinListener.swift │ │ ├── TLBlockExplorerAPI.swift │ │ ├── TLBlockchainAPI.swift │ │ ├── TLBlockrAPI.swift │ │ ├── TLExchangeRate.swift │ │ ├── TLInsightAPI.swift │ │ ├── TLNetworking.swift │ │ ├── TLPushTxAPI.swift │ │ ├── TLStealthServerAPI.swift │ │ ├── TLStealthServerConfig.swift │ │ ├── TLStealthWebSocket.swift │ │ └── TLTxFeeAPI.swift │ ├── AppDelegate.swift │ ├── ArcBit-Bridging-Header.h │ ├── ArcBit.entitlements │ ├── Assets/ │ │ └── certs/ │ │ └── live.cer │ ├── Base.lproj/ │ │ ├── LaunchScreen.xib │ │ ├── Localizable.strings │ │ └── Main.storyboard │ ├── External/ │ │ ├── BreadWalletClassesV0.5/ │ │ │ ├── BRKey+BIP38.h │ │ │ ├── BRKey+BIP38.m │ │ │ ├── BRKey.h │ │ │ ├── BRKey.m │ │ │ ├── BRTransaction.h │ │ │ ├── BRTransaction.m │ │ │ ├── NSData+Bitcoin.h │ │ │ ├── NSData+Bitcoin.m │ │ │ ├── NSData+Hash.h │ │ │ ├── NSData+Hash.m │ │ │ ├── NSMutableData+Bitcoin.h │ │ │ ├── NSMutableData+Bitcoin.m │ │ │ ├── NSString+Base58.h │ │ │ ├── NSString+Base58.m │ │ │ └── ccMemory.h │ │ ├── CustomIOS7AlertView/ │ │ │ ├── CustomIOS7AlertView.h │ │ │ └── CustomIOS7AlertView.m │ │ ├── InAppSettingsKit/ │ │ │ ├── Controllers/ │ │ │ │ ├── IASKAppSettingsViewController.h │ │ │ │ ├── IASKAppSettingsViewController.m │ │ │ │ ├── IASKAppSettingsWebViewController.h │ │ │ │ ├── IASKAppSettingsWebViewController.m │ │ │ │ ├── IASKMultipleValueSelection.h │ │ │ │ ├── IASKMultipleValueSelection.m │ │ │ │ ├── IASKSpecifierValuesViewController.h │ │ │ │ ├── IASKSpecifierValuesViewController.m │ │ │ │ └── IASKViewController.h │ │ │ ├── Models/ │ │ │ │ ├── IASKSettingsReader.h │ │ │ │ ├── IASKSettingsReader.m │ │ │ │ ├── IASKSettingsStore.h │ │ │ │ ├── IASKSettingsStore.m │ │ │ │ ├── IASKSettingsStoreFile.h │ │ │ │ ├── IASKSettingsStoreFile.m │ │ │ │ ├── IASKSettingsStoreUserDefaults.h │ │ │ │ ├── IASKSettingsStoreUserDefaults.m │ │ │ │ ├── IASKSpecifier.h │ │ │ │ └── IASKSpecifier.m │ │ │ ├── Resources/ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── de.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── el.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── en.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── es.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── fr.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── it.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── ja.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── nl.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── pt-PT.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── pt.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── ru.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── sv.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── th.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ ├── tr.lproj/ │ │ │ │ │ └── IASKLocalizable.strings │ │ │ │ └── zh-Hant.lproj/ │ │ │ │ └── IASKLocalizable.strings │ │ │ └── Views/ │ │ │ ├── IASKPSSliderSpecifierViewCell.h │ │ │ ├── IASKPSSliderSpecifierViewCell.m │ │ │ ├── IASKPSTextFieldSpecifierViewCell.h │ │ │ ├── IASKPSTextFieldSpecifierViewCell.m │ │ │ ├── IASKSlider.h │ │ │ ├── IASKSlider.m │ │ │ ├── IASKSwitch.h │ │ │ ├── IASKSwitch.m │ │ │ ├── IASKTextField.h │ │ │ ├── IASKTextField.m │ │ │ ├── IASKTextView.h │ │ │ ├── IASKTextView.m │ │ │ ├── IASKTextViewCell.h │ │ │ └── IASKTextViewCell.m │ │ ├── JNKeychain-master/ │ │ │ ├── JNKeychain.h │ │ │ └── JNKeychain.m │ │ ├── KeychainItemWrapper/ │ │ │ ├── KeychainItemWrapper.h │ │ │ └── KeychainItemWrapper.m │ │ ├── LTHPasscodeViewController3.50/ │ │ │ ├── LTHKeychainUtils.h │ │ │ ├── LTHKeychainUtils.m │ │ │ ├── LTHPasscodeViewController.h │ │ │ └── LTHPasscodeViewController.m │ │ ├── Localizations/ │ │ │ ├── de.lproj/ │ │ │ │ └── LTHPasscodeViewController.strings │ │ │ ├── en.lproj/ │ │ │ │ └── LTHPasscodeViewController.strings │ │ │ ├── es.lproj/ │ │ │ │ └── LTHPasscodeViewController.strings │ │ │ ├── fr.lproj/ │ │ │ │ └── LTHPasscodeViewController.strings │ │ │ ├── ja.lproj/ │ │ │ │ └── LTHPasscodeViewController.strings │ │ │ ├── ro.lproj/ │ │ │ │ └── LTHPasscodeViewController.strings │ │ │ ├── ru.lproj/ │ │ │ │ └── LTHPasscodeViewController.strings │ │ │ ├── zh-Hans-CN.lproj/ │ │ │ │ └── LTHPasscodeViewController.strings │ │ │ └── zh-Hant.lproj/ │ │ │ └── LTHPasscodeViewController.strings │ │ ├── MySocketRocketExtras/ │ │ │ ├── SRWebSocket+Helpers.h │ │ │ └── SRWebSocket+Helpers.m │ │ ├── NSDate-Extensions/ │ │ │ ├── NSDate-Utilities.h │ │ │ └── NSDate-Utilities.m │ │ ├── QRCodeEncoderObjectiveCAtGithub/ │ │ │ ├── DataMatrix.h │ │ │ ├── DataMatrix.mm │ │ │ ├── QRCodeEncoderDemoViewController.h │ │ │ ├── QRCodeEncoderDemoViewController.mm │ │ │ ├── QRCodeEncoderObjectiveCAtGithub-Prefix.pch │ │ │ ├── QREncoder-Prefix.pch │ │ │ ├── QREncoder.h │ │ │ ├── QREncoder.mm │ │ │ ├── QR_Encode.cpp │ │ │ └── QR_Encode.h │ │ ├── SocketRocket/ │ │ │ ├── NSData+SRB64Additions.h │ │ │ ├── NSData+SRB64Additions.m │ │ │ ├── SRWebSocket.h │ │ │ ├── SRWebSocket.m │ │ │ ├── SocketRocket-Prefix.pch │ │ │ ├── base64.c │ │ │ └── base64.h │ │ ├── TLCloudDocumentSyncWrapper/ │ │ │ ├── TLCloudDocumentSyncWrapper.h │ │ │ └── TLCloudDocumentSyncWrapper.m │ │ ├── UIAlertController+Blocks/ │ │ │ ├── UIAlertConrtoller+Blocks.m │ │ │ └── UIAlertController+Blocks.h │ │ ├── UINavigationBar-FixedHeightWhenStatusBarHidden-master/ │ │ │ ├── UINavigationBar+FixedHeightWhenStatusBarHidden.h │ │ │ └── UINavigationBar+FixedHeightWhenStatusBarHidden.m │ │ ├── iToast/ │ │ │ ├── iToast.h │ │ │ └── iToast.m │ │ └── socket.io-client-swift-10.0.0/ │ │ └── Source/ │ │ ├── SSLSecurity.swift │ │ ├── SocketAckEmitter.swift │ │ ├── SocketAckManager.swift │ │ ├── SocketAnyEvent.swift │ │ ├── SocketClientManager.swift │ │ ├── SocketEngine.swift │ │ ├── SocketEngineClient.swift │ │ ├── SocketEnginePacketType.swift │ │ ├── SocketEnginePollable.swift │ │ ├── SocketEngineSpec.swift │ │ ├── SocketEngineWebsocket.swift │ │ ├── SocketEventHandler.swift │ │ ├── SocketExtensions.swift │ │ ├── SocketIOClient.swift │ │ ├── SocketIOClientConfiguration.swift │ │ ├── SocketIOClientOption.swift │ │ ├── SocketIOClientSpec.swift │ │ ├── SocketIOClientStatus.swift │ │ ├── SocketLogger.swift │ │ ├── SocketPacket.swift │ │ ├── SocketParsable.swift │ │ ├── SocketStringReader.swift │ │ ├── SocketTypes.swift │ │ └── WebSocket.swift │ ├── Images.xcassets/ │ │ ├── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── home3.imageset/ │ │ │ └── Contents.json │ │ ├── lifebuoy.imageset/ │ │ │ └── Contents.json │ │ ├── link.imageset/ │ │ │ └── Contents.json │ │ ├── twitter.imageset/ │ │ │ └── Contents.json │ │ └── vault.imageset/ │ │ └── Contents.json │ ├── InAppSettings.bundle/ │ │ ├── Advanced.plist │ │ ├── Root.plist │ │ ├── de.lproj/ │ │ │ └── Root.strings │ │ ├── en.lproj/ │ │ │ └── Root.strings │ │ ├── es.lproj/ │ │ │ └── Root.strings │ │ ├── ru.lproj/ │ │ │ └── Root.strings │ │ ├── zh-Hans-CN.lproj/ │ │ │ └── Root.strings │ │ └── zh-Hant.lproj/ │ │ └── Root.strings │ ├── Info.plist │ ├── de.lproj/ │ │ └── Localizable.strings │ ├── es.lproj/ │ │ └── Localizable.strings │ ├── model/ │ │ ├── TLAccountObject.swift │ │ ├── TLAccounts.swift │ │ ├── TLAchievements.swift │ │ ├── TLAnalytics.swift │ │ ├── TLBlockchainStatus.swift │ │ ├── TLCoin.swift │ │ ├── TLColdWallet.swift │ │ ├── TLCoreBitcoinWrapper.swift │ │ ├── TLCrypto.swift │ │ ├── TLCurrencyFormat.swift │ │ ├── TLDisplayStrings.swift │ │ ├── TLHDWalletWrapper.swift │ │ ├── TLHelpDoc.swift │ │ ├── TLImportedAddress.swift │ │ ├── TLImportedAddresses.swift │ │ ├── TLOperationsManager.swift │ │ ├── TLPreferences.swift │ │ ├── TLSelectedObject.swift │ │ ├── TLSendFormData.swift │ │ ├── TLSpaghettiGodSend.swift │ │ ├── TLStealthAddress.swift │ │ ├── TLStealthWallet.swift │ │ ├── TLSuggestions.swift │ │ ├── TLTxObject.swift │ │ ├── TLWallet+Stealth.swift │ │ ├── TLWallet.swift │ │ ├── TLWalletConfig.swift │ │ ├── TLWalletJSONKeys.swift │ │ ├── TLWalletJson.swift │ │ ├── TLWalletPassphrase.swift │ │ └── TLWalletUtils.swift │ ├── ru.lproj/ │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── utils/ │ │ ├── TLColors.swift │ │ ├── TLHUDWrapper.swift │ │ ├── TLMacros.swift │ │ ├── TLNotificationEvents.swift │ │ ├── TLPrompts.swift │ │ ├── TLQRImageModal.swift │ │ ├── TLStringLocalized.swift │ │ ├── TLUpdateAppData.swift │ │ ├── TLUtils.swift │ │ ├── TransitionDelegate.swift │ │ ├── UINavigationController+StatusBarStyle.swift │ │ ├── UIView+FormScroll.swift │ │ ├── UIViewController+Extras.swift │ │ └── UIViewController+Style.swift │ ├── viewControllers/ │ │ ├── TLAccountTableViewCell.swift │ │ ├── TLAccountsViewController.swift │ │ ├── TLAchievementsViewController.swift │ │ ├── TLAddressBookViewController.swift │ │ ├── TLAddressListViewController.swift │ │ ├── TLAddressTableViewCell.swift │ │ ├── TLAuthorizeColdWalletPaymentViewController.swift │ │ ├── TLBrainWalletViewController.swift │ │ ├── TLColdWalletViewController.swift │ │ ├── TLCreateColdWalletViewController.swift │ │ ├── TLHelpViewController.swift │ │ ├── TLHistoryViewController.swift │ │ ├── TLInstructionsViewController.swift │ │ ├── TLLinksViewController.swift │ │ ├── TLManageAccountsViewController.swift │ │ ├── TLMenuViewController.swift │ │ ├── TLPassPhraseViewController.swift │ │ ├── TLPreloadViewController.swift │ │ ├── TLQRCodeScannerViewController.swift │ │ ├── TLReceiveViewController.swift │ │ ├── TLRestoreWalletViewController.swift │ │ ├── TLReviewPaymentViewController.swift │ │ ├── TLSendViewController.swift │ │ ├── TLSettingsViewController.swift │ │ ├── TLTextViewViewController.swift │ │ ├── TLTransactionTableViewCell.swift │ │ ├── TransparentViewController.swift │ │ └── tableViewCells/ │ │ ├── createColdWalletTableViewCells/ │ │ │ ├── TLAdvancedNewWalletTableViewCell.swift │ │ │ ├── TLColdWalletSelectWayTableViewCell.swift │ │ │ └── TLNewWalletTableViewCell.swift │ │ ├── spendColdWalletTableViewCells/ │ │ │ ├── TLInputColdWalletKeyTableViewCell.swift │ │ │ ├── TLPassSignedTxTableViewCell.swift │ │ │ └── TLScanUnsignedTxTableViewCell.swift │ │ └── walletTableViewCells/ │ │ ├── TLAccountTableViewCell.swift │ │ ├── TLAddressTableViewCell.swift │ │ └── TLTransactionTableViewCell.swift │ ├── zh-Hans-CN.lproj/ │ │ └── Localizable.strings │ └── zh-Hant.lproj/ │ ├── LaunchScreen.strings │ ├── Localizable.strings │ └── Main.strings ├── ArcBit.xcodeproj/ │ ├── project.pbxproj │ └── project.xcworkspace/ │ └── contents.xcworkspacedata ├── ArcBit.xcworkspace/ │ └── contents.xcworkspacedata ├── ArcBitTests/ │ ├── ArcBitTests-Bridging-Header.h │ ├── ArcBitTests.swift │ ├── BreadWalletTests.m │ └── Info.plist ├── Podfile ├── Pods/ │ ├── AFNetworking/ │ │ ├── AFNetworking/ │ │ │ ├── AFHTTPRequestOperation.h │ │ │ ├── AFHTTPRequestOperation.m │ │ │ ├── AFHTTPRequestOperationManager.h │ │ │ ├── AFHTTPRequestOperationManager.m │ │ │ ├── AFHTTPSessionManager.h │ │ │ ├── AFHTTPSessionManager.m │ │ │ ├── AFNetworkReachabilityManager.h │ │ │ ├── AFNetworkReachabilityManager.m │ │ │ ├── AFNetworking.h │ │ │ ├── AFSecurityPolicy.h │ │ │ ├── AFSecurityPolicy.m │ │ │ ├── AFURLConnectionOperation.h │ │ │ ├── AFURLConnectionOperation.m │ │ │ ├── AFURLRequestSerialization.h │ │ │ ├── AFURLRequestSerialization.m │ │ │ ├── AFURLResponseSerialization.h │ │ │ ├── AFURLResponseSerialization.m │ │ │ ├── AFURLSessionManager.h │ │ │ └── AFURLSessionManager.m │ │ ├── LICENSE │ │ ├── README.md │ │ └── UIKit+AFNetworking/ │ │ ├── AFNetworkActivityIndicatorManager.h │ │ ├── AFNetworkActivityIndicatorManager.m │ │ ├── UIActivityIndicatorView+AFNetworking.h │ │ ├── UIActivityIndicatorView+AFNetworking.m │ │ ├── UIAlertView+AFNetworking.h │ │ ├── UIAlertView+AFNetworking.m │ │ ├── UIButton+AFNetworking.h │ │ ├── UIButton+AFNetworking.m │ │ ├── UIImageView+AFNetworking.h │ │ ├── UIImageView+AFNetworking.m │ │ ├── UIKit+AFNetworking.h │ │ ├── UIProgressView+AFNetworking.h │ │ ├── UIProgressView+AFNetworking.m │ │ ├── UIRefreshControl+AFNetworking.h │ │ ├── UIRefreshControl+AFNetworking.m │ │ ├── UIWebView+AFNetworking.h │ │ └── UIWebView+AFNetworking.m │ ├── CoreBitcoin/ │ │ ├── CoreBitcoin/ │ │ │ ├── BTC256.h │ │ │ ├── BTC256.m │ │ │ ├── BTCAddress.h │ │ │ ├── BTCAddress.m │ │ │ ├── BTCAddressSubclass.h │ │ │ ├── BTCAssetAddress.h │ │ │ ├── BTCAssetAddress.m │ │ │ ├── BTCAssetID.h │ │ │ ├── BTCAssetID.m │ │ │ ├── BTCAssetType.h │ │ │ ├── BTCAssetType.m │ │ │ ├── BTCBase58.h │ │ │ ├── BTCBase58.m │ │ │ ├── BTCBigNumber.h │ │ │ ├── BTCBigNumber.m │ │ │ ├── BTCBitcoinURL.h │ │ │ ├── BTCBitcoinURL.m │ │ │ ├── BTCBlindSignature.h │ │ │ ├── BTCBlindSignature.m │ │ │ ├── BTCBlock.h │ │ │ ├── BTCBlock.m │ │ │ ├── BTCBlockHeader.h │ │ │ ├── BTCBlockHeader.m │ │ │ ├── BTCBlockchainInfo.h │ │ │ ├── BTCBlockchainInfo.m │ │ │ ├── BTCChainCom.h │ │ │ ├── BTCChainCom.m │ │ │ ├── BTCCurrencyConverter.h │ │ │ ├── BTCCurrencyConverter.m │ │ │ ├── BTCCurvePoint.h │ │ │ ├── BTCCurvePoint.m │ │ │ ├── BTCData.h │ │ │ ├── BTCData.m │ │ │ ├── BTCEncryptedBackup.h │ │ │ ├── BTCEncryptedBackup.m │ │ │ ├── BTCEncryptedMessage.h │ │ │ ├── BTCEncryptedMessage.m │ │ │ ├── BTCErrors.h │ │ │ ├── BTCErrors.m │ │ │ ├── BTCFancyEncryptedMessage.h │ │ │ ├── BTCFancyEncryptedMessage.m │ │ │ ├── BTCHashID.h │ │ │ ├── BTCHashID.m │ │ │ ├── BTCKey.h │ │ │ ├── BTCKey.m │ │ │ ├── BTCKeychain.h │ │ │ ├── BTCKeychain.m │ │ │ ├── BTCMerkleTree.h │ │ │ ├── BTCMerkleTree.m │ │ │ ├── BTCMnemonic.h │ │ │ ├── BTCMnemonic.m │ │ │ ├── BTCNetwork.h │ │ │ ├── BTCNetwork.m │ │ │ ├── BTCNumberFormatter.h │ │ │ ├── BTCNumberFormatter.m │ │ │ ├── BTCOpcode.h │ │ │ ├── BTCOpcode.m │ │ │ ├── BTCOutpoint.h │ │ │ ├── BTCOutpoint.m │ │ │ ├── BTCPaymentMethod.h │ │ │ ├── BTCPaymentMethod.m │ │ │ ├── BTCPaymentMethodDetails.h │ │ │ ├── BTCPaymentMethodDetails.m │ │ │ ├── BTCPaymentMethodRequest.h │ │ │ ├── BTCPaymentMethodRequest.m │ │ │ ├── BTCPaymentProtocol.h │ │ │ ├── BTCPaymentProtocol.m │ │ │ ├── BTCPaymentRequest.h │ │ │ ├── BTCPaymentRequest.m │ │ │ ├── BTCPriceSource.h │ │ │ ├── BTCPriceSource.m │ │ │ ├── BTCProcessor.h │ │ │ ├── BTCProcessor.m │ │ │ ├── BTCProtocolBuffers.h │ │ │ ├── BTCProtocolBuffers.m │ │ │ ├── BTCProtocolSerialization.h │ │ │ ├── BTCProtocolSerialization.m │ │ │ ├── BTCQRCode.h │ │ │ ├── BTCQRCode.m │ │ │ ├── BTCScript.h │ │ │ ├── BTCScript.m │ │ │ ├── BTCScriptMachine.h │ │ │ ├── BTCScriptMachine.m │ │ │ ├── BTCSecretSharing.h │ │ │ ├── BTCSecretSharing.m │ │ │ ├── BTCSignatureHashType.h │ │ │ ├── BTCTransaction.h │ │ │ ├── BTCTransaction.m │ │ │ ├── BTCTransactionBuilder.h │ │ │ ├── BTCTransactionBuilder.m │ │ │ ├── BTCTransactionInput.h │ │ │ ├── BTCTransactionInput.m │ │ │ ├── BTCTransactionOutput.h │ │ │ ├── BTCTransactionOutput.m │ │ │ ├── BTCUnitsAndLimits.h │ │ │ ├── CoreBitcoin+Categories.h │ │ │ ├── CoreBitcoin.h │ │ │ ├── NS+BTCBase58.h │ │ │ ├── NS+BTCBase58.m │ │ │ ├── NSData+BTCData.h │ │ │ ├── NSData+BTCData.m │ │ │ └── SwiftBridgingHeader.h │ │ ├── LICENSE.txt │ │ └── README.md │ ├── Crashlytics/ │ │ ├── Crashlytics.framework/ │ │ │ ├── README │ │ │ └── submit │ │ ├── README.md │ │ ├── iOS/ │ │ │ └── Crashlytics.framework/ │ │ │ ├── Crashlytics │ │ │ ├── Headers/ │ │ │ │ ├── ANSCompatibility.h │ │ │ │ ├── Answers.h │ │ │ │ ├── CLSAttributes.h │ │ │ │ ├── CLSLogging.h │ │ │ │ ├── CLSReport.h │ │ │ │ ├── CLSStackFrame.h │ │ │ │ └── Crashlytics.h │ │ │ ├── Info.plist │ │ │ ├── Modules/ │ │ │ │ └── module.modulemap │ │ │ ├── run │ │ │ ├── submit │ │ │ └── uploadDSYM │ │ └── submit │ ├── ECSlidingViewController/ │ │ ├── ECSlidingViewController/ │ │ │ ├── ECPercentDrivenInteractiveTransition.h │ │ │ ├── ECPercentDrivenInteractiveTransition.m │ │ │ ├── ECSlidingAnimationController.h │ │ │ ├── ECSlidingAnimationController.m │ │ │ ├── ECSlidingConstants.h │ │ │ ├── ECSlidingInteractiveTransition.h │ │ │ ├── ECSlidingInteractiveTransition.m │ │ │ ├── ECSlidingSegue.h │ │ │ ├── ECSlidingSegue.m │ │ │ ├── ECSlidingViewController.h │ │ │ ├── ECSlidingViewController.m │ │ │ ├── UIViewController+ECSlidingViewController.h │ │ │ └── UIViewController+ECSlidingViewController.m │ │ ├── LICENSE │ │ └── README.md │ ├── Fabric/ │ │ ├── Fabric.framework/ │ │ │ ├── README │ │ │ └── run │ │ ├── README.md │ │ ├── iOS/ │ │ │ └── Fabric.framework/ │ │ │ ├── Fabric │ │ │ ├── Headers/ │ │ │ │ ├── FABAttributes.h │ │ │ │ └── Fabric.h │ │ │ ├── Info.plist │ │ │ ├── Modules/ │ │ │ │ └── module.modulemap │ │ │ ├── run │ │ │ └── uploadDSYM │ │ ├── run │ │ ├── upload-symbols │ │ └── uploadDSYM │ ├── ISO8601DateFormatter/ │ │ ├── ISO8601DateFormatter.h │ │ ├── ISO8601DateFormatter.m │ │ ├── LICENSE.txt │ │ └── README.md │ ├── Local Podspecs/ │ │ └── CoreBitcoin.podspec.json │ ├── MBProgressHUD/ │ │ ├── LICENSE │ │ ├── MBProgressHUD.h │ │ ├── MBProgressHUD.m │ │ └── README.mdown │ ├── OpenSSL-Universal/ │ │ ├── LICENSE.txt │ │ ├── README.md │ │ ├── include-ios/ │ │ │ └── openssl/ │ │ │ ├── aes.h │ │ │ ├── asn1.h │ │ │ ├── asn1_mac.h │ │ │ ├── asn1t.h │ │ │ ├── bio.h │ │ │ ├── blowfish.h │ │ │ ├── bn.h │ │ │ ├── buffer.h │ │ │ ├── camellia.h │ │ │ ├── cast.h │ │ │ ├── cmac.h │ │ │ ├── cms.h │ │ │ ├── comp.h │ │ │ ├── conf.h │ │ │ ├── conf_api.h │ │ │ ├── crypto.h │ │ │ ├── des.h │ │ │ ├── des_old.h │ │ │ ├── dh.h │ │ │ ├── dsa.h │ │ │ ├── dso.h │ │ │ ├── dtls1.h │ │ │ ├── e_os2.h │ │ │ ├── ebcdic.h │ │ │ ├── ec.h │ │ │ ├── ecdh.h │ │ │ ├── ecdsa.h │ │ │ ├── engine.h │ │ │ ├── err.h │ │ │ ├── evp.h │ │ │ ├── hmac.h │ │ │ ├── idea.h │ │ │ ├── krb5_asn.h │ │ │ ├── kssl.h │ │ │ ├── lhash.h │ │ │ ├── md4.h │ │ │ ├── md5.h │ │ │ ├── mdc2.h │ │ │ ├── modes.h │ │ │ ├── obj_mac.h │ │ │ ├── objects.h │ │ │ ├── ocsp.h │ │ │ ├── opensslconf.h │ │ │ ├── opensslv.h │ │ │ ├── ossl_typ.h │ │ │ ├── pem.h │ │ │ ├── pem2.h │ │ │ ├── pkcs12.h │ │ │ ├── pkcs7.h │ │ │ ├── pqueue.h │ │ │ ├── rand.h │ │ │ ├── rc2.h │ │ │ ├── rc4.h │ │ │ ├── ripemd.h │ │ │ ├── rsa.h │ │ │ ├── safestack.h │ │ │ ├── seed.h │ │ │ ├── sha.h │ │ │ ├── srp.h │ │ │ ├── srtp.h │ │ │ ├── ssl.h │ │ │ ├── ssl2.h │ │ │ ├── ssl23.h │ │ │ ├── ssl3.h │ │ │ ├── stack.h │ │ │ ├── symhacks.h │ │ │ ├── tls1.h │ │ │ ├── ts.h │ │ │ ├── txt_db.h │ │ │ ├── ui.h │ │ │ ├── ui_compat.h │ │ │ ├── whrlpool.h │ │ │ ├── x509.h │ │ │ ├── x509_vfy.h │ │ │ └── x509v3.h │ │ └── lib-ios/ │ │ ├── libcrypto.a │ │ └── libssl.a │ ├── Pods.xcodeproj/ │ │ └── project.pbxproj │ ├── RNCryptor/ │ │ ├── README.md │ │ └── RNCryptor/ │ │ ├── RNCryptor+Private.h │ │ ├── RNCryptor.h │ │ ├── RNCryptor.m │ │ ├── RNCryptorEngine.h │ │ ├── RNCryptorEngine.m │ │ ├── RNDecryptor.h │ │ ├── RNDecryptor.m │ │ ├── RNEncryptor.h │ │ ├── RNEncryptor.m │ │ ├── RNOpenSSLCryptor.h │ │ ├── RNOpenSSLCryptor.m │ │ ├── RNOpenSSLDecryptor.h │ │ ├── RNOpenSSLDecryptor.m │ │ ├── RNOpenSSLEncryptor.h │ │ └── RNOpenSSLEncryptor.m │ ├── SwiftTryCatch/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── SwiftTryCatch.h │ │ └── SwiftTryCatch.m │ ├── Target Support Files/ │ │ ├── AFNetworking/ │ │ │ ├── AFNetworking-dummy.m │ │ │ ├── AFNetworking-prefix.pch │ │ │ └── AFNetworking.xcconfig │ │ ├── CoreBitcoin/ │ │ │ ├── CoreBitcoin-dummy.m │ │ │ ├── CoreBitcoin-prefix.pch │ │ │ └── CoreBitcoin.xcconfig │ │ ├── ECSlidingViewController/ │ │ │ ├── ECSlidingViewController-dummy.m │ │ │ ├── ECSlidingViewController-prefix.pch │ │ │ └── ECSlidingViewController.xcconfig │ │ ├── ISO8601DateFormatter/ │ │ │ ├── ISO8601DateFormatter-dummy.m │ │ │ ├── ISO8601DateFormatter-prefix.pch │ │ │ └── ISO8601DateFormatter.xcconfig │ │ ├── MBProgressHUD/ │ │ │ ├── MBProgressHUD-dummy.m │ │ │ ├── MBProgressHUD-prefix.pch │ │ │ └── MBProgressHUD.xcconfig │ │ ├── Pods-ArcBit/ │ │ │ ├── Pods-ArcBit-acknowledgements.markdown │ │ │ ├── Pods-ArcBit-acknowledgements.plist │ │ │ ├── Pods-ArcBit-dummy.m │ │ │ ├── Pods-ArcBit-frameworks.sh │ │ │ ├── Pods-ArcBit-resources.sh │ │ │ ├── Pods-ArcBit.debug.xcconfig │ │ │ └── Pods-ArcBit.release.xcconfig │ │ ├── Pods-ArcBitTests/ │ │ │ ├── Pods-ArcBitTests-acknowledgements.markdown │ │ │ ├── Pods-ArcBitTests-acknowledgements.plist │ │ │ ├── Pods-ArcBitTests-dummy.m │ │ │ ├── Pods-ArcBitTests-frameworks.sh │ │ │ ├── Pods-ArcBitTests-resources.sh │ │ │ ├── Pods-ArcBitTests.debug.xcconfig │ │ │ └── Pods-ArcBitTests.release.xcconfig │ │ ├── RNCryptor/ │ │ │ ├── RNCryptor-dummy.m │ │ │ ├── RNCryptor-prefix.pch │ │ │ └── RNCryptor.xcconfig │ │ ├── SwiftTryCatch/ │ │ │ ├── SwiftTryCatch-dummy.m │ │ │ ├── SwiftTryCatch-prefix.pch │ │ │ └── SwiftTryCatch.xcconfig │ │ └── iCloudDocumentSync/ │ │ ├── iCloudDocumentSync-dummy.m │ │ ├── iCloudDocumentSync-prefix.pch │ │ └── iCloudDocumentSync.xcconfig │ └── iCloudDocumentSync/ │ ├── LICENSE.md │ ├── README.md │ └── iCloud/ │ ├── iCloud-Prefix.pch │ ├── iCloud.h │ ├── iCloud.m │ ├── iCloudDocument.h │ └── iCloudDocument.m └── README.md
SYMBOL INDEX (481 symbols across 78 files)
FILE: ArcBit/External/LTHPasscodeViewController3.50/LTHKeychainUtils.h
function interface (line 35) | interface LTHKeychainUtils : NSObject {
FILE: ArcBit/External/QRCodeEncoderObjectiveCAtGithub/DataMatrix.h
function interface (line 6) | interface DataMatrix : NSObject {
FILE: ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QRCodeEncoderDemoViewController.h
function interface (line 11) | interface QRCodeEncoderDemoViewController : UIViewController {
FILE: ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QREncoder.h
function interface (line 22) | interface QREncoder : NSObject {
FILE: ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QR_Encode.cpp
function min (line 601) | int min(int a, int b) {
function BYTE (line 1348) | BYTE CQR_Encode::AlphabetToBinaly(unsigned char c)
function WORD (line 1380) | WORD CQR_Encode::KanjiToBinaly(WORD wc)
FILE: ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QR_Encode.h
type RS_BLOCKINFO (line 42) | typedef struct tagRS_BLOCKINFO
type QR_VERSIONINFO (line 54) | typedef struct tagQR_VERSIONINFO
type WORD (line 70) | typedef unsigned short WORD;
type BYTE (line 72) | typedef unsigned char BYTE;
type BYTE (line 74) | typedef BYTE* LPBYTE;
function class (line 81) | class CQR_Encode
FILE: ArcBit/External/SocketRocket/SRWebSocket.h
type SRReadyState (line 20) | typedef enum {
FILE: ArcBit/External/SocketRocket/base64.c
function b64_ntop (line 132) | int
function b64_pton (line 195) | int
FILE: ArcBit/External/iToast/iToast.h
type iToastGravity (line 31) | typedef enum iToastGravity {
type iToastDuration (line 37) | enum iToastDuration {
type iToastType (line 43) | typedef enum iToastType {
type iToastImageLocation (line 51) | typedef enum {
function interface (line 59) | interface iToast : NSObject {
FILE: Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h
type AFSSLPinningModeNone (line 26) | typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
FILE: Pods/CoreBitcoin/CoreBitcoin/BTC256.h
type private_BTC160 (line 26) | struct private_BTC160
type BTC160 (line 31) | typedef struct private_BTC160 BTC160;
type private_BTC256 (line 33) | struct private_BTC256
type BTC256 (line 39) | typedef struct private_BTC256 BTC256;
type private_BTC512 (line 41) | struct private_BTC512
type BTC512 (line 47) | typedef struct private_BTC512 BTC512;
FILE: Pods/CoreBitcoin/CoreBitcoin/BTCProcessor.h
type BTCProcessorErrorDuplicateBlock (line 12) | typedef NS_ENUM(NSUInteger, BTCProcessorError) {
FILE: Pods/CoreBitcoin/CoreBitcoin/BTCUnitsAndLimits.h
type BTCAmount (line 9) | typedef int64_t BTCAmount;
type BTCSatoshi (line 15) | typedef int64_t BTCSatoshi
FILE: Pods/ECSlidingViewController/ECSlidingViewController/ECSlidingConstants.h
type ECSlidingViewControllerOperationNone (line 45) | typedef NS_ENUM(NSInteger, ECSlidingViewControllerOperation) {
type ECSlidingViewControllerTopViewPositionAnchoredLeft (line 61) | typedef NS_ENUM(NSInteger, ECSlidingViewControllerTopViewPosition) {
FILE: Pods/ISO8601DateFormatter/ISO8601DateFormatter.h
type ISO8601DateFormatCalendar (line 18) | typedef NS_ENUM(NSUInteger, ISO8601DateFormat) {
function interface (line 48) | interface ISO8601DateFormatter: NSFormatter
FILE: Pods/MBProgressHUD/MBProgressHUD.h
type MBProgressHUDModeIndeterminate (line 36) | typedef NS_ENUM(NSInteger, MBProgressHUDMode) {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/aes.h
type aes_key_st (line 78) | struct aes_key_st {
type AES_KEY (line 86) | typedef struct aes_key_st AES_KEY;
FILE: Pods/OpenSSL-Universal/include-ios/openssl/asn1.h
type X509_algor_st (line 161) | struct X509_algor_st
type ASN1_CTX (line 172) | typedef struct asn1_ctx_st {
type ASN1_const_CTX (line 187) | typedef struct asn1_const_ctx_st {
type ASN1_OBJECT (line 210) | typedef struct asn1_object_st {
type asn1_string_st (line 239) | struct asn1_string_st {
type ASN1_ENCODING (line 257) | typedef struct ASN1_ENCODING_st {
type ASN1_STRING_TABLE (line 272) | typedef struct asn1_string_table_st {
type ASN1_TEMPLATE (line 296) | typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE;
type ASN1_TLC (line 297) | typedef struct ASN1_TLC_st ASN1_TLC;
type ASN1_VALUE (line 299) | typedef struct ASN1_VALUE_st ASN1_VALUE;
type ASN1_ITEM (line 404) | typedef const ASN1_ITEM ASN1_ITEM_EXP;
type ASN1_ITEM (line 425) | typedef const ASN1_ITEM *ASN1_ITEM_EXP (void);
function DECLARE_ASN1_SET_OF (line 519) | DECLARE_STACK_OF(ASN1_INTEGER)
function DECLARE_ASN1_SET_OF (line 555) | DECLARE_STACK_OF(ASN1_TYPE)
FILE: Pods/OpenSSL-Universal/include-ios/openssl/asn1t.h
type ASN1_TEMPLATE_st (line 443) | struct ASN1_TEMPLATE_st {
type ASN1_ADB_TABLE (line 458) | typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE;
type ASN1_ADB (line 459) | typedef struct ASN1_ADB_st ASN1_ADB;
type ASN1_ADB_st (line 461) | struct ASN1_ADB_st {
type ASN1_ADB_TABLE_st (line 471) | struct ASN1_ADB_TABLE_st {
type ASN1_ITEM_st (line 563) | struct ASN1_ITEM_st {
type ASN1_TLC_st (line 641) | struct ASN1_TLC_st {
type ASN1_VALUE (line 652) | typedef ASN1_VALUE *ASN1_new_func(void);
type ASN1_VALUE (line 654) | typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in,
type ASN1_COMPAT_FUNCS (line 680) | typedef struct ASN1_COMPAT_FUNCS_st {
type ASN1_EXTERN_FUNCS (line 687) | typedef struct ASN1_EXTERN_FUNCS_st {
type ASN1_PRIMITIVE_FUNCS (line 697) | typedef struct ASN1_PRIMITIVE_FUNCS_st {
type ASN1_AUX (line 724) | typedef struct ASN1_AUX_st {
type ASN1_PRINT_ARG (line 734) | typedef struct ASN1_PRINT_ARG_st {
type ASN1_STREAM_ARG (line 741) | typedef struct ASN1_STREAM_ARG_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/bio.h
type BIO (line 237) | typedef struct bio_st BIO;
type bio_st (line 297) | struct bio_st
type bio_st (line 300) | struct bio_st
type bio_st (line 308) | struct bio_st
type BIO_METHOD (line 311) | typedef struct bio_method_st {
type bio_st (line 324) | struct bio_st {
type bio_f_buffer_ctx_struct (line 345) | struct bio_f_buffer_ctx_struct {
type bio_dgram_sctp_sndinfo (line 374) | struct bio_dgram_sctp_sndinfo {
type bio_dgram_sctp_rcvinfo (line 381) | struct bio_dgram_sctp_rcvinfo {
type bio_dgram_sctp_prinfo (line 391) | struct bio_dgram_sctp_prinfo {
type bio_st (line 665) | struct bio_st
type hostent (line 728) | struct hostent
FILE: Pods/OpenSSL-Universal/include-ios/openssl/blowfish.h
type BF_KEY (line 101) | typedef struct bf_key_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/bn.h
type BIGNUM (line 321) | typedef struct bignum_st BIGNUM;
type BN_CTX (line 323) | typedef struct bignum_ctx BN_CTX;
type BN_BLINDING (line 324) | typedef struct bn_blinding_st BN_BLINDING;
type BN_MONT_CTX (line 325) | typedef struct bn_mont_ctx_st BN_MONT_CTX;
type BN_RECP_CTX (line 326) | typedef struct bn_recp_ctx_st BN_RECP_CTX;
type BN_GENCB (line 327) | typedef struct bn_gencb_st BN_GENCB;
type bignum_st (line 330) | struct bignum_st {
type bn_mont_ctx_st (line 341) | struct bn_mont_ctx_st {
type bn_recp_ctx_st (line 357) | struct bn_recp_ctx_st {
type bn_gencb_st (line 366) | struct bn_gencb_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/buffer.h
type buf_mem_st (line 77) | struct buf_mem_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/camellia.h
type camellia_key_st (line 84) | struct camellia_key_st {
type CAMELLIA_KEY (line 91) | typedef struct camellia_key_st CAMELLIA_KEY;
FILE: Pods/OpenSSL-Universal/include-ios/openssl/cast.h
type CAST_KEY (line 80) | typedef struct cast_key_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/cmac.h
type CMAC_CTX (line 65) | typedef struct CMAC_CTX_st CMAC_CTX;
FILE: Pods/OpenSSL-Universal/include-ios/openssl/cms.h
type CMS_ContentInfo (line 68) | typedef struct CMS_ContentInfo_st CMS_ContentInfo;
type CMS_SignerInfo (line 69) | typedef struct CMS_SignerInfo_st CMS_SignerInfo;
type CMS_CertificateChoices (line 70) | typedef struct CMS_CertificateChoices CMS_CertificateChoices;
type CMS_RevocationInfoChoice (line 71) | typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice;
type CMS_RecipientInfo (line 72) | typedef struct CMS_RecipientInfo_st CMS_RecipientInfo;
type CMS_ReceiptRequest (line 73) | typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest;
type CMS_Receipt (line 74) | typedef struct CMS_Receipt_st CMS_Receipt;
FILE: Pods/OpenSSL-Universal/include-ios/openssl/comp.h
type COMP_CTX (line 11) | typedef struct comp_ctx_st COMP_CTX;
type COMP_METHOD (line 13) | typedef struct comp_method_st {
type comp_ctx_st (line 31) | struct comp_ctx_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/conf.h
type CONF_VALUE (line 74) | typedef struct {
type conf_st (line 83) | struct conf_st
type conf_method_st (line 84) | struct conf_method_st
type CONF_METHOD (line 85) | typedef struct conf_method_st CONF_METHOD;
type conf_method_st (line 87) | struct conf_method_st {
type CONF_IMODULE (line 102) | typedef struct conf_imodule_st CONF_IMODULE;
type CONF_MODULE (line 103) | typedef struct conf_module_st CONF_MODULE;
type conf_st (line 147) | struct conf_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/crypto.h
type CRYPTO_EX_DATA (line 162) | typedef struct crypto_ex_data_st CRYPTO_EX_DATA;
type OPENSSL_ITEM (line 175) | typedef struct openssl_item_st {
type CRYPTO_dynlock (line 262) | typedef struct {
type BIO_dummy (line 290) | typedef struct bio_st BIO_dummy;
type crypto_ex_data_st (line 292) | struct crypto_ex_data_st {
type crypto_ex_data_func_st (line 304) | struct crypto_ex_data_func_st {
type CRYPTO_EX_DATA_IMPL (line 402) | typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL;
type CRYPTO_THREADID (line 448) | typedef struct crypto_threadid_st {
type CRYPTO_dynlock_value (line 473) | struct CRYPTO_dynlock_value
type CRYPTO_dynlock_value (line 474) | struct CRYPTO_dynlock_value
type CRYPTO_dynlock_value (line 480) | struct CRYPTO_dynlock_value
type CRYPTO_dynlock_value (line 483) | struct CRYPTO_dynlock_value
type CRYPTO_dynlock_value (line 485) | struct CRYPTO_dynlock_value
type CRYPTO_dynlock_value (line 488) | struct CRYPTO_dynlock_value
type CRYPTO_dynlock_value (line 491) | struct CRYPTO_dynlock_value
type bio_st (line 583) | struct bio_st
FILE: Pods/OpenSSL-Universal/include-ios/openssl/des.h
type DES_key_schedule (line 85) | typedef struct DES_ks {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/des_old.h
type _ossl_old_des_ks_struct (line 126) | struct _ossl_old_des_ks_struct {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/dh.h
type dh_method (line 117) | struct dh_method {
type dh_st (line 135) | struct dh_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/dsa.h
type DSA_SIG (line 124) | typedef struct DSA_SIG_st {
type dsa_method (line 129) | struct dsa_method {
type dsa_st (line 155) | struct dsa_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/dso.h
type DSO (line 112) | typedef struct dso_st DSO;
type DSO_METHOD (line 140) | typedef struct dso_meth_st {
type dso_st (line 194) | struct dso_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/dtls1.h
type DTLS1_BITMAP (line 124) | typedef struct dtls1_bitmap_st {
type dtls1_retransmit_state (line 131) | struct dtls1_retransmit_state {
type hm_header_st (line 143) | struct hm_header_st {
type ccs_header_st (line 153) | struct ccs_header_st {
type dtls1_timeout_st (line 158) | struct dtls1_timeout_st {
type record_pqueue (line 167) | typedef struct record_pqueue_st {
type hm_fragment (line 172) | typedef struct hm_fragment_st {
type DTLS1_STATE (line 178) | typedef struct dtls1_state_st {
type DTLS1_RECORD_DATA (line 247) | typedef struct dtls1_record_data_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ec.h
type point_conversion_form_t (line 105) | typedef enum {
type EC_METHOD (line 116) | typedef struct ec_method_st EC_METHOD;
type EC_GROUP (line 118) | typedef struct ec_group_st
type EC_POINT (line 129) | typedef struct ec_point_st EC_POINT;
type EC_builtin_curve (line 394) | typedef struct {
type ECPKPARAMETERS (line 709) | typedef struct ecpk_parameters_st ECPKPARAMETERS;
type EC_KEY (line 732) | typedef struct ec_key_st EC_KEY;
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ecdsa.h
type ECDSA_SIG (line 78) | typedef struct ECDSA_SIG_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/engine.h
type ENGINE_CMD_DEFN (line 323) | typedef struct ENGINE_CMD_DEFN_st {
type EVP_PKEY (line 338) | typedef EVP_PKEY *(*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *,
type dynamic_MEM_fns (line 755) | typedef struct st_dynamic_MEM_fns {
type CRYPTO_dynlock_value (line 766) | struct CRYPTO_dynlock_value
type CRYPTO_dynlock_value (line 768) | struct CRYPTO_dynlock_value
type CRYPTO_dynlock_value (line 770) | struct CRYPTO_dynlock_value
type dynamic_LOCK_fns (line 772) | typedef struct st_dynamic_LOCK_fns {
type dynamic_fns (line 780) | typedef struct st_dynamic_fns {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/err.h
type ERR_STATE (line 148) | typedef struct err_state_st {
type ERR_STRING_DATA (line 313) | typedef struct ERR_string_data_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/evp.h
type evp_pkey_st (line 128) | struct evp_pkey_st {
type env_md_st (line 159) | struct env_md_st {
type env_md_ctx_st (line 267) | struct env_md_ctx_st {
type evp_cipher_st (line 307) | struct evp_cipher_st {
type EVP_CIPHER_INFO (line 422) | typedef struct evp_cipher_info_st {
type evp_cipher_ctx_st (line 427) | struct evp_cipher_ctx_st {
type EVP_ENCODE_CTX (line 446) | typedef struct evp_Encode_Ctx_st {
type rsa_st (line 929) | struct rsa_st
type rsa_st (line 930) | struct rsa_st
type rsa_st (line 931) | struct rsa_st
type dsa_st (line 934) | struct dsa_st
type dsa_st (line 935) | struct dsa_st
type dsa_st (line 936) | struct dsa_st
type dh_st (line 939) | struct dh_st
type dh_st (line 940) | struct dh_st
type dh_st (line 941) | struct dh_st
type ec_key_st (line 944) | struct ec_key_st
type ec_key_st (line 945) | struct ec_key_st
type ec_key_st (line 946) | struct ec_key_st
FILE: Pods/OpenSSL-Universal/include-ios/openssl/hmac.h
type HMAC_CTX (line 75) | typedef struct hmac_ctx_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/idea.h
type IDEA_KEY_SCHEDULE (line 78) | typedef struct idea_key_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/krb5_asn.h
type KRB5_ENCDATA (line 83) | typedef struct krb5_encdata_st {
type krb5_princname_st (line 96) | struct krb5_princname_st {
type krb5_tktbody_st (line 110) | struct krb5_tktbody_st {
type KRB5_TICKET (line 117) | typedef STACK_OF(KRB5_TKTBODY) KRB5_TICKET;
type krb5_ap_req_st (line 131) | struct krb5_ap_req_st {
type KRB5_APREQ (line 139) | typedef STACK_OF(KRB5_APREQBODY) KRB5_APREQ;
type krb5_checksum_st (line 149) | struct krb5_checksum_st {
type krb5_encryptionkey_st (line 161) | struct krb5_encryptionkey_st {
type krb5_authorization_st (line 173) | struct krb5_authorization_st {
type krb5_authenticator_st (line 193) | struct krb5_authenticator_st {
type KRB5_AUTHENT (line 205) | typedef STACK_OF(KRB5_AUTHENTBODY) KRB5_AUTHENT;
FILE: Pods/OpenSSL-Universal/include-ios/openssl/kssl.h
type krb5_octet (line 94) | typedef unsigned char krb5_octet;
type KSSL_ERR (line 132) | typedef struct kssl_err_st {
type KSSL_CTX (line 141) | typedef struct kssl_ctx_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/lhash.h
type LHASH_NODE (line 79) | typedef struct lhash_node_st {
type _LHASH (line 139) | typedef struct lhash_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/md4.h
type MD4_CTX (line 100) | typedef struct MD4state_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/md5.h
type MD5_CTX (line 100) | typedef struct MD5state_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/mdc2.h
type MDC2_CTX (line 75) | typedef struct mdc2_ctx_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/modes.h
type GCM128_CONTEXT (line 98) | typedef struct gcm128_context GCM128_CONTEXT;
type CCM128_CONTEXT (line 123) | typedef struct ccm128_context CCM128_CONTEXT;
type XTS128_CONTEXT (line 144) | typedef struct xts128_context XTS128_CONTEXT;
FILE: Pods/OpenSSL-Universal/include-ios/openssl/objects.h
type OBJ_NAME (line 984) | typedef struct obj_name_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ocsp.h
type OCSP_CERTID (line 102) | typedef struct ocsp_cert_id_st {
type ocsp_one_request_st (line 115) | struct ocsp_one_request_st {
function DECLARE_ASN1_SET_OF (line 120) | DECLARE_STACK_OF(OCSP_ONEREQ)
type OCSP_SIGNATURE (line 141) | typedef struct ocsp_signature_st {
type OCSP_REQUEST (line 151) | typedef struct ocsp_request_st {
type OCSP_RESPBYTES (line 177) | typedef struct ocsp_resp_bytes_st {
type ocsp_response_st (line 186) | struct ocsp_response_st {
type ocsp_responder_id_st (line 197) | struct ocsp_responder_id_st {
function DECLARE_ASN1_FUNCTIONS (line 205) | DECLARE_STACK_OF(OCSP_RESPID)
type OCSP_CERTSTATUS (line 229) | typedef struct ocsp_cert_status_st {
type OCSP_SINGLERESP (line 245) | typedef struct ocsp_single_response_st {
function DECLARE_ASN1_SET_OF (line 253) | DECLARE_STACK_OF(OCSP_SINGLERESP)
type OCSP_BASICRESP (line 297) | typedef struct ocsp_basic_response_st {
type OCSP_CRLID (line 331) | typedef struct ocsp_crl_id_st {
type OCSP_SERVICELOC (line 342) | typedef struct ocsp_service_locator_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ossl_typ.h
type ASN1_INTEGER (line 83) | typedef struct asn1_string_st ASN1_INTEGER;
type ASN1_ENUMERATED (line 84) | typedef struct asn1_string_st ASN1_ENUMERATED;
type ASN1_BIT_STRING (line 85) | typedef struct asn1_string_st ASN1_BIT_STRING;
type ASN1_OCTET_STRING (line 86) | typedef struct asn1_string_st ASN1_OCTET_STRING;
type ASN1_PRINTABLESTRING (line 87) | typedef struct asn1_string_st ASN1_PRINTABLESTRING;
type ASN1_T61STRING (line 88) | typedef struct asn1_string_st ASN1_T61STRING;
type ASN1_IA5STRING (line 89) | typedef struct asn1_string_st ASN1_IA5STRING;
type ASN1_GENERALSTRING (line 90) | typedef struct asn1_string_st ASN1_GENERALSTRING;
type ASN1_UNIVERSALSTRING (line 91) | typedef struct asn1_string_st ASN1_UNIVERSALSTRING;
type ASN1_BMPSTRING (line 92) | typedef struct asn1_string_st ASN1_BMPSTRING;
type ASN1_UTCTIME (line 93) | typedef struct asn1_string_st ASN1_UTCTIME;
type ASN1_TIME (line 94) | typedef struct asn1_string_st ASN1_TIME;
type ASN1_GENERALIZEDTIME (line 95) | typedef struct asn1_string_st ASN1_GENERALIZEDTIME;
type ASN1_VISIBLESTRING (line 96) | typedef struct asn1_string_st ASN1_VISIBLESTRING;
type ASN1_UTF8STRING (line 97) | typedef struct asn1_string_st ASN1_UTF8STRING;
type ASN1_STRING (line 98) | typedef struct asn1_string_st ASN1_STRING;
type ASN1_BOOLEAN (line 99) | typedef int ASN1_BOOLEAN;
type ASN1_NULL (line 100) | typedef int ASN1_NULL;
type ASN1_ITEM (line 103) | typedef struct ASN1_ITEM_st ASN1_ITEM;
type ASN1_PCTX (line 104) | typedef struct asn1_pctx_st ASN1_PCTX;
type BIGNUM (line 118) | typedef struct bignum_st BIGNUM;
type BN_CTX (line 119) | typedef struct bignum_ctx BN_CTX;
type BN_BLINDING (line 120) | typedef struct bn_blinding_st BN_BLINDING;
type BN_MONT_CTX (line 121) | typedef struct bn_mont_ctx_st BN_MONT_CTX;
type BN_RECP_CTX (line 122) | typedef struct bn_recp_ctx_st BN_RECP_CTX;
type BN_GENCB (line 123) | typedef struct bn_gencb_st BN_GENCB;
type BUF_MEM (line 125) | typedef struct buf_mem_st BUF_MEM;
type EVP_CIPHER (line 127) | typedef struct evp_cipher_st EVP_CIPHER;
type EVP_CIPHER_CTX (line 128) | typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX;
type EVP_MD (line 129) | typedef struct env_md_st EVP_MD;
type EVP_MD_CTX (line 130) | typedef struct env_md_ctx_st EVP_MD_CTX;
type EVP_PKEY (line 131) | typedef struct evp_pkey_st EVP_PKEY;
type EVP_PKEY_ASN1_METHOD (line 133) | typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD;
type EVP_PKEY_METHOD (line 135) | typedef struct evp_pkey_method_st EVP_PKEY_METHOD;
type EVP_PKEY_CTX (line 136) | typedef struct evp_pkey_ctx_st EVP_PKEY_CTX;
type DH (line 138) | typedef struct dh_st DH;
type DH_METHOD (line 139) | typedef struct dh_method DH_METHOD;
type DSA (line 141) | typedef struct dsa_st DSA;
type DSA_METHOD (line 142) | typedef struct dsa_method DSA_METHOD;
type RSA (line 144) | typedef struct rsa_st RSA;
type RSA_METHOD (line 145) | typedef struct rsa_meth_st RSA_METHOD;
type RAND_METHOD (line 147) | typedef struct rand_meth_st RAND_METHOD;
type ECDH_METHOD (line 149) | typedef struct ecdh_method ECDH_METHOD;
type ECDSA_METHOD (line 150) | typedef struct ecdsa_method ECDSA_METHOD;
type X509 (line 152) | typedef struct x509_st X509;
type X509_ALGOR (line 153) | typedef struct X509_algor_st X509_ALGOR;
type X509_CRL (line 154) | typedef struct X509_crl_st X509_CRL;
type X509_CRL_METHOD (line 155) | typedef struct x509_crl_method_st X509_CRL_METHOD;
type X509_REVOKED (line 156) | typedef struct x509_revoked_st X509_REVOKED;
type X509_NAME (line 157) | typedef struct X509_name_st X509_NAME;
type X509_PUBKEY (line 158) | typedef struct X509_pubkey_st X509_PUBKEY;
type X509_STORE (line 159) | typedef struct x509_store_st X509_STORE;
type X509_STORE_CTX (line 160) | typedef struct x509_store_ctx_st X509_STORE_CTX;
type PKCS8_PRIV_KEY_INFO (line 162) | typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO;
type X509V3_CTX (line 164) | typedef struct v3_ext_ctx X509V3_CTX;
type CONF (line 165) | typedef struct conf_st CONF;
type STORE (line 167) | typedef struct store_st STORE;
type STORE_METHOD (line 168) | typedef struct store_method_st STORE_METHOD;
type UI (line 170) | typedef struct ui_st UI;
type UI_METHOD (line 171) | typedef struct ui_method_st UI_METHOD;
type ERR_FNS (line 173) | typedef struct st_ERR_FNS ERR_FNS;
type ENGINE (line 175) | typedef struct engine_st ENGINE;
type SSL (line 176) | typedef struct ssl_st SSL;
type SSL_CTX (line 177) | typedef struct ssl_ctx_st SSL_CTX;
type X509_POLICY_NODE (line 179) | typedef struct X509_POLICY_NODE_st X509_POLICY_NODE;
type X509_POLICY_LEVEL (line 180) | typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL;
type X509_POLICY_TREE (line 181) | typedef struct X509_POLICY_TREE_st X509_POLICY_TREE;
type X509_POLICY_CACHE (line 182) | typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE;
type AUTHORITY_KEYID (line 184) | typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID;
type DIST_POINT (line 185) | typedef struct DIST_POINT_st DIST_POINT;
type ISSUING_DIST_POINT (line 186) | typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT;
type NAME_CONSTRAINTS (line 187) | typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS;
type CRYPTO_EX_DATA (line 193) | typedef struct crypto_ex_data_st CRYPTO_EX_DATA;
type OCSP_REQ_CTX (line 202) | typedef struct ocsp_req_ctx_st OCSP_REQ_CTX;
type OCSP_RESPONSE (line 203) | typedef struct ocsp_response_st OCSP_RESPONSE;
type OCSP_RESPID (line 204) | typedef struct ocsp_responder_id_st OCSP_RESPID;
FILE: Pods/OpenSSL-Universal/include-ios/openssl/pem.h
type PEM_ENCODE_SEAL_CTX (line 144) | typedef struct PEM_Encode_Seal_st {
type PEM_USER (line 156) | typedef struct pem_recip_st {
type PEM_CTX (line 164) | typedef struct pem_ctx_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/pkcs12.h
type PKCS12_MAC_DATA (line 102) | typedef struct {
type PKCS12 (line 108) | typedef struct {
type PKCS12_SAFEBAG (line 114) | typedef struct {
function DECLARE_ASN1_SET_OF (line 126) | DECLARE_STACK_OF(PKCS12_SAFEBAG)
FILE: Pods/OpenSSL-Universal/include-ios/openssl/pkcs7.h
type PKCS7_ISSUER_AND_SERIAL (line 86) | typedef struct pkcs7_issuer_and_serial_st {
type PKCS7_SIGNER_INFO (line 91) | typedef struct pkcs7_signer_info_st {
function DECLARE_ASN1_SET_OF (line 103) | DECLARE_STACK_OF(PKCS7_SIGNER_INFO)
function DECLARE_ASN1_SET_OF (line 114) | DECLARE_STACK_OF(PKCS7_RECIP_INFO)
type PKCS7_ENC_CONTENT (line 130) | typedef struct pkcs7_enc_content_st {
type PKCS7_ENVELOPE (line 137) | typedef struct pkcs7_enveloped_st {
type PKCS7_SIGN_ENVELOPE (line 143) | typedef struct pkcs7_signedandenveloped_st {
type PKCS7_DIGEST (line 153) | typedef struct pkcs7_digest_st {
type PKCS7_ENCRYPT (line 160) | typedef struct pkcs7_encrypted_st {
type PKCS7 (line 165) | typedef struct pkcs7_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/pqueue.h
type _pqueue (line 70) | struct _pqueue
type pitem (line 72) | typedef struct _pitem {
type _pitem (line 78) | struct _pitem
FILE: Pods/OpenSSL-Universal/include-ios/openssl/rand.h
type rand_meth_st (line 81) | struct rand_meth_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/rc2.h
type RC2_KEY (line 77) | typedef struct rc2_key_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/rc4.h
type RC4_KEY (line 73) | typedef struct rc4_key_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ripemd.h
type RIPEMD160_CTX (line 86) | typedef struct RIPEMD160state_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/rsa.h
type rsa_meth_st (line 85) | struct rsa_meth_st {
type rsa_st (line 132) | struct rsa_st {
type RSA_PSS_PARAMS (line 341) | typedef struct rsa_pss_params_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/seed.h
type SEED_KEY_SCHEDULE (line 110) | typedef struct seed_key_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/sha.h
type SHA_CTX (line 100) | typedef struct SHAstate_st {
type SHA256_CTX (line 134) | typedef struct SHA256state_st {
type SHA512_CTX (line 183) | typedef struct SHA512state_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/srp.h
type SRP_gN_cache (line 76) | typedef struct SRP_gN_cache_st {
type SRP_user_pwd_st (line 84) | struct SRP_user_pwd_st {
type SRP_VBASE_st (line 95) | struct SRP_VBASE_st {
type SRP_gN (line 107) | typedef struct SRP_gN_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ssl.h
type ssl_st (line 368) | struct ssl_st
type TLS_SESSION_TICKET_EXT (line 369) | typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT;
type SSL_METHOD (line 370) | typedef struct ssl_method_st SSL_METHOD;
type SSL_CIPHER (line 371) | typedef struct ssl_cipher_st SSL_CIPHER;
type SSL_SESSION (line 372) | typedef struct ssl_session_st SSL_SESSION;
type srtp_protection_profile_st (line 377) | struct srtp_protection_profile_st {
type ssl_cipher_st (line 395) | struct ssl_cipher_st {
type ssl_method_st (line 415) | struct ssl_method_st {
type ssl_session_st (line 475) | struct ssl_session_st {
type SRP_CTX (line 748) | typedef struct srp_ctx_st {
type SSL_COMP (line 807) | typedef struct ssl_comp_st SSL_COMP;
type ssl_comp_st (line 811) | struct ssl_comp_st {
type ssl_ctx_st (line 824) | struct ssl_ctx_st {
type ssl_st (line 1088) | struct ssl_st
type ssl_st (line 1090) | struct ssl_st
type ssl_ctx_st (line 1093) | struct ssl_ctx_st
type ssl_ctx_st (line 1097) | struct ssl_ctx_st
type ssl_st (line 1100) | struct ssl_st
type ssl_st (line 1105) | struct ssl_st
type ssl_st (line 1247) | struct ssl_st {
type evp_pkey_st (line 2092) | struct evp_pkey_st
type openssl_ssl_test_functions (line 2224) | struct openssl_ssl_test_functions
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ssl2.h
type SSL2_STATE (line 163) | typedef struct ssl2_state_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ssl3.h
type SSL3_RECORD (line 368) | typedef struct ssl3_record_st {
type SSL3_BUFFER (line 403) | typedef struct ssl3_buffer_st {
type SSL3_STATE (line 453) | typedef struct ssl3_state_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/stack.h
type _STACK (line 66) | typedef struct stack_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/tls1.h
type tls_session_ticket_ext_st (line 777) | struct tls_session_ticket_ext_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ts.h
type TS_MSG_IMPRINT (line 108) | typedef struct TS_msg_imprint_st {
type TS_REQ (line 125) | typedef struct TS_req_st {
type TS_ACCURACY (line 141) | typedef struct TS_accuracy_st {
type TS_TST_INFO (line 167) | typedef struct TS_tst_info_st {
type TS_STATUS_INFO (line 215) | typedef struct TS_status_info_st {
function DECLARE_ASN1_SET_OF (line 221) | DECLARE_STACK_OF(ASN1_UTF8STRING)
type ESS_ISSUER_SERIAL (line 245) | typedef struct ESS_issuer_serial {
type ESS_CERT_ID (line 257) | typedef struct ESS_cert_id {
function DECLARE_ASN1_SET_OF (line 262) | DECLARE_STACK_OF(ESS_CERT_ID)
type TS_resp_ctx (line 477) | struct TS_resp_ctx
type ASN1_INTEGER (line 480) | typedef ASN1_INTEGER *(*TS_serial_cb) (struct TS_resp_ctx *, void *);
type TS_resp_ctx (line 487) | struct TS_resp_ctx
type TS_resp_ctx (line 495) | struct TS_resp_ctx
type TS_RESP_CTX (line 498) | typedef struct TS_resp_ctx {
type TS_verify_ctx (line 657) | struct TS_verify_ctx {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/txt_db.h
type OPENSSL_STRING (line 80) | typedef OPENSSL_STRING *OPENSSL_PSTRING;
type TXT_DB (line 83) | typedef struct txt_db_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/ui.h
type UI_STRING (line 304) | typedef struct ui_string_st UI_STRING;
type UI_string_types (line 351) | enum UI_string_types
FILE: Pods/OpenSSL-Universal/include-ios/openssl/whrlpool.h
type WHIRLPOOL_CTX (line 15) | typedef struct {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/x509.h
type X509_OBJECTS (line 137) | typedef struct X509_objects_st {
type X509_algor_st (line 143) | struct X509_algor_st {
type X509_VAL (line 152) | typedef struct X509_val_st {
type X509_pubkey_st (line 157) | struct X509_pubkey_st {
type X509_SIG (line 163) | typedef struct X509_sig_st {
type X509_NAME_ENTRY (line 168) | typedef struct X509_name_entry_st {
function DECLARE_ASN1_SET_OF (line 175) | DECLARE_STACK_OF(X509_NAME_ENTRY)
type X509_EXTENSION (line 196) | typedef struct X509_extension_st {
type X509_EXTENSIONS (line 202) | typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS;
function DECLARE_ASN1_SET_OF (line 204) | DECLARE_STACK_OF(X509_EXTENSION)
function DECLARE_ASN1_SET_OF (line 223) | DECLARE_STACK_OF(X509_ATTRIBUTE)
type X509_REQ (line 235) | typedef struct X509_req_st {
type X509_CINF (line 242) | typedef struct x509_cinf_st {
type X509_CERT_AUX (line 262) | typedef struct x509_cert_aux_st {
type x509_st (line 270) | struct x509_st {
function DECLARE_ASN1_SET_OF (line 301) | DECLARE_STACK_OF(X509)
type x509_cert_pair_st (line 317) | struct x509_cert_pair_st {
type x509_revoked_st (line 426) | struct x509_revoked_st {
function DECLARE_ASN1_SET_OF (line 437) | DECLARE_STACK_OF(X509_REVOKED)
type X509_crl_st (line 451) | struct X509_crl_st {
function DECLARE_ASN1_SET_OF (line 475) | DECLARE_STACK_OF(X509_CRL)
type X509_INFO (line 495) | typedef struct X509_info_st {
type NETSCAPE_SPKAC (line 513) | typedef struct Netscape_spkac_st {
type NETSCAPE_SPKI (line 518) | typedef struct Netscape_spki_st {
type NETSCAPE_CERT_SEQUENCE (line 525) | typedef struct Netscape_certificate_sequence {
type PBEPARAM (line 539) | typedef struct PBEPARAM_st {
type PBE2PARAM (line 546) | typedef struct PBE2PARAM_st {
type PBKDF2PARAM (line 551) | typedef struct PBKDF2PARAM_st {
type pkcs8_priv_key_info_st (line 561) | struct pkcs8_priv_key_info_st {
FILE: Pods/OpenSSL-Universal/include-ios/openssl/x509_vfy.h
type X509_HASH_DIR_CTX (line 84) | typedef struct x509_hash_dir_st {
type X509_CERT_FILE_CTX (line 92) | typedef struct x509_file_st {
type X509_OBJECT (line 123) | typedef struct x509_object_st {
type X509_LOOKUP (line 134) | typedef struct x509_lookup_st X509_LOOKUP;
function DECLARE_STACK_OF (line 136) | DECLARE_STACK_OF(X509_LOOKUP)
type X509_VERIFY_PARAM (line 165) | typedef struct X509_VERIFY_PARAM_st {
function x509_store_st (line 176) | DECLARE_STACK_OF(X509_VERIFY_PARAM)
type x509_lookup_st (line 220) | struct x509_lookup_st {
type x509_store_ctx_st (line 233) | struct x509_store_ctx_st { /* X509_STORE_CTX */
FILE: Pods/OpenSSL-Universal/include-ios/openssl/x509v3.h
type v3_ext_method (line 71) | struct v3_ext_method
type v3_ext_ctx (line 72) | struct v3_ext_ctx
type v3_ext_method (line 81) | struct v3_ext_method
type v3_ext_method (line 83) | struct v3_ext_method
type v3_ext_ctx (line 84) | struct v3_ext_ctx
type v3_ext_method (line 86) | struct v3_ext_method
type v3_ext_method (line 88) | struct v3_ext_method
type v3_ext_ctx (line 89) | struct v3_ext_ctx
type v3_ext_method (line 90) | struct v3_ext_method
type v3_ext_method (line 92) | struct v3_ext_method
type v3_ext_ctx (line 93) | struct v3_ext_ctx
type v3_ext_method (line 97) | struct v3_ext_method {
type X509V3_CONF_METHOD (line 119) | typedef struct X509V3_CONF_METHOD_st {
type v3_ext_ctx (line 127) | struct v3_ext_ctx {
type X509V3_EXT_METHOD (line 139) | typedef struct v3_ext_method X509V3_EXT_METHOD;
type BIT_STRING_BITNAME (line 148) | typedef BIT_STRING_BITNAME ENUMERATED_NAMES;
type BASIC_CONSTRAINTS (line 150) | typedef struct BASIC_CONSTRAINTS_st {
type PKEY_USAGE_PERIOD (line 155) | typedef struct PKEY_USAGE_PERIOD_st {
type OTHERNAME (line 160) | typedef struct otherName_st {
type EDIPARTYNAME (line 165) | typedef struct EDIPartyName_st {
type GENERAL_NAME (line 170) | typedef struct GENERAL_NAME_st {
type GENERAL_NAMES (line 202) | typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES;
type ACCESS_DESCRIPTION (line 204) | typedef struct ACCESS_DESCRIPTION_st {
type AUTHORITY_INFO_ACCESS (line 209) | typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS;
type EXTENDED_KEY_USAGE (line 211) | typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE;
function DECLARE_ASN1_SET_OF (line 213) | DECLARE_STACK_OF(GENERAL_NAME)
type DIST_POINT_st (line 243) | struct DIST_POINT_st {
type CRL_DIST_POINTS (line 250) | typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS;
function DECLARE_ASN1_SET_OF (line 252) | DECLARE_STACK_OF(DIST_POINT)
type SXNETID (line 263) | typedef struct SXNET_ID_st {
function DECLARE_ASN1_SET_OF (line 268) | DECLARE_STACK_OF(SXNETID)
type NOTICEREF (line 276) | typedef struct NOTICEREF_st {
type USERNOTICE (line 281) | typedef struct USERNOTICE_st {
type POLICYQUALINFO (line 286) | typedef struct POLICYQUALINFO_st {
function DECLARE_ASN1_SET_OF (line 295) | DECLARE_STACK_OF(POLICYQUALINFO)
type CERTIFICATEPOLICIES (line 303) | typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES;
function DECLARE_ASN1_SET_OF (line 305) | DECLARE_STACK_OF(POLICYINFO)
type GENERAL_SUBTREE (line 317) | typedef struct GENERAL_SUBTREE_st {
function NAME_CONSTRAINTS_st (line 323) | DECLARE_STACK_OF(GENERAL_SUBTREE)
type POLICY_CONSTRAINTS (line 330) | typedef struct POLICY_CONSTRAINTS_st {
type PROXY_POLICY (line 336) | typedef struct PROXY_POLICY_st {
type PROXY_CERT_INFO_EXTENSION (line 341) | typedef struct PROXY_CERT_INFO_EXTENSION_st {
function DECLARE_ASN1_FUNCTIONS (line 346) | DECLARE_ASN1_FUNCTIONS(PROXY_POLICY)
type X509_PURPOSE (line 449) | typedef struct x509_purpose_st {
function DECLARE_ASN1_FUNCTIONS (line 540) | DECLARE_ASN1_FUNCTIONS(OTHERNAME)
type ASIdOrRange (line 729) | typedef struct ASIdOrRange_st {
type ASIdOrRanges (line 737) | typedef STACK_OF(ASIdOrRange) ASIdOrRanges;
type ASIdentifierChoice (line 743) | typedef struct ASIdentifierChoice_st {
type ASIdentifiers (line 751) | typedef struct ASIdentifiers_st {
function DECLARE_ASN1_FUNCTIONS (line 755) | DECLARE_ASN1_FUNCTIONS(ASRange)
type IPAddressOrRange (line 767) | typedef struct IPAddressOrRange_st {
type IPAddressOrRanges (line 775) | typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges;
type IPAddressChoice (line 781) | typedef struct IPAddressChoice_st {
type IPAddressFamily (line 789) | typedef struct IPAddressFamily_st {
type IPAddrBlocks (line 794) | typedef STACK_OF(IPAddressFamily) IPAddrBlocks;
FILE: Pods/RNCryptor/RNCryptor/RNCryptor.h
type RNCryptorKeyDerivationSettings (line 35) | typedef struct _RNCryptorKeyDerivationSettings
type RNCryptorSettings (line 45) | typedef struct _RNCryptorSettings
type _RNCryptorOptions (line 82) | enum _RNCryptorOptions
type RNCryptorOptions (line 86) | typedef uint8_t RNCryptorOptions;
Condensed preview — 611 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,246K chars).
[
{
"path": ".gitignore",
"chars": 677,
"preview": "# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!defau"
},
{
"path": "ArcBit/APIs/TLBitcoinListener.swift",
"chars": 10959,
"preview": "//\n// TLBitcoinListener.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <"
},
{
"path": "ArcBit/APIs/TLBlockExplorerAPI.swift",
"chars": 8716,
"preview": "//\n// TLBlockExplorerAPI.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee "
},
{
"path": "ArcBit/APIs/TLBlockchainAPI.swift",
"chars": 6518,
"preview": "//\n// TLBlockchainAPI.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <st"
},
{
"path": "ArcBit/APIs/TLBlockrAPI.swift",
"chars": 1747,
"preview": "//\n// TLBlockrAPI.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequa"
},
{
"path": "ArcBit/APIs/TLExchangeRate.swift",
"chars": 3846,
"preview": "//\n// TLExchangeRate.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <ste"
},
{
"path": "ArcBit/APIs/TLInsightAPI.swift",
"chars": 23100,
"preview": "//\n// TLInsightAPI.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequ"
},
{
"path": "ArcBit/APIs/TLNetworking.swift",
"chars": 10999,
"preview": "//\n// TLNetworking.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequ"
},
{
"path": "ArcBit/APIs/TLPushTxAPI.swift",
"chars": 4766,
"preview": "//\n// TLPushTxAPI.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequa"
},
{
"path": "ArcBit/APIs/TLStealthServerAPI.swift",
"chars": 4620,
"preview": "//\n// TLStealthServerAPI.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee "
},
{
"path": "ArcBit/APIs/TLStealthServerConfig.swift",
"chars": 2366,
"preview": "//\n// TLStealthServerConfig.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy L"
},
{
"path": "ArcBit/APIs/TLStealthWebSocket.swift",
"chars": 7685,
"preview": "//\n// TLStealthWebSocket.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee "
},
{
"path": "ArcBit/APIs/TLTxFeeAPI.swift",
"chars": 4011,
"preview": "//\n// TLTxFeeAPI.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequal"
},
{
"path": "ArcBit/AppDelegate.swift",
"chars": 72114,
"preview": "//\n// AppDelegate.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequa"
},
{
"path": "ArcBit/ArcBit-Bridging-Header.h",
"chars": 2161,
"preview": "//\n// Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n#import <CoreBit"
},
{
"path": "ArcBit/ArcBit.entitlements",
"chars": 181,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ArcBit/Base.lproj/LaunchScreen.xib",
"chars": 2629,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "ArcBit/Base.lproj/Localizable.strings",
"chars": 53421,
"preview": "\"\" = \"\";\n\n\"%@ is not allowed to access the camera\" = \"%@ is not allowed to access the camera\";\n\n\"%@ servers not reachabl"
},
{
"path": "ArcBit/Base.lproj/Main.storyboard",
"chars": 448260,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/BRKey+BIP38.h",
"chars": 3129,
"preview": "//\n// BRKey+BIP38.h\n// BreadWallet\n//\n// Created by Aaron Voisine on 4/9/14.\n// Copyright (c) 2014 Aaron Voisine <vo"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/BRKey+BIP38.m",
"chars": 24560,
"preview": "//\n// BRKey+BIP38.m\n// BreadWallet\n//\n// Created by Aaron Voisine on 4/9/14.\n// Copyright (c) 2014 Aaron Voisine <vo"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/BRKey.h",
"chars": 2114,
"preview": "//\n// BRKey.h\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/22/13.\n// Copyright (c) 2013 Aaron Voisine <voisine"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/BRKey.m",
"chars": 10054,
"preview": "//\n// BRKey.m\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/22/13.\n// Copyright (c) 2013 Aaron Voisine <voisine"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/BRTransaction.h",
"chars": 4759,
"preview": "//\n// BRTransaction.h\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/16/13.\n// Copyright (c) 2013 Aaron Voisine "
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/BRTransaction.m",
"chars": 15069,
"preview": "//\n// BRTransaction.m\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/16/13.\n// Copyright (c) 2013 Aaron Voisine "
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/NSData+Bitcoin.h",
"chars": 2348,
"preview": "//\n// NSData+Bitcoin.h\n// BreadWallet\n//\n// Created by Aaron Voisine on 10/9/13.\n// Copyright (c) 2013 Aaron Voisine"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/NSData+Bitcoin.m",
"chars": 5503,
"preview": "//\n// NSData+Bitcoin.m\n// BreadWallet\n//\n// Created by Aaron Voisine on 10/9/13.\n// Copyright (c) 2013 Aaron Voisine"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/NSData+Hash.h",
"chars": 1456,
"preview": "//\n// NSData+Hash.h\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/13/13.\n// Copyright (c) 2013 Aaron Voisine <v"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/NSData+Hash.m",
"chars": 2503,
"preview": "//\n// NSData+Hash.m\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/13/13.\n// Copyright (c) 2013 Aaron Voisine <v"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/NSMutableData+Bitcoin.h",
"chars": 2262,
"preview": "//\n// NSMutableData+Bitcoin.h\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/20/13.\n// Copyright (c) 2013 Aaron "
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/NSMutableData+Bitcoin.m",
"chars": 6539,
"preview": "//\n// NSMutableData+Bitcoin.m\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/20/13.\n// Copyright (c) 2013 Aaron "
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/NSString+Base58.h",
"chars": 2567,
"preview": "//\n// NSString+Base58.h\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/13/13.\n// Copyright (c) 2013 Aaron Voisin"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/NSString+Base58.m",
"chars": 13834,
"preview": "//\n// NSString+Base58.mm\n// BreadWallet\n//\n// Created by Aaron Voisine on 5/13/13.\n// Copyright (c) 2013 Aaron Voisi"
},
{
"path": "ArcBit/External/BreadWalletClassesV0.5/ccMemory.h",
"chars": 2631,
"preview": "/* \n * Copyright (c) 2010 Apple Inc. All Ri"
},
{
"path": "ArcBit/External/CustomIOS7AlertView/CustomIOS7AlertView.h",
"chars": 1653,
"preview": "//\n// CustomIOS7AlertView.h\n// CustomIOS7AlertView\n//\n// Created by Richard on 20/09/2013.\n// Copyright (c) 2013 Wim"
},
{
"path": "ArcBit/External/CustomIOS7AlertView/CustomIOS7AlertView.m",
"chars": 15988,
"preview": "//\n// CustomIOS7AlertView.m\n// CustomIOS7AlertView\n//\n// Created by Richard on 20/09/2013.\n// Copyright (c) 2013 Wim"
},
{
"path": "ArcBit/External/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h",
"chars": 3481,
"preview": "//\n// IASKAppSettingsViewController.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Ed"
},
{
"path": "ArcBit/External/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m",
"chars": 46410,
"preview": "//\n// IASKAppSettingsViewController.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009-2010:\n// Luc Vanda"
},
{
"path": "ArcBit/External/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h",
"chars": 1101,
"preview": "//\n// IASKAppSettingsWebViewController.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal,"
},
{
"path": "ArcBit/External/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m",
"chars": 5714,
"preview": "//\n// IASKAppSettingsWebViewController.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2010:\n// Luc Vandal,"
},
{
"path": "ArcBit/External/InAppSettingsKit/Controllers/IASKMultipleValueSelection.h",
"chars": 692,
"preview": "#import <UIKit/UIKit.h>\n\n@class IASKSpecifier;\n@protocol IASKSettingsStore;\n\n/// Encapsulates the selection among multip"
},
{
"path": "ArcBit/External/InAppSettingsKit/Controllers/IASKMultipleValueSelection.m",
"chars": 3864,
"preview": "#import \"IASKMultipleValueSelection.h\"\n\n#import \"IASKSettingsStore.h\"\n#import \"IASKSettingsStoreUserDefaults.h\"\n#import "
},
{
"path": "ArcBit/External/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h",
"chars": 1171,
"preview": "//\n// IASKSpecifierValuesViewController.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal"
},
{
"path": "ArcBit/External/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m",
"chars": 4402,
"preview": "//\n// IASKSpecifierValuesViewController.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal"
},
{
"path": "ArcBit/External/InAppSettingsKit/Controllers/IASKViewController.h",
"chars": 947,
"preview": "//\n// IASKAppSettingsViewController.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Ed"
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSettingsReader.h",
"chars": 10953,
"preview": "//\n// IASKSettingsReader.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Edovia Inc., "
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSettingsReader.m",
"chars": 13573,
"preview": "//\n//\tIASKSettingsReader.m\n//\thttp://www.inappsettingskit.com\n//\n//\tCopyright (c) 2009:\n//\tLuc Vandal, Edovia Inc., http"
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSettingsStore.h",
"chars": 2065,
"preview": "//\n// IASKSettingsStore.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2010:\n// Luc Vandal, Edovia Inc., h"
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSettingsStore.m",
"chars": 2104,
"preview": "//\n// IASKSettingsStore.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2010:\n// Luc Vandal, Edovia Inc., h"
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSettingsStoreFile.h",
"chars": 1210,
"preview": "//\n// IASKSettingsStoreFile.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2010:\n// Luc Vandal, Edovia Inc"
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSettingsStoreFile.m",
"chars": 1427,
"preview": "//\n// IASKSettingsStoreFile.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2010:\n// Luc Vandal, Edovia Inc"
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h",
"chars": 1175,
"preview": "//\n// IASKSettingsStoreUserDefaults.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2010:\n// Luc Vandal, Ed"
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m",
"chars": 2209,
"preview": "//\n// IASKSettingsStoreUserDefaults.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2010:\n// Luc Vandal, Ed"
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSpecifier.h",
"chars": 2314,
"preview": "//\n// IASKSpecifier.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Edovia Inc., http:"
},
{
"path": "ArcBit/External/InAppSettingsKit/Models/IASKSpecifier.m",
"chars": 15196,
"preview": "//\n// IASKSpecifier.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Edovia Inc., http:"
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/Base.lproj/IASKLocalizable.strings",
"chars": 258,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/de.lproj/IASKLocalizable.strings",
"chars": 287,
"preview": "/* \n IASKLocalizable.strings\n Where To\n\n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rig"
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/el.lproj/IASKLocalizable.strings",
"chars": 262,
"preview": "/* \n IASKLocalizable.strings\n Where To\n\n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rig"
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/en.lproj/IASKLocalizable.strings",
"chars": 276,
"preview": "/* \n IASKLocalizable.strings\n Where To\n\n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rig"
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/es.lproj/IASKLocalizable.strings",
"chars": 265,
"preview": "/* \n IASKLocalizable.strings\n Where To\n\n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rig"
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/fr.lproj/IASKLocalizable.strings",
"chars": 270,
"preview": "/* \n IASKLocalizable.strings\n Where To\n\n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rig"
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/it.lproj/IASKLocalizable.strings",
"chars": 258,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/ja.lproj/IASKLocalizable.strings",
"chars": 257,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/nl.lproj/IASKLocalizable.strings",
"chars": 282,
"preview": "/* \n IASKLocalizable.strings\n Where To\n\n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rig"
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/pt-PT.lproj/IASKLocalizable.strings",
"chars": 262,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/pt.lproj/IASKLocalizable.strings",
"chars": 262,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/ru.lproj/IASKLocalizable.strings",
"chars": 262,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/sv.lproj/IASKLocalizable.strings",
"chars": 267,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/th.lproj/IASKLocalizable.strings",
"chars": 266,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/tr.lproj/IASKLocalizable.strings",
"chars": 259,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Resources/zh-Hant.lproj/IASKLocalizable.strings",
"chars": 258,
"preview": "/*\n IASKLocalizable.strings\n Where To\n \n Created by Ortwin Gentz on 20.10.14.\n Copyright (c) 2014 FutureTap. All rights "
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h",
"chars": 929,
"preview": "//\n// IASKPSSliderSpecifierViewCell.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Ed"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m",
"chars": 3691,
"preview": "//\n// IASKPSSliderSpecifierViewCell.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009-2010:\n// Luc Vanda"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h",
"chars": 838,
"preview": "//\n// IASKPSTextFieldSpecifierViewCell.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal,"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m",
"chars": 3400,
"preview": "//\n// IASKPSTextFieldSpecifierViewCell.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009-2010:\n// Luc Va"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKSlider.h",
"chars": 752,
"preview": "//\n// IASKSlider.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Edovia Inc., http://w"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKSlider.m",
"chars": 701,
"preview": "//\n// IASKSlider.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Edovia Inc., http://w"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKSwitch.h",
"chars": 752,
"preview": "//\n// IASKSwitch.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Edovia Inc., http://w"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKSwitch.m",
"chars": 701,
"preview": "//\n// IASKSwitch.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Edovia Inc., http://w"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKTextField.h",
"chars": 761,
"preview": "//\n// IASKTextField.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Edovia Inc., http:"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKTextField.m",
"chars": 710,
"preview": "//\n// IASKTextField.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009:\n// Luc Vandal, Edovia Inc., http:"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKTextView.h",
"chars": 759,
"preview": "//\n// IASKTextView.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009-2015:\n// Luc Vandal, Edovia Inc., h"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKTextView.m",
"chars": 708,
"preview": "//\n// IASKTextView.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009-2015:\n// Luc Vandal, Edovia Inc., h"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKTextViewCell.h",
"chars": 808,
"preview": "//\n// IASKTextViewCell.h\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009-2015:\n// Luc Vandal, Edovia Inc"
},
{
"path": "ArcBit/External/InAppSettingsKit/Views/IASKTextViewCell.m",
"chars": 1852,
"preview": "//\n// IASKTextViewCell.m\n// http://www.inappsettingskit.com\n//\n// Copyright (c) 2009-2015:\n// Luc Vandal, Edovia Inc"
},
{
"path": "ArcBit/External/JNKeychain-master/JNKeychain.h",
"chars": 436,
"preview": "//\n// JNKeychain.h\n//\n// Created by Jeremias Nunez on 5/10/13.\n// Copyright (c) 2013 Jeremias Nunez. All rights reser"
},
{
"path": "ArcBit/External/JNKeychain-master/JNKeychain.m",
"chars": 2227,
"preview": "//\n// JNKeychain.m\n//\n// Created by Jeremias Nunez on 5/10/13.\n// Copyright (c) 2013 Jeremias Nunez. All rights reser"
},
{
"path": "ArcBit/External/KeychainItemWrapper/KeychainItemWrapper.h",
"chars": 3122,
"preview": "/*\n File: KeychainItemWrapper.h\n Abstract: \n Objective-C wrapper for accessing a single keychain item.\n \n Version: "
},
{
"path": "ArcBit/External/KeychainItemWrapper/KeychainItemWrapper.m",
"chars": 14108,
"preview": "/*\n File: KeychainItemWrapper.m \n Abstract: \n Objective-C wrapper for accessing a single keychain item.\n \n Version"
},
{
"path": "ArcBit/External/LTHPasscodeViewController3.50/LTHKeychainUtils.h",
"chars": 2051,
"preview": "//\n// SFHFKeychainUtils.h\n//\n// Created by Buzz Andersen on 10/20/08.\n// Based partly on code by Jonathan Wight, Jon "
},
{
"path": "ArcBit/External/LTHPasscodeViewController3.50/LTHKeychainUtils.m",
"chars": 9180,
"preview": "//\n// SFHFKeychainUtils.m\n//\n\n// Created by Buzz Andersen on 10/20/08.\n// Based partly on code by Jonathan Wight, Jon"
},
{
"path": "ArcBit/External/LTHPasscodeViewController3.50/LTHPasscodeViewController.h",
"chars": 14121,
"preview": "//\n// PasscodeViewController.h\n// LTHPasscodeViewController\n//\n// Created by Roland Leth on 9/6/13.\n// Copyright (c)"
},
{
"path": "ArcBit/External/LTHPasscodeViewController3.50/LTHPasscodeViewController.m",
"chars": 67219,
"preview": "//\n// PasscodeViewController.m\n// LTHPasscodeViewController\n//\n// Created by Roland Leth on 9/6/13.\n// Copyright (c)"
},
{
"path": "ArcBit/External/Localizations/de.lproj/LTHPasscodeViewController.strings",
"chars": 729,
"preview": "/*\n LTHPasscodeViewController.strings\n */\n\"Enter Passcode\" = \"Pincode eingeben\";\n\n\"Enter your old passcode\" = \"Alten Pin"
},
{
"path": "ArcBit/External/Localizations/en.lproj/LTHPasscodeViewController.strings",
"chars": 682,
"preview": "/*\n LTHPasscodeViewController.strings\n */\n\"Enter Passcode\" = \"Enter Passcode\";\n\n\"Enter your old passcode\" = \"Enter your "
},
{
"path": "ArcBit/External/Localizations/es.lproj/LTHPasscodeViewController.strings",
"chars": 724,
"preview": "/*\n LTHPasscodeViewController.strings\n */\n\"Enter Passcode\" = \"Insertar contraseña\";\n\n\"Enter your old passcode\" = \"Insert"
},
{
"path": "ArcBit/External/Localizations/fr.lproj/LTHPasscodeViewController.strings",
"chars": 750,
"preview": "/*\n LTHPasscodeViewController.strings\n */\n\"Enter Passcode\" = \"Entrer votre mot de passe\";\n\n\"Enter your old passcode\" = \""
},
{
"path": "ArcBit/External/Localizations/ja.lproj/LTHPasscodeViewController.strings",
"chars": 556,
"preview": "/*\n LTHPasscodeViewController.strings\n */\n\"Enter Passcode\" = \"パスコードを入力\";\n\n\"Enter your old passcode\" = \"古いパスコードを入力\";\n\n\"En"
},
{
"path": "ArcBit/External/Localizations/ro.lproj/LTHPasscodeViewController.strings",
"chars": 674,
"preview": "/*\n LTHPasscodeViewController.strings\n */\n\"Enter Passcode\" = \"Introduceți parola\";\n\n\"Enter your old passcode\" = \"Introdu"
},
{
"path": "ArcBit/External/Localizations/ru.lproj/LTHPasscodeViewController.strings",
"chars": 684,
"preview": "/*\n LTHPasscodeViewController.strings\n */\n\"Enter Passcode\" = \"Введите пароль\";\n\n\"Enter your old passcode\" = \"Введите ста"
},
{
"path": "ArcBit/External/Localizations/zh-Hans-CN.lproj/LTHPasscodeViewController.strings",
"chars": 501,
"preview": "/*\n LTHPasscodeViewController.strings\n */\n\"Enter Passcode\" = \"输入密码\";\n\n\"Enter your old passcode\" = \"输入老的密码\";\n\n\"Enter your"
},
{
"path": "ArcBit/External/Localizations/zh-Hant.lproj/LTHPasscodeViewController.strings",
"chars": 501,
"preview": "/*\n LTHPasscodeViewController.strings\n */\n\"Enter Passcode\" = \"輸入密碼\";\n\n\"Enter your old passcode\" = \"輸入您的舊密碼\";\n\n\"Enter you"
},
{
"path": "ArcBit/External/MySocketRocketExtras/SRWebSocket+Helpers.h",
"chars": 1072,
"preview": "//\n// SRWebSocket+Helpers.h\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <st"
},
{
"path": "ArcBit/External/MySocketRocketExtras/SRWebSocket+Helpers.m",
"chars": 1516,
"preview": "//\n// SRWebSocket+Helpers.m\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <st"
},
{
"path": "ArcBit/External/NSDate-Extensions/NSDate-Utilities.h",
"chars": 2569,
"preview": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook 3.x and beyond\n BSD License, Use at your own risk\n *"
},
{
"path": "ArcBit/External/NSDate-Extensions/NSDate-Utilities.m",
"chars": 10865,
"preview": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook 3.x and beyond\n BSD License, Use at your own risk\n *"
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/DataMatrix.h",
"chars": 270,
"preview": "\n\n#import <Foundation/Foundation.h>\n\n\n@interface DataMatrix : NSObject {\n \n int dim;\n bool** data;\n\n}\n\n- (id)in"
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/DataMatrix.mm",
"chars": 1129,
"preview": "\n\n#import \"DataMatrix.h\"\n\n\n@implementation DataMatrix\n\n- (id)initWith:(int)dimension {\n if ([super init]) {\n s"
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QRCodeEncoderDemoViewController.h",
"chars": 224,
"preview": "//\n// QRCodeDemoViewController.h\n// QRCodeEncoderObjectiveCAtGithub\n//\n//\n\n#import <UIKit/UIKit.h>\n#import \"QREncoder."
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QRCodeEncoderDemoViewController.mm",
"chars": 1566,
"preview": "\n\n#import \"QRCodeEncoderDemoViewController.h\"\n\n\n@implementation QRCodeEncoderDemoViewController\n\n- (void)dealloc\n{\n ["
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QRCodeEncoderObjectiveCAtGithub-Prefix.pch",
"chars": 203,
"preview": "//\n// Prefix header for all source files of the 'QRCodeEncoderObjectiveCAtGithub' target in the 'QRCodeEncoderObjectiveC"
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QREncoder-Prefix.pch",
"chars": 159,
"preview": "//\n// Prefix header for all source files of the 'QREncoder' target in the 'QREncoder' project\n//\n\n#ifdef __OBJC__\n #i"
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QREncoder.h",
"chars": 1009,
"preview": "\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n#import <CommonCrypto/CommonCryptor.h>\n//#include \"QR_Encode"
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QREncoder.mm",
"chars": 7253,
"preview": "\n#import \"QREncoder.h\"\n#include \"QR_Encode.h\"\n\n@implementation QREncoder\n\n+ (NSData*)AESEncryptString:(NSString*)string "
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QR_Encode.cpp",
"chars": 58309,
"preview": "// QR_Encode.cpp : CQR_Encode NX Cve[V t@C\r\n// Date 2006/05/17\tVer. 1.22\tPsytec Inc.\r\n\r\n#include \"QR_Encode.h\"\r\n\r\n#ifdef"
},
{
"path": "ArcBit/External/QRCodeEncoderObjectiveCAtGithub/QR_Encode.h",
"chars": 3707,
"preview": "// QR_Encode.h : CQR_Encode NX錾уC^[tFCX`\r\n// Date 2006/05/17\tVer. 1.22\tPsytec Inc.\r\n\r\n\r\n#ifndef _QR_ENCODE_H\r\n#define _Q"
},
{
"path": "ArcBit/External/SocketRocket/NSData+SRB64Additions.h",
"chars": 734,
"preview": "//\n// Copyright 2012 Square Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "ArcBit/External/SocketRocket/NSData+SRB64Additions.m",
"chars": 1156,
"preview": "//\n// Copyright 2012 Square Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "ArcBit/External/SocketRocket/SRWebSocket.h",
"chars": 3463,
"preview": "//\n// Copyright 2012 Square Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "ArcBit/External/SocketRocket/SRWebSocket.m",
"chars": 56162,
"preview": "//\n// Copyright 2012 Square Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "ArcBit/External/SocketRocket/SocketRocket-Prefix.pch",
"chars": 753,
"preview": "//\n// Copyright 2012 Square Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "ArcBit/External/SocketRocket/base64.c",
"chars": 11259,
"preview": "/*\t$OpenBSD: base64.c,v 1.5 2006/10/21 09:55:03 otto Exp $\t*/\n\n/*\n * Copyright (c) 1996 by Internet Software Consortium."
},
{
"path": "ArcBit/External/SocketRocket/base64.h",
"chars": 914,
"preview": "// Copyright 2012 Square Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not"
},
{
"path": "ArcBit/External/TLCloudDocumentSyncWrapper/TLCloudDocumentSyncWrapper.h",
"chars": 1431,
"preview": "//\n// TLCloudDocumentSyncWrapper.h\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy "
},
{
"path": "ArcBit/External/TLCloudDocumentSyncWrapper/TLCloudDocumentSyncWrapper.m",
"chars": 3847,
"preview": "//\n// TLCloudDocumentSyncWrapper.m\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy "
},
{
"path": "ArcBit/External/UIAlertController+Blocks/UIAlertConrtoller+Blocks.m",
"chars": 14819,
"preview": "//\n// UIAlertController+Blocks.m\n// UIAlertControllerBlocks\n//\n// Created by Ryan Maxwell on 11/09/14.\n//\n// The MIT"
},
{
"path": "ArcBit/External/UIAlertController+Blocks/UIAlertController+Blocks.h",
"chars": 4980,
"preview": "//\n// UIAlertController+Blocks.h\n// UIAlertControllerBlocks\n//\n// Created by Ryan Maxwell on 11/09/14.\n//\n// The MIT"
},
{
"path": "ArcBit/External/UINavigationBar-FixedHeightWhenStatusBarHidden-master/UINavigationBar+FixedHeightWhenStatusBarHidden.h",
"chars": 1069,
"preview": "//\n// UINavigationBar+FixedHeightWhenStatusBarHidden.h\n//\n// Created by Vitaliy Ivanov on 7/30/14.\n// Copyright (c) 2"
},
{
"path": "ArcBit/External/UINavigationBar-FixedHeightWhenStatusBarHidden-master/UINavigationBar+FixedHeightWhenStatusBarHidden.m",
"chars": 1971,
"preview": "//\n// UINavigationBar+FixedHeightWhenStatusBarHidden.m\n//\n// Created by Vitaliy Ivanov on 7/30/14.\n// Copyright (c) 2"
},
{
"path": "ArcBit/External/iToast/iToast.h",
"chars": 3621,
"preview": "/*\n\niToast.h\n\nMIT LICENSE\n\nCopyright (c) 2012 Guru Software\n\nPermission is hereby granted, free of charge, to any person"
},
{
"path": "ArcBit/External/iToast/iToast.m",
"chars": 13959,
"preview": "/*\n\niToast.m\n\nMIT LICENSE\n\nCopyright (c) 2011 Guru Software\n\nPermission is hereby granted, free of charge, to any person"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SSLSecurity.swift",
"chars": 8879,
"preview": "//////////////////////////////////////////////////////////////////////////////////////////////////\n//\n// SSLSecurity.sw"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketAckEmitter.swift",
"chars": 4330,
"preview": "//\n// SocketAckEmitter.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 9/16/15.\n//\n// Permission is "
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketAckManager.swift",
"chars": 2808,
"preview": "//\n// SocketAckManager.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 4/3/15.\n//\n// Permission is h"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketAnyEvent.swift",
"chars": 1727,
"preview": "//\n// SocketAnyEvent.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 3/28/15.\n//\n// Permission is he"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketClientManager.swift",
"chars": 3322,
"preview": "//\n// SocketClientManager.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 6/11/16.\n//\n// Permission "
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketEngine.swift",
"chars": 21382,
"preview": "//\n// SocketEngine.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 3/3/15.\n//\n// Permission is hereb"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketEngineClient.swift",
"chars": 2118,
"preview": "//\n// SocketEngineClient.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 3/19/15.\n//\n// Permission i"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketEnginePacketType.swift",
"chars": 1584,
"preview": "//\n// SocketEnginePacketType.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 10/7/15.\n//\n// Permissi"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketEnginePollable.swift",
"chars": 8576,
"preview": "//\n// SocketEnginePollable.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 1/15/16.\n//\n// Permission"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketEngineSpec.swift",
"chars": 6103,
"preview": "//\n// SocketEngineSpec.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 10/7/15.\n//\n// Permission is "
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketEngineWebsocket.swift",
"chars": 3234,
"preview": "//\n// SocketEngineWebsocket.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 1/15/16.\n//\n// Permissio"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketEventHandler.swift",
"chars": 1488,
"preview": "//\n// EventHandler.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 1/18/15.\n//\n// Permission is here"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketExtensions.swift",
"chars": 4795,
"preview": "//\n// SocketExtensions.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 7/1/2016.\n//\n// Permission is"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketIOClient.swift",
"chars": 21507,
"preview": "//\n// SocketIOClient.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 11/23/14.\n//\n// Permission is h"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketIOClientConfiguration.swift",
"chars": 4068,
"preview": "//\n// SocketIOClientConfiguration.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 8/13/16.\n//\n// Per"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketIOClientOption.swift",
"chars": 7498,
"preview": "//\n// SocketIOClientOption .swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 10/17/15.\n//\n// Permissi"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketIOClientSpec.swift",
"chars": 2581,
"preview": "//\n// SocketIOClientSpec.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 1/3/16.\n//\n// Permission is"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketIOClientStatus.swift",
"chars": 1614,
"preview": "//\n// SocketIOClientStatus.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 8/14/15.\n//\n// Permission"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketLogger.swift",
"chars": 2976,
"preview": "//\n// SocketLogger.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 4/11/15.\n//\n// Permission is here"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketPacket.swift",
"chars": 6738,
"preview": "//\n// SocketPacket.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 1/18/15.\n//\n// Permission is here"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketParsable.swift",
"chars": 6188,
"preview": "//\n// SocketParsable.swift\n// Socket.IO-Client-Swift\n//\n// Permission is hereby granted, free of charge, to any perso"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketStringReader.swift",
"chars": 2659,
"preview": "//\n// SocketStringReader.swift\n// Socket.IO-Client-Swift\n//\n// Created by Lukas Schmidt on 07.09.15.\n//\n// Permissio"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/SocketTypes.swift",
"chars": 2767,
"preview": "//\n// SocketTypes.swift\n// Socket.IO-Client-Swift\n//\n// Created by Erik Little on 4/8/15.\n//\n// Permission is hereby"
},
{
"path": "ArcBit/External/socket.io-client-swift-10.0.0/Source/WebSocket.swift",
"chars": 39492,
"preview": "//////////////////////////////////////////////////////////////////////////////////////////////////\n//\n// Websocket.swif"
},
{
"path": "ArcBit/Images.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1086,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "ArcBit/Images.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "ArcBit/Images.xcassets/home3.imageset/Contents.json",
"chars": 340,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "ArcBit/Images.xcassets/lifebuoy.imageset/Contents.json",
"chars": 346,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "ArcBit/Images.xcassets/link.imageset/Contents.json",
"chars": 338,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "ArcBit/Images.xcassets/twitter.imageset/Contents.json",
"chars": 344,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "ArcBit/Images.xcassets/vault.imageset/Contents.json",
"chars": 372,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"vault.png\",\n \"scale\" : \"1x\"\n },\n {\n "
},
{
"path": "ArcBit/InAppSettings.bundle/Advanced.plist",
"chars": 4230,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ArcBit/InAppSettings.bundle/Root.plist",
"chars": 22081,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ArcBit/InAppSettings.bundle/de.lproj/Root.strings",
"chars": 12728,
"preview": "\"DEFAULT_CURRENCY\" = \"Währung\";\n\"DEFAULT_CURRENCY_1\" = \"$ - AUD\";\n\"DEFAULT_CURRENCY_2\" = \"R"
},
{
"path": "ArcBit/InAppSettings.bundle/es.lproj/Root.strings",
"chars": 13107,
"preview": "\"DEFAULT_CURRENCY\" = \"Moneda\";\n\"DEFAULT_CURRENCY_1\" = \"$ - AUD\";\n\"DEFAULT_CURRENCY_2\" = \"R$"
},
{
"path": "ArcBit/Info.plist",
"chars": 1800,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ArcBit/de.lproj/Localizable.strings",
"chars": 53088,
"preview": "\"\" = \"\";\n\n\"%@ is not allowed to access the camera\" = \"%@ darf nicht auf die Kamera zugreifen\";\n\n\"%@ servers not reachabl"
},
{
"path": "ArcBit/es.lproj/Localizable.strings",
"chars": 56118,
"preview": "\"\" = \"\";\n\n\"%@ is not allowed to access the camera\" = \"%@ no está permitido acceder a la cámara\";\n\n\"%@ servers not reacha"
},
{
"path": "ArcBit/model/TLAccountObject.swift",
"chars": 80293,
"preview": "//\n// TLAccountObject.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <st"
},
{
"path": "ArcBit/model/TLAccounts.swift",
"chars": 10868,
"preview": "//\n// TLAccounts.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequal"
},
{
"path": "ArcBit/model/TLAchievements.swift",
"chars": 1643,
"preview": "//\n// TLAchievements.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <ste"
},
{
"path": "ArcBit/model/TLAnalytics.swift",
"chars": 16429,
"preview": "//\n// TLAnalytics.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequa"
},
{
"path": "ArcBit/model/TLBlockchainStatus.swift",
"chars": 1319,
"preview": "//\n// TLBlockchainStatus.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee "
},
{
"path": "ArcBit/model/TLCoin.swift",
"chars": 6650,
"preview": "//\n// TLCoin.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequald01@"
},
{
"path": "ArcBit/model/TLColdWallet.swift",
"chars": 9784,
"preview": "//\n// TLColdWallet.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequ"
},
{
"path": "ArcBit/model/TLCoreBitcoinWrapper.swift",
"chars": 9458,
"preview": "//\n// TLCoreBitcoinWrapper.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Le"
},
{
"path": "ArcBit/model/TLCrypto.swift",
"chars": 5153,
"preview": "//\n// TLCrypto.swift\n// ArcBit\n//\n// Created by Tim Lee on 8/10/15.\n// Copyright (c) 2015 ArcBit. All rights reserve"
},
{
"path": "ArcBit/model/TLCurrencyFormat.swift",
"chars": 13357,
"preview": "//\n// TLCurrencyFormat.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <s"
},
{
"path": "ArcBit/model/TLDisplayStrings.swift",
"chars": 60655,
"preview": "//\n// TLDisplayStrings.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <s"
},
{
"path": "ArcBit/model/TLHDWalletWrapper.swift",
"chars": 7713,
"preview": "//\n// TLHDWalletWrapper.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <"
},
{
"path": "ArcBit/model/TLHelpDoc.swift",
"chars": 28653,
"preview": "//\n// TLHelpDoc.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequald"
},
{
"path": "ArcBit/model/TLImportedAddress.swift",
"chars": 14829,
"preview": "//\n// TLImportedAddress.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <"
},
{
"path": "ArcBit/model/TLImportedAddresses.swift",
"chars": 16487,
"preview": "//\n// TLImportedAddresses.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee"
},
{
"path": "ArcBit/model/TLOperationsManager.swift",
"chars": 5593,
"preview": "//\n// TLOperationsManager.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee"
},
{
"path": "ArcBit/model/TLPreferences.swift",
"chars": 30502,
"preview": "//\n// TLPreferences.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <steq"
},
{
"path": "ArcBit/model/TLSelectedObject.swift",
"chars": 5928,
"preview": "//\n// TLSelectedObject.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <s"
},
{
"path": "ArcBit/model/TLSendFormData.swift",
"chars": 2237,
"preview": "//\n// TLSendFormData.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <ste"
},
{
"path": "ArcBit/model/TLSpaghettiGodSend.swift",
"chars": 36927,
"preview": "//\n// TLSpaghettiGodSend.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee "
},
{
"path": "ArcBit/model/TLStealthAddress.swift",
"chars": 10602,
"preview": "//\n// TLStealthAddress.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <s"
},
{
"path": "ArcBit/model/TLStealthWallet.swift",
"chars": 31115,
"preview": "//\n// TLStealthWallet.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <st"
},
{
"path": "ArcBit/model/TLSuggestions.swift",
"chars": 12101,
"preview": "//\n// TLSuggestions.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <steq"
},
{
"path": "ArcBit/model/TLTxObject.swift",
"chars": 7885,
"preview": "//\n// TLTxObject.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequal"
},
{
"path": "ArcBit/model/TLWallet+Stealth.swift",
"chars": 17805,
"preview": "//\n// TLWallet+Stealth.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <s"
},
{
"path": "ArcBit/model/TLWallet.swift",
"chars": 69947,
"preview": "//\n// TLWallet.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequald0"
},
{
"path": "ArcBit/model/TLWalletConfig.swift",
"chars": 277,
"preview": "//\n// TLWalletConfig.swift\n// ArcBit\n//\n// Created by Tim Lee on 8/27/15.\n// Copyright (c) 2015 ArcBit. All rights r"
},
{
"path": "ArcBit/model/TLWalletJSONKeys.swift",
"chars": 3833,
"preview": "//\n// TLWalletJsonKeys.swift\n// ArcBit\n//\n// Created by Tim Lee on 9/22/15.\n// Copyright © 2015 ArcBit. All rights r"
},
{
"path": "ArcBit/model/TLWalletJson.swift",
"chars": 6152,
"preview": "//\n// TLWalletJson.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <stequ"
},
{
"path": "ArcBit/model/TLWalletPassphrase.swift",
"chars": 3159,
"preview": "//\n// TLWalletPassphrase.swift\n// ArcBit\n//\n// Created by Tim Lee on 8/10/15.\n// Copyright (c) 2015 ArcBit. All righ"
},
{
"path": "ArcBit/model/TLWalletUtils.swift",
"chars": 7387,
"preview": "//\n// TLWalletUtils.swift\n// ArcBit\n//\n// Created by Timothy Lee on 3/14/15.\n// Copyright (c) 2015 Timothy Lee <steq"
}
]
// ... and 411 more files (download for full content)
About this extraction
This page contains the full source code of the arcbit/arcbit-ios GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 611 files (52.4 MB), approximately 1.8M tokens, and a symbol index with 481 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.