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";