mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-04 17:28:42 +02:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
110057c294 | ||
![]() |
7553d3c5f4 | ||
![]() |
317976b34a | ||
![]() |
6ad423567f | ||
![]() |
d497158856 | ||
![]() |
f4cada5fa1 | ||
![]() |
352f0ad09c | ||
![]() |
ff1a9c1570 | ||
![]() |
fa811a39a2 | ||
![]() |
cf5018be33 | ||
![]() |
8ec027f9d4 | ||
![]() |
f28428e677 | ||
![]() |
294084bec5 | ||
![]() |
4349907627 | ||
![]() |
f7cef24a83 |
@@ -7,8 +7,8 @@ android {
|
||||
applicationId "com.m2049r.xmrwallet"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 28
|
||||
versionCode 180
|
||||
versionName "1.11.10 'Chernushka'"
|
||||
versionCode 183
|
||||
versionName "1.11.13 'Chernushka'"
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
externalNativeBuild {
|
||||
|
@@ -1310,7 +1310,6 @@ Java_com_m2049r_xmrwallet_model_PendingTransaction_getFirstTxIdJ(JNIEnv *env, jo
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jlong JNICALL
|
||||
Java_com_m2049r_xmrwallet_model_PendingTransaction_getTxCount(JNIEnv *env, jobject instance) {
|
||||
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
|
||||
@@ -1396,6 +1395,11 @@ Java_com_m2049r_xmrwallet_model_WalletManager_setLogLevel(JNIEnv *env, jclass cl
|
||||
Bitmonero::WalletManagerFactory::setLogLevel(level);
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_com_m2049r_xmrwallet_model_WalletManager_moneroVersion(JNIEnv *env, jclass clazz) {
|
||||
return env->NewStringUTF(MONERO_VERSION);
|
||||
}
|
||||
|
||||
//
|
||||
// Ledger Stuff
|
||||
//
|
||||
|
@@ -54,6 +54,8 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
extern const char* const MONERO_VERSION; // the actual monero core version
|
||||
|
||||
// from monero-core crypto/hash-ops.h - avoid #including monero code here
|
||||
enum {
|
||||
HASH_SIZE = 32,
|
||||
|
@@ -46,8 +46,12 @@ public class BTChipTransportAndroidHID implements BTChipTransport {
|
||||
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
|
||||
for (UsbDevice device : deviceList.values()) {
|
||||
Timber.d("%04X:%04X %s, %s", device.getVendorId(), device.getProductId(), device.getManufacturerName(), device.getProductName());
|
||||
if ((device.getVendorId() == VID) && (device.getProductId() == PID_HID)) {
|
||||
return device;
|
||||
if (device.getVendorId() == VID) {
|
||||
final int deviceProductId = device.getProductId();
|
||||
for (int pid : PID_HIDS) {
|
||||
if (deviceProductId == pid)
|
||||
return device;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -74,7 +78,7 @@ public class BTChipTransportAndroidHID implements BTChipTransport {
|
||||
}
|
||||
|
||||
private static final int VID = 0x2C97;
|
||||
private static final int PID_HID = 0x0001;
|
||||
private static final int[] PID_HIDS = {0x0001, 0x0004};
|
||||
|
||||
private UsbDeviceConnection connection;
|
||||
private UsbInterface dongleInterface;
|
||||
|
@@ -55,6 +55,8 @@ import com.m2049r.xmrwallet.util.KeyStoreHelper;
|
||||
import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
|
||||
import com.m2049r.xmrwallet.widget.Toolbar;
|
||||
|
||||
import java.text.NumberFormat;
|
||||
|
||||
import timber.log.Timber;
|
||||
|
||||
public class GenerateReviewFragment extends Fragment {
|
||||
@@ -72,6 +74,7 @@ public class GenerateReviewFragment extends Fragment {
|
||||
private TextView tvWalletPassword;
|
||||
private TextView tvWalletAddress;
|
||||
private TextView tvWalletMnemonic;
|
||||
private TextView tvWalletHeight;
|
||||
private TextView tvWalletViewKey;
|
||||
private TextView tvWalletSpendKey;
|
||||
private ImageButton bCopyAddress;
|
||||
@@ -99,6 +102,7 @@ public class GenerateReviewFragment extends Fragment {
|
||||
tvWalletViewKey = view.findViewById(R.id.tvWalletViewKey);
|
||||
tvWalletSpendKey = view.findViewById(R.id.tvWalletSpendKey);
|
||||
tvWalletMnemonic = view.findViewById(R.id.tvWalletMnemonic);
|
||||
tvWalletHeight = view.findViewById(R.id.tvWalletHeight);
|
||||
bCopyAddress = view.findViewById(R.id.bCopyAddress);
|
||||
bAdvancedInfo = view.findViewById(R.id.bAdvancedInfo);
|
||||
llAdvancedInfo = view.findViewById(R.id.llAdvancedInfo);
|
||||
@@ -188,6 +192,7 @@ public class GenerateReviewFragment extends Fragment {
|
||||
private class AsyncShow extends AsyncTask<String, Void, Boolean> {
|
||||
String name;
|
||||
String address;
|
||||
long height;
|
||||
String seed;
|
||||
String viewKey;
|
||||
String spendKey;
|
||||
@@ -232,6 +237,7 @@ public class GenerateReviewFragment extends Fragment {
|
||||
}
|
||||
|
||||
address = wallet.getAddress();
|
||||
height = wallet.getRestoreHeight();
|
||||
seed = wallet.getSeed();
|
||||
switch (wallet.getDeviceType()) {
|
||||
case Device_Ledger:
|
||||
@@ -264,6 +270,7 @@ public class GenerateReviewFragment extends Fragment {
|
||||
llPassword.setVisibility(View.VISIBLE);
|
||||
tvWalletPassword.setText(getPassword());
|
||||
tvWalletAddress.setText(address);
|
||||
tvWalletHeight.setText(NumberFormat.getInstance().format(height));
|
||||
if (!seed.isEmpty()) {
|
||||
llMnemonic.setVisibility(View.VISIBLE);
|
||||
tvWalletMnemonic.setText(seed);
|
||||
@@ -288,6 +295,7 @@ public class GenerateReviewFragment extends Fragment {
|
||||
} else {
|
||||
// TODO show proper error message and/or end the fragment?
|
||||
tvWalletAddress.setText(walletStatus.toString());
|
||||
tvWalletHeight.setText(walletStatus.toString());
|
||||
tvWalletMnemonic.setText(walletStatus.toString());
|
||||
tvWalletViewKey.setText(walletStatus.toString());
|
||||
tvWalletSpendKey.setText(walletStatus.toString());
|
||||
|
@@ -940,8 +940,9 @@ public class LoginActivity extends BaseActivity
|
||||
@Override
|
||||
public boolean createWallet(File aFile, String password) {
|
||||
NodeInfo currentNode = getNode();
|
||||
// get it from the connected node if we have one, and go back ca. 4 days
|
||||
final long restoreHeight =
|
||||
(currentNode != null) ? currentNode.getHeight() - 20 : -1;
|
||||
(currentNode != null) ? currentNode.getHeight() - 2000 : -1;
|
||||
Wallet newWallet = WalletManager.getInstance()
|
||||
.createWallet(aFile, password, MNEMONIC_LANGUAGE, restoreHeight);
|
||||
return checkAndCloseWallet(newWallet);
|
||||
@@ -1359,17 +1360,30 @@ public class LoginActivity extends BaseActivity
|
||||
if (Ledger.ENABLED)
|
||||
try {
|
||||
Ledger.connect(usbManager, usbDevice);
|
||||
registerDetachReceiver();
|
||||
onLedgerAction();
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Toast.makeText(LoginActivity.this,
|
||||
getString(R.string.toast_ledger_attached, usbDevice.getProductName()),
|
||||
Toast.LENGTH_SHORT)
|
||||
.show();
|
||||
}
|
||||
});
|
||||
if (!Ledger.check()) {
|
||||
Ledger.disconnect();
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Toast.makeText(LoginActivity.this,
|
||||
getString(R.string.toast_ledger_start_app, usbDevice.getProductName()),
|
||||
Toast.LENGTH_SHORT)
|
||||
.show();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
registerDetachReceiver();
|
||||
onLedgerAction();
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Toast.makeText(LoginActivity.this,
|
||||
getString(R.string.toast_ledger_attached, usbDevice.getProductName()),
|
||||
Toast.LENGTH_SHORT)
|
||||
.show();
|
||||
}
|
||||
});
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
|
@@ -439,10 +439,13 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||
}
|
||||
Collections.sort(nodesToTest, NodeInfo.BestNodeComparator);
|
||||
NodeInfo bestNode = nodesToTest.get(0);
|
||||
if (bestNode.isValid())
|
||||
if (bestNode.isValid()) {
|
||||
activityCallback.setNode(bestNode);
|
||||
return bestNode;
|
||||
else
|
||||
} else {
|
||||
activityCallback.setNode(null);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -450,7 +453,6 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||
if (!isAdded()) return;
|
||||
pbNode.setVisibility(View.INVISIBLE);
|
||||
llNode.setVisibility(View.VISIBLE);
|
||||
activityCallback.setNode(result);
|
||||
if (result != null) {
|
||||
Timber.d("found a good node %s", result.toString());
|
||||
showNode(result);
|
||||
|
@@ -134,6 +134,10 @@ public enum Instruction {
|
||||
return value;
|
||||
}
|
||||
|
||||
public byte getByteValue() {
|
||||
return (byte) (value & 0xFF);
|
||||
}
|
||||
|
||||
private int value;
|
||||
|
||||
Instruction(int value) {
|
||||
|
@@ -27,9 +27,11 @@ import com.btchip.BTChipException;
|
||||
import com.btchip.comm.BTChipTransport;
|
||||
import com.btchip.comm.android.BTChipTransportAndroidHID;
|
||||
import com.m2049r.xmrwallet.BuildConfig;
|
||||
import com.m2049r.xmrwallet.model.WalletManager;
|
||||
import com.m2049r.xmrwallet.util.Helper;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import timber.log.Timber;
|
||||
|
||||
@@ -40,9 +42,11 @@ public class Ledger {
|
||||
static public final int LOOKAHEAD_SUBADDRESSES = 20;
|
||||
static public final String SUBADDRESS_LOOKAHEAD = LOOKAHEAD_ACCOUNTS + ":" + LOOKAHEAD_SUBADDRESSES;
|
||||
|
||||
private static final byte PROTOCOL_VERSION = 0x02;
|
||||
public static final int SW_OK = 0x9000;
|
||||
public static final int SW_INS_NOT_SUPPORTED = 0x6D00;
|
||||
public static final int OK[] = {SW_OK};
|
||||
public static final int MINIMUM_LEDGER_VERSION = (1 << 16) + (3 << 8) + (1); // 1.3.1
|
||||
|
||||
public static UsbDevice findDevice(UsbManager usbManager) {
|
||||
if (!ENABLED) return null;
|
||||
@@ -89,6 +93,21 @@ public class Ledger {
|
||||
}
|
||||
}
|
||||
|
||||
static public boolean check() {
|
||||
if (Instance == null) return false;
|
||||
byte[] moneroVersion = WalletManager.moneroVersion().getBytes(StandardCharsets.US_ASCII);
|
||||
|
||||
try {
|
||||
byte[] resp = Instance.exchangeApduNoOpt(Instruction.INS_RESET, moneroVersion, OK);
|
||||
int deviceVersion = (resp[0] << 16) + (resp[1] << 8) + (resp[2]);
|
||||
if (deviceVersion < MINIMUM_LEDGER_VERSION)
|
||||
return false;
|
||||
} catch (BTChipException ex) { // comm error - probably wrong app started on device
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
final private BTChipTransport transport;
|
||||
final private String name;
|
||||
private int lastSW = 0;
|
||||
@@ -112,7 +131,7 @@ public class Ledger {
|
||||
synchronized private byte[] exchangeRaw(byte[] apdu) {
|
||||
if (transport == null)
|
||||
throw new IllegalStateException("No transport (probably closed previously)");
|
||||
Timber.i("exchangeRaw %02x", apdu[1]);
|
||||
Timber.d("exchangeRaw %02x", apdu[1]);
|
||||
Instruction ins = Instruction.fromByte(apdu[1]);
|
||||
if (listener != null) listener.onInstructionSend(ins, apdu);
|
||||
sniffOut(ins, apdu);
|
||||
@@ -120,7 +139,6 @@ public class Ledger {
|
||||
if (listener != null) listener.onInstructionReceive(ins, data);
|
||||
sniffIn(data);
|
||||
return data;
|
||||
|
||||
}
|
||||
|
||||
private byte[] exchange(byte[] apdu) throws BTChipException {
|
||||
@@ -148,68 +166,19 @@ public class Ledger {
|
||||
throw new BTChipException("Invalid status", lastSW);
|
||||
}
|
||||
|
||||
private byte[] exchangeApdu(byte cla, byte ins, byte p1, byte p2, byte[] data, int acceptedSW[]) throws BTChipException {
|
||||
byte[] apdu = new byte[data.length + 5];
|
||||
apdu[0] = cla;
|
||||
apdu[1] = ins;
|
||||
apdu[2] = p1;
|
||||
apdu[3] = p2;
|
||||
apdu[4] = (byte) (data.length);
|
||||
System.arraycopy(data, 0, apdu, 5, data.length);
|
||||
private byte[] exchangeApduNoOpt(Instruction instruction, byte[] data, int acceptedSW[])
|
||||
throws BTChipException {
|
||||
byte[] apdu = new byte[data.length + 6];
|
||||
apdu[0] = PROTOCOL_VERSION;
|
||||
apdu[1] = instruction.getByteValue();
|
||||
apdu[2] = 0; // p1
|
||||
apdu[3] = 0; // p2
|
||||
apdu[4] = (byte) (data.length + 1); // +1 because the opt byte is part of the data
|
||||
apdu[5] = 0; // opt
|
||||
System.arraycopy(data, 0, apdu, 6, data.length);
|
||||
return exchangeCheck(apdu, acceptedSW);
|
||||
}
|
||||
|
||||
private byte[] exchangeApdu(byte cla, byte ins, byte p1, byte p2, int length, int acceptedSW[]) throws BTChipException {
|
||||
byte[] apdu = new byte[5];
|
||||
apdu[0] = cla;
|
||||
apdu[1] = ins;
|
||||
apdu[2] = p1;
|
||||
apdu[3] = p2;
|
||||
apdu[4] = (byte) (length);
|
||||
return exchangeCheck(apdu, acceptedSW);
|
||||
}
|
||||
|
||||
private byte[] exchangeApduSplit(byte cla, byte ins, byte p1, byte p2, byte[] data, int acceptedSW[]) throws BTChipException {
|
||||
int offset = 0;
|
||||
byte[] result = null;
|
||||
while (offset < data.length) {
|
||||
int blockLength = ((data.length - offset) > 255 ? 255 : data.length - offset);
|
||||
byte[] apdu = new byte[blockLength + 5];
|
||||
apdu[0] = cla;
|
||||
apdu[1] = ins;
|
||||
apdu[2] = p1;
|
||||
apdu[3] = p2;
|
||||
apdu[4] = (byte) (blockLength);
|
||||
System.arraycopy(data, offset, apdu, 5, blockLength);
|
||||
result = exchangeCheck(apdu, acceptedSW);
|
||||
offset += blockLength;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private byte[] exchangeApduSplit2(byte cla, byte ins, byte p1, byte p2, byte[] data, byte[] data2, int acceptedSW[]) throws BTChipException {
|
||||
int offset = 0;
|
||||
byte[] result = null;
|
||||
int maxBlockSize = 255 - data2.length;
|
||||
while (offset < data.length) {
|
||||
int blockLength = ((data.length - offset) > maxBlockSize ? maxBlockSize : data.length - offset);
|
||||
boolean lastBlock = ((offset + blockLength) == data.length);
|
||||
byte[] apdu = new byte[blockLength + 5 + (lastBlock ? data2.length : 0)];
|
||||
apdu[0] = cla;
|
||||
apdu[1] = ins;
|
||||
apdu[2] = p1;
|
||||
apdu[3] = p2;
|
||||
apdu[4] = (byte) (blockLength + (lastBlock ? data2.length : 0));
|
||||
System.arraycopy(data, offset, apdu, 5, blockLength);
|
||||
if (lastBlock) {
|
||||
System.arraycopy(data2, 0, apdu, 5 + blockLength, data2.length);
|
||||
}
|
||||
result = exchangeCheck(apdu, acceptedSW);
|
||||
offset += blockLength;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public interface Listener {
|
||||
void onInstructionSend(Instruction ins, byte[] apdu);
|
||||
|
||||
@@ -251,7 +220,6 @@ public class Ledger {
|
||||
if (ins == Instruction.INS_GET_KEY) {
|
||||
snoopKey = (apdu[2] == 2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void sniffIn(byte[] data) {
|
||||
|
@@ -354,4 +354,6 @@ public class WalletManager {
|
||||
static public native void logWarning(String category, String message);
|
||||
|
||||
static public native void logError(String category, String message);
|
||||
|
||||
static public native String moneroVersion();
|
||||
}
|
@@ -290,7 +290,7 @@ public class WalletService extends Service {
|
||||
showProgress(10);
|
||||
Wallet.Status walletStatus = start(walletId, walletPw);
|
||||
if (observer != null) observer.onWalletStarted(walletStatus);
|
||||
if (!walletStatus.isOk()) {
|
||||
if ((walletStatus == null) || !walletStatus.isOk()) {
|
||||
errorState = true;
|
||||
stop();
|
||||
}
|
||||
|
@@ -103,6 +103,8 @@ public class RestoreHeight {
|
||||
blockheight.put("2019-03-01", 1781681L);
|
||||
blockheight.put("2019-04-01", 1803081L);
|
||||
blockheight.put("2019-05-01", 1824671L);
|
||||
blockheight.put("2019-06-01", 1847005L);
|
||||
blockheight.put("2019-07-01", 1868590L);
|
||||
}
|
||||
|
||||
public long getHeight(String date) {
|
||||
|
@@ -77,6 +77,32 @@
|
||||
tools:text="tucks slackens vehicle doctor oaks aloof balding knife rays wise haggled cuisine navy ladder suitcase dusted last thorn pixels karate ticket nibs violin zapped slackens" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/llHeight"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/data_top"
|
||||
android:orientation="vertical"
|
||||
android:visibility="visible">
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Heading"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:text="@string/label_restoreheight" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvWalletHeight"
|
||||
style="@style/MoneroText.Monospace.Mnemonic"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/data_top"
|
||||
android:background="@drawable/backgound_seed"
|
||||
android:textAlignment="center"
|
||||
tools:text="1,878,151" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/llPassword"
|
||||
android:layout_width="match_parent"
|
||||
|
@@ -15,6 +15,7 @@
|
||||
android:layout_centerInParent="true"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:padding="12dp"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:gravity="center"
|
||||
android:src="@drawable/ic_bookmark_border_24dp" />
|
||||
@@ -24,6 +25,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_centerInParent="true"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_toStartOf="@+id/ivPing"
|
||||
android:layout_toEndOf="@id/ibBookmark"
|
||||
|
@@ -379,4 +379,8 @@
|
||||
<string name="prompt_ledger_phrase">Contrasenya Ledger (avançat)</string>
|
||||
<string name="bad_ledger_seed">Llavor de Ledger no vàlida!</string>
|
||||
<string name="prompt_ledger_seed_warn">Introduir la vostra llavor del Ledger aquí té un elevat risc de seguretat!</string>
|
||||
|
||||
<string name="label_restoreheight">Restablir Alçada</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -39,7 +39,7 @@
|
||||
Deine IP-Adresse kann dabei aufgezeichnet werden.</p>
|
||||
<h2>App-Berechtigungen</h2>
|
||||
<ul>
|
||||
<li>INTERNET : Verbinde zum Monero-Netzwerk über einen Monero-Hintergrunddienst-Node</li>
|
||||
<li>INTERNET : Verbinde zum Monero-Netzwerk über einen Monero-Node</li>
|
||||
<li>READ_EXTERNAL_STORAGE : Lese die auf dem Gerät gespeicherten Wallet-Dateien aus</li>
|
||||
<li>WRITE_EXTERNAL_STORAGE : Schreibe Wallet-Dateien auf das Gerät</li>
|
||||
<li>WAKE_LOCK : Halte das Gerät während der Synchronisation wach</li>
|
||||
|
@@ -245,7 +245,7 @@
|
||||
<p>Aktualisiere die Liste der Nodes, indem du nach unten ziehst & merke 3–5 davon vor, um es Monerujo zu ermöglichen,
|
||||
den bestmöglichen für dich auszuwählen!</p>
|
||||
<h2>Was ist ein Node?</h2>
|
||||
<p>Monerujo nutzt einen Drittanbieter-Node (manchmal auch Hintergrunddienst genannt), um mit
|
||||
<p>Monerujo nutzt einen Drittanbieter-Node (manchmal auch Monero Knoten oder Daemon genannt), um mit
|
||||
dem Monero-Netzwerk zu kommunizieren, ohne die Blockchain selbst herunterladen und
|
||||
speichern zu müssen.<p>
|
||||
<h2>Node-Liste</h2>
|
||||
|
@@ -132,7 +132,7 @@
|
||||
<string name="bad_password">Falsches Passwort!</string>
|
||||
<string name="bad_saved_password">Hinterlegtes Passwort falsch.\nBitte Passwort manuell eingeben.</string>
|
||||
<string name="bad_wallet">Wallet existiert nicht!</string>
|
||||
<string name="prompt_daemon_missing">Hintergrunddienst-Adresse muss gesetzt sein!</string>
|
||||
<string name="prompt_daemon_missing">Node-Adresse muss gesetzt sein!</string>
|
||||
<string name="prompt_wrong_net">Wallet entspricht nicht dem ausgewähltem Netz</string>
|
||||
|
||||
<string name="label_watchonly">(View-Only)</string>
|
||||
@@ -333,7 +333,7 @@
|
||||
<string name="nfc_tag_read_success">Tag erfolgreich gelesen</string>
|
||||
<string name="nfc_tag_tap">NFC verfügbar!</string>
|
||||
|
||||
<string name="status_wallet_connect_wrongversion">Hintergrunddienst-Version des Nodes inkompatibel – bitte updaten!</string>
|
||||
<string name="status_wallet_connect_wrongversion">Node Version inkompatibel – bitte updaten!</string>
|
||||
|
||||
<string name="menu_info">Zeige Geheimnisse!</string><!--Changed to: Show Secrets!-->
|
||||
<string name="menu_streetmode">Straßenmodus</string>
|
||||
@@ -382,4 +382,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledger-Passphrase (optional)</string>
|
||||
<string name="bad_ledger_seed">Ungültiger Ledger-Seed!</string>
|
||||
<string name="prompt_ledger_seed_warn">Deinen Ledger-Seed hier einzugeben, stellt ein erhebliches Sicherheitsrisiko dar!</string>
|
||||
|
||||
<string name="label_restoreheight">Wiederherstellungshöhe</string>
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -381,4 +381,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledger Passphrase (optional)</string>
|
||||
<string name="bad_ledger_seed">Invalid Ledger Seed!</string>
|
||||
<string name="prompt_ledger_seed_warn">Entering your Ledger Seed here is a major security risk!</string>
|
||||
|
||||
<string name="label_restoreheight">Ύψος ανάκτησης</string> <!-- "Restore Height" -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -381,4 +381,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledger Passphrase (optional)</string>
|
||||
<string name="bad_ledger_seed">Invalid Ledger Seed!</string>
|
||||
<string name="prompt_ledger_seed_warn">Entering your Ledger Seed here is a major security risk!</string>
|
||||
|
||||
<string name="label_restoreheight">Restaŭralteco</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -371,4 +371,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledger Passphrase (optional)</string>
|
||||
<string name="bad_ledger_seed">Invalid Ledger Seed!</string>
|
||||
<string name="prompt_ledger_seed_warn">Entering your Ledger Seed here is a major security risk!</string>
|
||||
|
||||
<string name="label_restoreheight">Altura de Restauración</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -379,4 +379,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledger Passphrase (optional)</string>
|
||||
<string name="bad_ledger_seed">Invalid Ledger Seed!</string>
|
||||
<string name="prompt_ledger_seed_warn">Entering your Ledger Seed here is a major security risk!</string>
|
||||
|
||||
<string name="label_restoreheight">Taastamise plokinumber</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -385,4 +385,8 @@
|
||||
<string name="prompt_ledger_phrase">Mot de passe Ledger (optionnel)</string>
|
||||
<string name="bad_ledger_seed">Phrase mnémonique Ledger invalide !</string>
|
||||
<string name="prompt_ledger_seed_warn">Saisir votre phrase mnémonique Ledger ici est un risque majeur de sécurité !</string>
|
||||
|
||||
<string name="label_restoreheight">Hauteur de restauration</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -383,4 +383,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledger Passphrase (optional)</string>
|
||||
<string name="bad_ledger_seed">Invalid Ledger Seed!</string>
|
||||
<string name="prompt_ledger_seed_warn">Entering your Ledger Seed here is a major security risk!</string>
|
||||
|
||||
<string name="label_restoreheight">Visszaállítási lánchossz</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -384,4 +384,8 @@
|
||||
<string name="prompt_ledger_phrase">Frase d\'accesso Ledger (opzionale)</string>
|
||||
<string name="bad_ledger_seed">Seed di Ledger invalido!</string>
|
||||
<string name="prompt_ledger_seed_warn">Inserire il tuo seed di Ledger qui è un grosso rischio!</string>
|
||||
|
||||
<string name="label_restoreheight">Altezza di ripristino</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -427,4 +427,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledgerパスフレーズ (オプショナル)</string>
|
||||
<string name="bad_ledger_seed">Ledgerのニーモニックシードは不正!</string>
|
||||
<string name="prompt_ledger_seed_warn">ここにLedgerシードを入力するのは、大きなセキュリティリスクですよ!</string>
|
||||
|
||||
<string name="label_restoreheight">Restore Height</string>
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -381,4 +381,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledger Passphrase (optional)</string>
|
||||
<string name="bad_ledger_seed">Invalid Ledger Seed!</string>
|
||||
<string name="prompt_ledger_seed_warn">Entering your Ledger Seed here is a major security risk!</string>
|
||||
|
||||
<string name="label_restoreheight">Restore Height</string>
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -381,4 +381,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledger Passphrase (optional)</string>
|
||||
<string name="bad_ledger_seed">Invalid Ledger Seed!</string>
|
||||
<string name="prompt_ledger_seed_warn">Entering your Ledger Seed here is a major security risk!</string>
|
||||
|
||||
<string name="label_restoreheight">Herstelpunt</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -373,4 +373,8 @@
|
||||
<string name="prompt_ledger_phrase">Senha da Ledger (opcional)</string>
|
||||
<string name="bad_ledger_seed">Semente da Ledger inválida!</string>
|
||||
<string name="prompt_ledger_seed_warn">Escrever a semente da sua Ledger aqui é um grande risco de segurança!</string>
|
||||
|
||||
<string name="label_restoreheight">Restaurar da altura</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -385,4 +385,8 @@
|
||||
<string name="prompt_ledger_phrase">Palavra passe do Ledger (opcional)</string>
|
||||
<string name="bad_ledger_seed">Semente do Ledger invalida!</string>
|
||||
<string name="prompt_ledger_seed_warn">Introduzir a semente do Ledger aqui comporta um elevado risco de segurança!</string>
|
||||
|
||||
<string name="label_restoreheight">Restaurar de Altura</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -381,4 +381,8 @@
|
||||
<string name="prompt_ledger_phrase">Ledger Passphrase (optional)</string>
|
||||
<string name="bad_ledger_seed">Invalid Ledger Seed!</string>
|
||||
<string name="prompt_ledger_seed_warn">Entering your Ledger Seed here is a major security risk!</string>
|
||||
|
||||
<string name="label_restoreheight">Restaurează Monobloc</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
@@ -385,4 +385,8 @@
|
||||
<string name="prompt_ledger_phrase">Пароль Ledger (необязательно)</string>
|
||||
<string name="bad_ledger_seed">Ошибка фразы Ledger!</string>
|
||||
<string name="prompt_ledger_seed_warn">Если вы пытаетесь ввести сюда фразу Ledger, это серьезная угроза для вашей безопасности!</string>
|
||||
|
||||
<string name="label_restoreheight">Восстановить высоту</string> <!-- Restore Height -->
|
||||
|
||||
<string name="toast_ledger_start_app">Start Monero App on %1$s</string>
|
||||
</resources>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user