diff --git a/PivxWallet/BRPeer.m b/PivxWallet/BRPeer.m index a76b8da6..c5be411b 100644 --- a/PivxWallet/BRPeer.m +++ b/PivxWallet/BRPeer.m @@ -40,8 +40,8 @@ #define MAX_MSG_LENGTH 0x02000000 #define MAX_GETDATA_HASHES 50000 #define ENABLED_SERVICES 0 // we don't provide full blocks to remote nodes -#define PROTOCOL_VERSION 70918 -#define MIN_PROTO_VERSION 70918 // peers earlier than this protocol version not supported (need v0.9 txFee relay rules) +#define PROTOCOL_VERSION 70921 +#define MIN_PROTO_VERSION 70921 // peers earlier than this protocol version not supported (need v0.9 txFee relay rules) #define LOCAL_HOST 0x7f000001 #define CONNECT_TIMEOUT 3.0 #define MEMPOOL_TIMEOUT 5.0 diff --git a/PivxWallet/BRPeerManager.m b/PivxWallet/BRPeerManager.m index a462944c..91f86176 100644 --- a/PivxWallet/BRPeerManager.m +++ b/PivxWallet/BRPeerManager.m @@ -66,24 +66,28 @@ // blockchain checkpoints - these are also used as starting points for partial chain downloads, so they need to be at // difficulty transition boundaries in order to verify the block difficulty at the immediately following transition static const struct { uint32_t height; const char *hash; uint32_t timestamp; uint32_t target; } checkpoint_array[] = { - { 0, "0000041e482b9b9691d98eefb48473405c0b8ec31b76df3797c74a78680ef818", 1454124731, 0x1e0ffff0u }, - {259201, "1c9121bf9329a6234bfd1ea2d91515f19cd96990725265253f4b164283ade5dd", 1471401614, 0x1c056dacu }, - {424998, "f31e381eedb0ed3ed65fcc98cc71f36012bee32e8efd017c4f9fb0620fd35f6b", 1481590494, 0x1a57f411u }, - {616764, "29dd0bd1c59484f290896687b4ffb6a49afa5c498caf61967c69a541f8191557", 1493231313, 0x1a4d346du }, - {623933, "c7aafa648a0f1450157dc93bd4d7448913a85b7448f803b4ab970d91fc2a7da7", 1493667067, 0x1a3f78c0u}, - {791150, "8e76f462e4e82d1bd21cb72e1ce1567d4ddda2390f26074ffd1f5d9c270e5e50", 1503804886, 0x1b009695u}, - {795000, "4423cceeb9fd574137a18733416275a70fdf95283cc79ad976ca399aa424a443", 1504047699, 0x1a7a548fu}, - {863787, "5b2482eca24caf2a46bb22e0545db7b7037282733faa3a42ec20542509999a64", 1508214671, 0x1a682047u}, - {863795, "2ad866818c4866e0d555181daccc628056216c0db431f88a825e84ed4f469067", 1508217664, 0x1b020221u}, - {863805, "a755bd9a22b63c70d3db474f4b2b61a1f86c835b290a081bb3ec1ba2103eb4cb", 1508219189, 0x1b049119u}, - {895400, "7796a0274a608fac12d400198174e50beda992c1d522e52e5b95b884bc1beac6", 1510179528, 0x1a75c1eau}, - {895991, "d53013ed7ea5c325b9696c95e07667d6858f8ff7ee13fecfa90827bf3c9ae316", 1510216596, 0x1b00f83au}, - {908000, "202708f8c289b676fceb832a079ff6b308a28608339acbf7584de533619d014d", 1510948627, 0x1a74dca4u}, + { 0, "0000041e482b9b9691d98eefb48473405c0b8ec31b76df3797c74a78680ef818", 1454124731, 0x1e0ffff0u}, + { 259201, "1c9121bf9329a6234bfd1ea2d91515f19cd96990725265253f4b164283ade5dd", 1471401614, 0x1c056dacu}, + { 424998, "f31e381eedb0ed3ed65fcc98cc71f36012bee32e8efd017c4f9fb0620fd35f6b", 1481590494, 0x1a57f411u}, + { 616764, "29dd0bd1c59484f290896687b4ffb6a49afa5c498caf61967c69a541f8191557", 1493231313, 0x1a4d346du}, + { 623933, "c7aafa648a0f1450157dc93bd4d7448913a85b7448f803b4ab970d91fc2a7da7", 1493667067, 0x1a3f78c0u}, + { 791150, "8e76f462e4e82d1bd21cb72e1ce1567d4ddda2390f26074ffd1f5d9c270e5e50", 1503804886, 0x1b009695u}, + { 795000, "4423cceeb9fd574137a18733416275a70fdf95283cc79ad976ca399aa424a443", 1504047699, 0x1a7a548fu}, + { 863787, "5b2482eca24caf2a46bb22e0545db7b7037282733faa3a42ec20542509999a64", 1508214671, 0x1a682047u}, + { 863795, "2ad866818c4866e0d555181daccc628056216c0db431f88a825e84ed4f469067", 1508217664, 0x1b020221u}, + { 863805, "a755bd9a22b63c70d3db474f4b2b61a1f86c835b290a081bb3ec1ba2103eb4cb", 1508219189, 0x1b049119u}, + { 895400, "7796a0274a608fac12d400198174e50beda992c1d522e52e5b95b884bc1beac6", 1510179528, 0x1a75c1eau}, + { 895991, "d53013ed7ea5c325b9696c95e07667d6858f8ff7ee13fecfa90827bf3c9ae316", 1510216596, 0x1b00f83au}, + { 908000, "202708f8c289b676fceb832a079ff6b308a28608339acbf7584de533619d014d", 1510948627, 0x1a74dca4u}, {1142400, "98aff9d605bf123247f98b1e3a02567eb5799d208d78ec30fb89737b1c1f79c5", 1525106065, 0x1a4ab81cu}, {1679090, "f747ce055ba1b12e1f2e842bd480bc647210799359cb2e553ab292065e3419d6", 1551490853, 0x1b008da5u}, {1686229, "bb42bf1e886a7c23474634c90893dd3d68a6ccbfea4ac92a98da5cad0c6a6cb7", 1551924791, 0x1a6b18a8u}, {1778954, "0d3241268264a2908d6babf00d9cd1ffb83d93d7bb4e428820127fe227c2029c", 1556529343, 0x1b009528u}, - {1788528, "ea9243ff8fc079fdd7a04f11fac415de4d98e1bb0dc38db6f79f8f8bbfdbe496", 1556924938, 0x1b00cf96u} + {1788528, "ea9243ff8fc079fdd7a04f11fac415de4d98e1bb0dc38db6f79f8f8bbfdbe496", 1556924938, 0x1b00cf96u}, + {2153200, "14e477e597d24549cac5e59d97d32155e6ec2861c1003b42d0566f9bf39b65d5", 1578332625, 0x1b0646bau}, + {2356049, "62e80d8e193bca84655fb78893b20f54a79f2d71124c4ea37b7ef51a0d5451c4", 1590808140, 0x1b05e2e6u}, + {2365700, "b5d0beead57735539abc2db2b0b08cd65db3e5928efd3c3bf3182d5bf013f36c", 1591401645, 0x1b074b5bu}, + {2678402, "580a26ff0a45177a7a6f387f009c5b26140ea48b4790a857d9a796f8b3c25899", 1610635380, 0x1b086a56u} }; static const char *dns_seeds[] = { diff --git a/PivxWallet/BRWalletManager.m b/PivxWallet/BRWalletManager.m index 04a5c661..59053811 100644 --- a/PivxWallet/BRWalletManager.m +++ b/PivxWallet/BRWalletManager.m @@ -52,7 +52,7 @@ #define BITCOIN_TICKER_URL @"https://bitpay.com/rates" // PIVX is not in Poloniex yet ;P //#define POLONIEX_TICKER_URL @"https://poloniex.com/public?command=returnOrderBook¤cyPair=BTC_PIVX&depth=1" -#define COINMARKETCAP_TICKER_URL @"https://api.coinmarketcap.com/v1/ticker/pivx/" +#define COINGECKO_TICKER_URL @"https://api.coingecko.com/api/v3/coins/pivx?localization=false&tickers=false&community_data=false&developer_data=false&sparkline=false" #define TICKER_REFRESH_TIME 60.0 #define SEED_ENTROPY_LENGTH (256/8) @@ -258,7 +258,12 @@ - (instancetype)init stringByReplacingCharactersInRange:[self.dashFormat.positiveFormat rangeOfString:@"#"] withString:@"-#"]; self.dashFormat.currencyCode = @"PIVX"; - self.dashFormat.currencySymbol = PIVX NARROW_NBSP; + if (@available(iOS 13.0, *)) { + self.dashFormat.currencySymbol = PIVX; + } + else { + self.dashFormat.currencySymbol = PIVX NARROW_NBSP; + } self.dashFormat.maximumFractionDigits = 8; self.dashFormat.minimumFractionDigits = 0; // iOS 8 bug, minimumFractionDigits now has to be set after currencySymbol self.dashFormat.maximum = @(MAX_MONEY/(int64_t)pow(10.0, self.dashFormat.maximumFractionDigits)); @@ -271,7 +276,11 @@ - (instancetype)init stringByReplacingCharactersInRange:[self.dashFormat.positiveFormat rangeOfString:@"#"] withString:@"-#"]; self.dashSignificantFormat.currencyCode = @"PIVX"; - self.dashSignificantFormat.currencySymbol = PIVX NARROW_NBSP; + if (@available(iOS 13.0, *)) { + self.dashSignificantFormat.currencySymbol = PIVX; + } else { + self.dashSignificantFormat.currencySymbol = PIVX NARROW_NBSP; + } self.dashSignificantFormat.usesSignificantDigits = TRUE; self.dashSignificantFormat.minimumSignificantDigits = 1; self.dashSignificantFormat.maximumSignificantDigits = 6; @@ -287,7 +296,11 @@ - (instancetype)init stringByReplacingCharactersInRange:[self.bitcoinFormat.positiveFormat rangeOfString:@"#"] withString:@"-#"]; self.bitcoinFormat.currencyCode = @"BTC"; - self.bitcoinFormat.currencySymbol = BTC NARROW_NBSP; + if (@available(iOS 13.0, *)) { + self.bitcoinFormat.currencySymbol = BTC; + } else { + self.bitcoinFormat.currencySymbol = BTC NARROW_NBSP; + } self.bitcoinFormat.maximumFractionDigits = 8; self.bitcoinFormat.minimumFractionDigits = 0; // iOS 8 bug, minimumFractionDigits now has to be set after currencySymbol self.bitcoinFormat.maximum = @(MAX_MONEY/(int64_t)pow(10.0, self.bitcoinFormat.maximumFractionDigits)); @@ -325,10 +338,39 @@ - (instancetype)init } } }]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWillShow:) + name:UIKeyboardWillShowNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWillHide:) + name:UIKeyboardWillHideNotification + object:nil]; + if ([UIApplication sharedApplication].protectedDataAvailable) [self protectedInit]; return self; } +bool responder = false; + +-(void)keyboardWillShow:(NSNotification *)notification +{ + if ([self pinAlertControllerIsVisible] && responder) { + responder = false; + [_pinField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0]; + } +} + +-(void)keyboardWillHide:(NSNotification *)notification +{ + if ([self pinAlertControllerIsVisible]) { + responder = true; + if (_pinField) + [_pinField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0]; + } +} + - (void)protectedInit { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; @@ -1289,7 +1331,7 @@ - (void)updateDashExchangeRate if (self.reachability.currentReachabilityStatus == NotReachable) return; - NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:COINMARKETCAP_TICKER_URL] + NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:COINGECKO_TICKER_URL] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0]; [[[NSURLSession sharedSession] dataTaskWithRequest:req @@ -1308,15 +1350,16 @@ - (void)updateDashExchangeRate if (now > self.secureTime) [defs setDouble:now forKey:SECURE_TIME_KEY]; } NSError *error = nil; - NSArray *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; - NSDictionary* jsonData = json.firstObject; - NSString * lastPrice = [jsonData objectForKey:@"price_btc"]; + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; + NSDictionary *marketData = json[@"market_data"]; + NSDictionary *priceData = marketData[@"current_price"]; + NSNumber * lastPrice = priceData[@"btc"]; NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; NSLocale *usa = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; numberFormatter.locale = usa; numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; - NSNumber *lastTradePriceNumber = [numberFormatter numberFromString:lastPrice]; + NSNumber *lastTradePriceNumber = [numberFormatter numberFromString:lastPrice.stringValue]; [defs setObject:lastTradePriceNumber forKey:POLONIEX_DASH_BTC_PRICE_KEY]; [defs setObject:[NSDate date] forKey:POLONIEX_DASH_BTC_UPDATE_TIME_KEY]; [defs synchronize]; diff --git a/PivxWallet/Base.lproj/Main.storyboard b/PivxWallet/Base.lproj/Main.storyboard index bb7032e6..a3619e92 100644 --- a/PivxWallet/Base.lproj/Main.storyboard +++ b/PivxWallet/Base.lproj/Main.storyboard @@ -2018,7 +2018,7 @@ This app is open source: diff --git a/PivxWallet/Info.plist b/PivxWallet/Info.plist index 6326bd1a..df2ab05c 100644 --- a/PivxWallet/Info.plist +++ b/PivxWallet/Info.plist @@ -50,7 +50,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.1.2 + 1.1.6 CFBundleSignature ???? CFBundleURLTypes @@ -87,7 +87,7 @@ CFBundleVersion - 18 + 22 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/PivxWallet/en.lproj/Localizable.strings b/PivxWallet/en.lproj/Localizable.strings index 585519ae..e81b78fe 100644 --- a/PivxWallet/en.lproj/Localizable.strings +++ b/PivxWallet/en.lproj/Localizable.strings @@ -245,6 +245,12 @@ /* No comment provided by engineer. */ "Exit" = "Exit"; +/* No comment provided by engineer. */ +"Face ID limit" = "Face ID limit"; + +/* No comment provided by engineer. */ +"Face ID spending limit" = "Face ID spending limit"; + /* No comment provided by engineer. */ "Failed wallet update" = "Failed wallet update"; diff --git a/PivxWallet/en.lproj/Main.strings b/PivxWallet/en.lproj/Main.strings index 12497aac..ecda9875 100644 --- a/PivxWallet/en.lproj/Main.strings +++ b/PivxWallet/en.lproj/Main.strings @@ -41,8 +41,8 @@ /* Class = "UILabel"; text = "Start/Recover Another Wallet"; ObjectID = "D1b-HB-lKH"; */ "D1b-HB-lKH.text" = "Start/Recover Another Wallet"; -/* Class = "UILabel"; text = "Exchange rate data provided by\ncoinmarketcap.com"; ObjectID = "D4H-hd-LsX"; */ -"D4H-hd-LsX.text" = "Exchange rate data provided by\ncoinmarketcap.com"; +/* Class = "UILabel"; text = "Exchange rate data provided by\ncoingecko.com"; ObjectID = "D4H-hd-LsX"; */ +"D4H-hd-LsX.text" = "Exchange rate data provided by\ncoingecko.com"; /* Class = "UIButton"; normalTitle = "New wallet"; ObjectID = "dOa-zm-TDG"; */ "dOa-zm-TDG.normalTitle" = "New wallet";