wownero
/
wownerujo
Archived
4
0
Fork 0

fix restore height bug

openssl-1.1.0
fuwa 6 years ago
parent 5d5a4d1b46
commit c19189f37b

@ -396,22 +396,16 @@ public class GenerateFragment extends Fragment {
long height = 0;
String restoreHeight = etWalletRestoreHeight.getEditText().getText().toString().trim();
Timber.d("Restore Height string %s", restoreHeight);
if (restoreHeight.isEmpty()) return -1;
try {
// is it a date?
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM");
parser.setLenient(false);
height = RestoreHeight.getInstance().getHeight(parser.parse(restoreHeight));
} catch (ParseException ex) {
Timber.d("Failed to parse %s, %s", restoreHeight, ex);
}
if (height <= 0)
try {
// is it a date without dashes?
SimpleDateFormat parser = new SimpleDateFormat("yyyyMMdd");
parser.setLenient(false);
height = RestoreHeight.getInstance().getHeight(parser.parse(restoreHeight));
} catch (ParseException ex) {
}
if (height <= 0)
try {
// or is it a height?

@ -24,6 +24,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import timber.log.Timber;
public class RestoreHeight {
static private RestoreHeight Singleton = null;
@ -42,79 +43,44 @@ public class RestoreHeight {
private Map<String, Long> blockheight = new HashMap<>();
RestoreHeight() {
blockheight.put("2018-05-01", 8000L);
blockheight.put("2018-06-01", 17000L);
blockheight.put("2018-07-01", 25000L);
blockheight.put("2018-08-01", 34000L);
blockheight.put("2018-09-01", 43000L);
blockheight.put("2018-10-01", 52000L);
blockheight.put("2018-05", 8000L);
blockheight.put("2018-06", 17000L);
blockheight.put("2018-07", 25000L);
blockheight.put("2018-08", 34000L);
blockheight.put("2018-09", 43000L);
blockheight.put("2018-10", 52000L);
}
public long getHeight(String date) {
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
parser.setTimeZone(TimeZone.getTimeZone("UTC"));
parser.setLenient(false);
try {
return getHeight(parser.parse(date));
} catch (ParseException ex) {
throw new IllegalArgumentException(ex);
}
}
long latestHeight = 52000L;
public long getHeight(final Date date) {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.set(Calendar.DST_OFFSET, 0);
Timber.d("Restore Height date %s", date);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DAY_OF_MONTH, -4); // give it some leeway
Timber.d("Restore Height cal %s", cal);
if (cal.get(Calendar.YEAR) < 2018)
return 0;
if ((cal.get(Calendar.YEAR) == 2018) && (cal.get(Calendar.MONTH) <= 4))
// Month is 0 based
// https://stackoverflow.com/a/7183009
if ((cal.get(Calendar.YEAR) == 2018) && ((cal.get(Calendar.MONTH) + 1) <= 4))
// before Apr 2018
return 0;
Calendar query = (Calendar) cal.clone();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String queryDate = formatter.format(date);
Timber.d("String query date %s", queryDate);
cal.set(Calendar.DAY_OF_MONTH, 1);
long prevTime = cal.getTimeInMillis();
String prevDate = formatter.format(prevTime);
// lookup blockheight at first of the month
Long prevBc = blockheight.get(prevDate);
if (prevBc == null) {
// if too recent, go back in time and find latest one we have
while (prevBc == null) {
cal.add(Calendar.MONTH, -1);
if (cal.get(Calendar.YEAR) < 2018) {
throw new IllegalStateException("endless loop looking for blockheight");
}
prevTime = cal.getTimeInMillis();
prevDate = formatter.format(prevTime);
prevBc = blockheight.get(prevDate);
}
}
long height = prevBc;
// now we have a blockheight & a date ON or BEFORE the restore date requested
if (queryDate.equals(prevDate)) return height;
// see if we have a blockheight after this date
cal.add(Calendar.MONTH, 1);
long nextTime = cal.getTimeInMillis();
String nextDate = formatter.format(nextTime);
Long nextBc = blockheight.get(nextDate);
if (nextBc != null) { // we have a range - interpolate the blockheight we are looking for
long diff = nextBc - prevBc;
long diffDays = TimeUnit.DAYS.convert(nextTime - prevTime, TimeUnit.MILLISECONDS);
long days = TimeUnit.DAYS.convert(query.getTimeInMillis() - prevTime,
TimeUnit.MILLISECONDS);
height = Math.round(prevBc + diff * (1.0 * days / diffDays));
long height = 0;
if (blockheight.get(queryDate) == null) {
height = latestHeight;
} else {
long days = TimeUnit.DAYS.convert(query.getTimeInMillis() - prevTime,
TimeUnit.MILLISECONDS);
height = Math.round(prevBc + 1.0 * days * (24 * 60 / 2));
height = blockheight.get(queryDate);
}
return height;
}
}

@ -171,7 +171,7 @@
<string name="generate_wallet_created">Το Πορτοφόλι δημιουργήθηκε</string>
<string name="generate_wallet_create_failed">Η δημιουργία πορτοφολιού απέτυχε</string>
<string name="generate_restoreheight_error">Βάλε αριθμό ή ημερομηνία (YYYY-MM-DD δλδ χρονιά-μήνας-μέρα)</string>
<string name="generate_restoreheight_error">Βάλε αριθμό ή ημερομηνία (YYYY-MM δλδ χρονιά-μήνας-μέρα)</string>
<string name="generate_wallet_type_key">Κλειδιά</string>
<string name="generate_wallet_type_new">Νέο</string>
@ -182,7 +182,7 @@
<string name="generate_viewkey_hint">Κλειδί Προβολής(View Key)</string>
<string name="generate_spendkey_hint">Κλειδί Ξοδεύματος(Spend Key)</string>
<string name="generate_mnemonic_hint">Μνημονικός Σπόρος(Mnemonic Seed) 25-Λέξεων</string>
<string name="generate_restoreheight_hint">Ύψος ανάκτησης ή Ημερομηνία (YYYY-MM-DD δλδ χρονιά-μήνας-μέρα)</string>
<string name="generate_restoreheight_hint">Ύψος ανάκτησης ή Ημερομηνία (YYYY-MM δλδ χρονιά-μήνας-μέρα)</string>
<string name="generate_address_label">Δημόσια Διεύθυνση(Public Address)</string>
<string name="generate_viewkey_label">Κλειδί προβολής(View Key)</string>

@ -153,7 +153,7 @@
<string name="generate_viewkey_hint">Clave de Vista</string>
<string name="generate_spendkey_hint">Clave de Gasto</string>
<string name="generate_mnemonic_hint">Semilla Mnemotécnica de 25 Palabras</string>
<string name="generate_restoreheight_hint">Altura o Fecha (YYYY-MM-DD) de Restauración</string>
<string name="generate_restoreheight_hint">Altura o Fecha (YYYY-MM) de Restauración</string>
<string name="generate_address_label">Dirección Pública</string>
<string name="generate_viewkey_label">Clave de Vista</string>

@ -200,7 +200,7 @@
<string name="generate_wallet_created">Portefeuille créé</string>
<string name="generate_wallet_create_failed">Création du Portefeuille échouée</string>
<string name="generate_restoreheight_error">Entrer un nombre ou une date (YYYY-MM-DD)</string>
<string name="generate_restoreheight_error">Entrer un nombre ou une date (YYYY-MM)</string>
<string name="generate_wallet_type_key">Clefs</string>
<string name="generate_wallet_type_new">Nouveau</string>
@ -211,7 +211,7 @@
<string name="generate_viewkey_hint">Clef d\'audit</string>
<string name="generate_spendkey_hint">Clef de dépense</string>
<string name="generate_mnemonic_hint">Phrase Mnémonique</string>
<string name="generate_restoreheight_hint">Hauteur ou date de restauration (YYYY-MM-DD)</string>
<string name="generate_restoreheight_hint">Hauteur ou date de restauration (YYYY-MM)</string>
<string name="generate_address_label">Adresse publique</string>
<string name="generate_viewkey_label">Clef d\'audit</string>

@ -199,7 +199,7 @@
<string name="generate_wallet_created">Кошелек создан</string>
<string name="generate_wallet_create_failed">Не удалось создать кошелек</string>
<string name="generate_restoreheight_error">Введите номер блока или дату (YYYY-MM-DD)</string>
<string name="generate_restoreheight_error">Введите номер блока или дату (YYYY-MM)</string>
<string name="generate_wallet_type_key">Ключ</string>
<string name="generate_wallet_type_new">Новый</string>
@ -210,13 +210,13 @@
<string name="generate_viewkey_hint">View Key</string>
<string name="generate_spendkey_hint">Spend Key</string>
<string name="generate_mnemonic_hint">25-Word Mnemonic Seed</string>
<string name="generate_restoreheight_hint">Restore Height or Date (YYYY-MM-DD)</string>
<string name="generate_restoreheight_hint">Restore Height or Date (YYYY-MM)</string>
<string name="generate_address_label">Публичный адрес</string>
<string name="generate_viewkey_label">Ключ просмотра</string>
<string name="generate_spendkey_label">Ключ траты</string>
<string name="generate_mnemonic_label">Мнемоническая фраза</string>
<string name="generate_crazypass_label">Дата высоты восстановления (YYYY-MM-DD)</string>
<string name="generate_crazypass_label">Дата высоты восстановления (YYYY-MM)</string>
<string name="generate_check_key">Введите действующий ключ</string>
<string name="generate_check_address">Введите действующий адрес</string>

@ -194,7 +194,7 @@
<string name="generate_wallet_created">钱包已建立</string>
<string name="generate_wallet_create_failed">钱包建立失败</string>
<string name="generate_restoreheight_error">输入区块高度或日期(YYYY-MM-DD)</string>
<string name="generate_restoreheight_error">输入区块高度或日期(YYYY-MM)</string>
<string name="generate_wallet_type_key">密钥</string>
<string name="generate_wallet_type_new">新增</string>
@ -205,7 +205,7 @@
<string name="generate_viewkey_hint">查看密钥</string>
<string name="generate_spendkey_hint">花费密钥</string>
<string name="generate_mnemonic_hint">25字记忆种子码</string>
<string name="generate_restoreheight_hint">从区块高度或日期(YYYY-MM-DD)恢复</string>
<string name="generate_restoreheight_hint">从区块高度或日期(YYYY-MM)恢复</string>
<string name="generate_address_label">公开地址</string>
<string name="generate_viewkey_label">查看密钥</string>

@ -196,7 +196,7 @@
<string name="generate_wallet_created">錢包已建立</string>
<string name="generate_wallet_create_failed">錢包建立失敗</string>
<string name="generate_restoreheight_error">輸入區塊高度或日期(YYYY-MM-DD)</string>
<string name="generate_restoreheight_error">輸入區塊高度或日期(YYYY-MM)</string>
<string name="generate_wallet_type_key">金鑰</string>
<string name="generate_wallet_type_new">新增</string>
@ -207,7 +207,7 @@
<string name="generate_viewkey_hint">查看金鑰</string>
<string name="generate_spendkey_hint">花費金鑰</string>
<string name="generate_mnemonic_hint">25字記憶種子碼</string>
<string name="generate_restoreheight_hint">從區塊高度或日期(YYYY-MM-DD)回復</string>
<string name="generate_restoreheight_hint">從區塊高度或日期(YYYY-MM)回復</string>
<string name="generate_address_label">公開地址</string>
<string name="generate_viewkey_label">查看金鑰</string>

@ -205,7 +205,7 @@
<string name="generate_wallet_created">Wallet created</string>
<string name="generate_wallet_create_failed">Wallet create failed</string>
<string name="generate_restoreheight_error">Enter Number or Date (YYYY-MM-DD)</string>
<string name="generate_restoreheight_error">Enter Number or Date (YYYY-MM)</string>
<string name="generate_wallet_type_key">Keys</string>
<string name="generate_wallet_type_new">New</string>
@ -216,7 +216,7 @@
<string name="generate_viewkey_hint">View Key</string>
<string name="generate_spendkey_hint">Spend Key</string>
<string name="generate_mnemonic_hint">25-Word Mnemonic Seed</string>
<string name="generate_restoreheight_hint">Restore Height or Date (YYYY-MM-DD)</string>
<string name="generate_restoreheight_hint">Restore Height or Date (YYYY-MM)</string>
<string name="generate_address_label">Public Address</string>
<string name="generate_viewkey_label">View Key</string>
@ -373,7 +373,7 @@
<string name="send_sweepall">Send all confirmed funds in this account!</string>
<string name="tx_subaddress">Subaddress #%1$d</string>
<string name="generate_address_label_sub">Public Subaddress #%1$d</string>
<string name="default_restore_height">2018-10-01</string>
<string name="default_restore_height">2018-10</string>
<string name="menu_language">Language</string>
<string name="language_system_default">Use System Language</string>
</resources>