mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-03 08:23:04 +02:00
Compare commits
22 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
beba0f497b | ||
![]() |
9d1827ff0d | ||
![]() |
c04b192753 | ||
![]() |
888b5edaec | ||
![]() |
5ee5a81926 | ||
![]() |
c4e361a873 | ||
![]() |
dba6cb057e | ||
![]() |
9e1167c5b9 | ||
![]() |
12546a1ade | ||
![]() |
e9313bc235 | ||
![]() |
7e9bf84640 | ||
![]() |
94f87a5193 | ||
![]() |
8a8fc5ec9e | ||
![]() |
036d4ebf6c | ||
![]() |
c6d4de8599 | ||
![]() |
2ef7f8571c | ||
![]() |
d2612a26e5 | ||
![]() |
7e14572756 | ||
![]() |
6f840dcacf | ||
![]() |
36b389cd0f | ||
![]() |
ed2b95ea37 | ||
![]() |
8d41d1d03e |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -6,7 +6,10 @@
|
||||
/captures
|
||||
.externalNativeBuild
|
||||
.DS_Store
|
||||
/app/build
|
||||
/app/release
|
||||
/app/alpha
|
||||
/app/prod
|
||||
/app/alphaMainnet
|
||||
/app/prodMainnet
|
||||
/app/alphaStagenet
|
||||
|
5
app/.gitignore
vendored
5
app/.gitignore
vendored
@@ -1,5 +0,0 @@
|
||||
.externalNativeBuild
|
||||
build
|
||||
app.iml
|
||||
prod
|
||||
alpha
|
@@ -7,8 +7,8 @@ android {
|
||||
applicationId "com.m2049r.xmrwallet"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 28
|
||||
versionCode 155
|
||||
versionName "1.10.5 'Node-O-matiC'"
|
||||
versionCode 163
|
||||
versionName "1.10.13 'Node-O-matiC'"
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
externalNativeBuild {
|
||||
@@ -27,6 +27,7 @@ android {
|
||||
stagenet {
|
||||
dimension 'net'
|
||||
applicationIdSuffix '.stage'
|
||||
versionNameSuffix ' (stage)'
|
||||
}
|
||||
alpha {
|
||||
dimension 'type'
|
||||
|
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" translatable="false">monerujo - Debug</string>
|
||||
</resources>
|
@@ -7,8 +7,10 @@
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
||||
<application
|
||||
android:name=".XmrWalletApplication"
|
||||
|
@@ -417,8 +417,8 @@ Java_com_m2049r_xmrwallet_model_WalletManager_verifyWalletPassword(JNIEnv *env,
|
||||
//virtual int queryWalletHardware(const std::string &keys_file_name, const std::string &password) const = 0;
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_com_m2049r_xmrwallet_model_WalletManager_queryWalletDeviceJ(JNIEnv *env, jobject instance,
|
||||
jstring keys_file_name,
|
||||
jstring password) {
|
||||
jstring keys_file_name,
|
||||
jstring password) {
|
||||
const char *_keys_file_name = env->GetStringUTFChars(keys_file_name, NULL);
|
||||
const char *_password = env->GetStringUTFChars(password, NULL);
|
||||
Bitmonero::Wallet::Device device_type;
|
||||
@@ -1185,10 +1185,11 @@ jobject newTransferList(JNIEnv *env, Bitmonero::TransactionInfo *info) {
|
||||
|
||||
jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
|
||||
jmethodID c = env->GetMethodID(class_TransactionInfo, "<init>",
|
||||
"(IZZJJJLjava/lang/String;JLjava/lang/String;IIJLjava/util/List;)V");
|
||||
"(IZZJJJLjava/lang/String;JLjava/lang/String;IIJLjava/lang/String;Ljava/util/List;)V");
|
||||
jobject transfers = newTransferList(env, info);
|
||||
jstring _hash = env->NewStringUTF(info->hash().c_str());
|
||||
jstring _paymentId = env->NewStringUTF(info->paymentId().c_str());
|
||||
jstring _label = env->NewStringUTF(info->label().c_str());
|
||||
uint32_t subaddrIndex = 0;
|
||||
if (info->direction() == Bitmonero::TransactionInfo::Direction_In)
|
||||
subaddrIndex = *(info->subaddrIndex().begin());
|
||||
@@ -1205,6 +1206,7 @@ jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
|
||||
info->subaddrAccount(),
|
||||
subaddrIndex,
|
||||
info->confirmations(),
|
||||
_label,
|
||||
transfers);
|
||||
env->DeleteLocalRef(transfers);
|
||||
env->DeleteLocalRef(_hash);
|
||||
@@ -1397,7 +1399,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_setLogLevel(JNIEnv *env, jclass cl
|
||||
*
|
||||
* @return length of received data in response or -1 if error
|
||||
*/
|
||||
int LedgerExchange(
|
||||
int LedgerExchange(
|
||||
unsigned char *command,
|
||||
unsigned int cmd_len,
|
||||
unsigned char *response,
|
||||
|
@@ -18,7 +18,6 @@ package com.m2049r.levin.scanner;
|
||||
|
||||
import com.m2049r.xmrwallet.data.NodeInfo;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
@@ -176,9 +175,9 @@ public class Dispatcher implements PeerRetriever.OnGetPeers {
|
||||
}
|
||||
|
||||
private void retrievePeers(PeerRetriever peer) {
|
||||
for (InetSocketAddress socketAddress : peer.getPeers()) {
|
||||
for (LevinPeer levinPeer : peer.getPeers()) {
|
||||
if (getMorePeers())
|
||||
retrievePeer(new NodeInfo(socketAddress));
|
||||
retrievePeer(new NodeInfo(levinPeer));
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
23
app/src/main/java/com/m2049r/levin/scanner/LevinPeer.java
Normal file
23
app/src/main/java/com/m2049r/levin/scanner/LevinPeer.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package com.m2049r.levin.scanner;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
public class LevinPeer {
|
||||
final public InetSocketAddress socketAddress;
|
||||
final public int version;
|
||||
final public long height;
|
||||
final public String top;
|
||||
|
||||
|
||||
public InetSocketAddress getSocketAddress() {
|
||||
return socketAddress;
|
||||
}
|
||||
|
||||
LevinPeer(InetAddress address, int port, int version, long height, String top) {
|
||||
this.socketAddress = new InetSocketAddress(address, port);
|
||||
this.version = version;
|
||||
this.height = height;
|
||||
this.top = top;
|
||||
}
|
||||
}
|
@@ -28,7 +28,6 @@ import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
@@ -45,7 +44,7 @@ public class PeerRetriever implements Callable<PeerRetriever> {
|
||||
static final private byte[] HANDSHAKE = handshakeRequest().asByteArray();
|
||||
static final private byte[] FLAGS_RESP = flagsResponse().asByteArray();
|
||||
|
||||
final private List<InetSocketAddress> peers = new ArrayList<>();
|
||||
final private List<LevinPeer> peers = new ArrayList<>();
|
||||
|
||||
private NodeInfo nodeInfo;
|
||||
private OnGetPeers onGetPeersCallback;
|
||||
@@ -67,7 +66,7 @@ public class PeerRetriever implements Callable<PeerRetriever> {
|
||||
return !peers.isEmpty();
|
||||
}
|
||||
|
||||
public List<InetSocketAddress> getPeers() {
|
||||
public List<LevinPeer> getPeers() {
|
||||
return peers;
|
||||
}
|
||||
|
||||
@@ -107,12 +106,18 @@ public class PeerRetriever implements Callable<PeerRetriever> {
|
||||
}
|
||||
|
||||
private void readAddressList(Section section) {
|
||||
Section data = (Section) section.get("payload_data");
|
||||
int topVersion = (Integer) data.get("top_version");
|
||||
long currentHeight = (Long) data.get("current_height");
|
||||
String topId = HexHelper.bytesToHex((byte[]) data.get("top_id"));
|
||||
Timber.d("PAYLOAD_DATA %d/%d/%s", topVersion, currentHeight, topId);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Section> peerList = (List<Section>) section.get("local_peerlist_new");
|
||||
if (peerList != null) {
|
||||
for (Section peer : peerList) {
|
||||
Section adr = (Section) peer.get("adr");
|
||||
Byte type = (Byte) adr.get("type");
|
||||
Integer type = (Integer) adr.get("type");
|
||||
if ((type == null) || (type != 1))
|
||||
continue;
|
||||
Section addr = (Section) adr.get("addr");
|
||||
@@ -121,7 +126,7 @@ public class PeerRetriever implements Callable<PeerRetriever> {
|
||||
Integer ip = (Integer) addr.get("m_ip");
|
||||
if (ip == null)
|
||||
continue;
|
||||
Short sport = (Short) addr.get("m_port");
|
||||
Integer sport = (Integer) addr.get("m_port");
|
||||
if (sport == null)
|
||||
continue;
|
||||
int port = sport;
|
||||
@@ -133,7 +138,7 @@ public class PeerRetriever implements Callable<PeerRetriever> {
|
||||
&& !inet.isLoopbackAddress()
|
||||
&& !inet.isMulticastAddress()
|
||||
&& !inet.isLinkLocalAddress()) {
|
||||
peers.add(new InetSocketAddress(inet, port));
|
||||
peers.add(new LevinPeer(inet, port, topVersion, currentHeight, topId));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -83,9 +83,11 @@ public class LevinReader {
|
||||
case Section.SERIALIZE_TYPE_INT32:
|
||||
return in.readInt();
|
||||
case Section.SERIALIZE_TYPE_UINT16:
|
||||
return in.readUnsignedShort();
|
||||
case Section.SERIALIZE_TYPE_INT16:
|
||||
return in.readShort();
|
||||
case Section.SERIALIZE_TYPE_UINT8:
|
||||
return in.readUnsignedByte();
|
||||
case Section.SERIALIZE_TYPE_INT8:
|
||||
return in.readByte();
|
||||
case Section.SERIALIZE_TYPE_OBJECT:
|
||||
|
@@ -92,6 +92,11 @@ public class LoginActivity extends BaseActivity
|
||||
|
||||
Set<NodeInfo> favouriteNodes = new HashSet<>();
|
||||
|
||||
@Override
|
||||
public NodeInfo getNode() {
|
||||
return node;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNode(NodeInfo node) {
|
||||
if ((node != null) && (node.getNetworkType() != WalletManager.getInstance().getNetworkType()))
|
||||
|
@@ -99,6 +99,8 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||
|
||||
void setNode(NodeInfo node);
|
||||
|
||||
NodeInfo getNode();
|
||||
|
||||
Set<NodeInfo> getFavouriteNodes();
|
||||
|
||||
boolean hasLedger();
|
||||
@@ -128,7 +130,11 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||
activityCallback.setTitle(null);
|
||||
activityCallback.setToolbarButton(Toolbar.BUTTON_CREDITS);
|
||||
activityCallback.showNet();
|
||||
findBestNode();
|
||||
NodeInfo node = activityCallback.getNode();
|
||||
if (node == null)
|
||||
findBestNode();
|
||||
else
|
||||
showNode(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -181,7 +187,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (activityCallback.getFavouriteNodes().isEmpty())
|
||||
activityCallback.onNodePrefs();
|
||||
startNodePrefs();
|
||||
else
|
||||
findBestNode();
|
||||
}
|
||||
@@ -191,8 +197,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||
view.findViewById(R.id.ibOption).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (activityCallback != null)
|
||||
activityCallback.onNodePrefs();
|
||||
startNodePrefs();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -476,4 +481,9 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||
tvNodeAddress.setText(nodeInfo.getAddress());
|
||||
tvNodeAddress.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
private void startNodePrefs() {
|
||||
activityCallback.setNode(null);
|
||||
activityCallback.onNodePrefs();
|
||||
}
|
||||
}
|
||||
|
@@ -60,6 +60,7 @@ public class TxFragment extends Fragment {
|
||||
}
|
||||
|
||||
private TextView tvAccount;
|
||||
private TextView tvAddress;
|
||||
private TextView tvTxTimestamp;
|
||||
private TextView tvTxId;
|
||||
private TextView tvTxKey;
|
||||
@@ -90,6 +91,7 @@ public class TxFragment extends Fragment {
|
||||
tvTxAmountBtc = view.findViewById(R.id.tvTxAmountBtc);
|
||||
|
||||
tvAccount = view.findViewById(R.id.tvAccount);
|
||||
tvAddress = view.findViewById(R.id.tvAddress);
|
||||
tvTxTimestamp = view.findViewById(R.id.tvTxTimestamp);
|
||||
tvTxId = view.findViewById(R.id.tvTxId);
|
||||
tvTxKey = view.findViewById(R.id.tvTxKey);
|
||||
@@ -219,12 +221,16 @@ public class TxFragment extends Fragment {
|
||||
if (info.txKey == null) {
|
||||
info.txKey = activityCallback.getTxKey(info.hash);
|
||||
}
|
||||
if (info.address == null) {
|
||||
info.address = activityCallback.getTxAddress(info.account, info.subaddress);
|
||||
}
|
||||
loadNotes(info);
|
||||
|
||||
activityCallback.setSubtitle(getString(R.string.tx_title));
|
||||
activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
|
||||
|
||||
tvAccount.setText(getString(R.string.tx_account_formatted, info.account, info.subaddress));
|
||||
tvAddress.setText(info.address);
|
||||
|
||||
tvTxTimestamp.setText(TS_FORMATTER.format(new Date(info.timestamp * 1000)));
|
||||
tvTxId.setText(info.hash);
|
||||
@@ -331,6 +337,8 @@ public class TxFragment extends Fragment {
|
||||
|
||||
String getTxNotes(String hash);
|
||||
|
||||
String getTxAddress(int major, int minor);
|
||||
|
||||
void onSetNote(String txId, String notes);
|
||||
|
||||
void setToolbarButton(int type);
|
||||
|
@@ -168,6 +168,11 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||
return getWallet().getUserNote(txId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTxAddress(int major, int minor) {
|
||||
return getWallet().getSubaddress(major, minor);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
|
@@ -38,6 +38,7 @@ public class BarcodeData {
|
||||
public static final String OA_BTC_ASSET = "btc";
|
||||
|
||||
static final String BTC_SCHEME = "bitcoin:";
|
||||
static final String BTC_DESCRIPTION = "message";
|
||||
static final String BTC_AMOUNT = "amount";
|
||||
|
||||
public enum Asset {
|
||||
@@ -50,28 +51,32 @@ public class BarcodeData {
|
||||
OA_DNSSEC
|
||||
}
|
||||
|
||||
public Asset asset = null;
|
||||
public String addressName = null;
|
||||
public String address = null;
|
||||
public String paymentId = null;
|
||||
public String amount = null;
|
||||
public String description = null;
|
||||
public Security security = Security.NORMAL;
|
||||
|
||||
public BarcodeData(String uri) {
|
||||
this.asset = asset;
|
||||
this.address = address;
|
||||
}
|
||||
final public Asset asset;
|
||||
final public String address;
|
||||
final public String addressName;
|
||||
final public String paymentId;
|
||||
final public String amount;
|
||||
final public String description;
|
||||
final public Security security;
|
||||
|
||||
public BarcodeData(Asset asset, String address) {
|
||||
this.asset = asset;
|
||||
this.address = address;
|
||||
amount = null;
|
||||
paymentId = null;
|
||||
addressName = null;
|
||||
description = null;
|
||||
this.security = Security.NORMAL;
|
||||
}
|
||||
|
||||
public BarcodeData(Asset asset, String address, String amount) {
|
||||
this.asset = asset;
|
||||
this.address = address;
|
||||
this.amount = amount;
|
||||
paymentId = null;
|
||||
addressName = null;
|
||||
description = null;
|
||||
this.security = Security.NORMAL;
|
||||
}
|
||||
|
||||
public BarcodeData(Asset asset, String address, String paymentId, String amount) {
|
||||
@@ -79,6 +84,9 @@ public class BarcodeData {
|
||||
this.address = address;
|
||||
this.paymentId = paymentId;
|
||||
this.amount = amount;
|
||||
addressName = null;
|
||||
description = null;
|
||||
this.security = Security.NORMAL;
|
||||
}
|
||||
|
||||
public BarcodeData(Asset asset, String address, String paymentId, String description, String amount) {
|
||||
@@ -87,14 +95,18 @@ public class BarcodeData {
|
||||
this.paymentId = paymentId;
|
||||
this.description = description;
|
||||
this.amount = amount;
|
||||
addressName = null;
|
||||
this.security = Security.NORMAL;
|
||||
}
|
||||
|
||||
public void setAddressName(String name) {
|
||||
addressName = name;
|
||||
}
|
||||
|
||||
public void setSecurity(Security security) {
|
||||
this.security = security;
|
||||
public BarcodeData(Asset asset, String address, String addressName, String paymentId, String description, String amount, Security sec) {
|
||||
this.asset = asset;
|
||||
this.address = address;
|
||||
this.addressName = addressName;
|
||||
this.paymentId = paymentId;
|
||||
this.description = description;
|
||||
this.amount = amount;
|
||||
this.security = sec;
|
||||
}
|
||||
|
||||
public Uri getUri() {
|
||||
@@ -140,7 +152,7 @@ public class BarcodeData {
|
||||
}
|
||||
// check for OpenAlias
|
||||
if (bcData == null) {
|
||||
bcData = parseOpenAlias(qrCode);
|
||||
bcData = parseOpenAlias(qrCode, false);
|
||||
}
|
||||
return bcData;
|
||||
}
|
||||
@@ -175,7 +187,11 @@ public class BarcodeData {
|
||||
}
|
||||
}
|
||||
String address = monero.getPath();
|
||||
|
||||
String paymentId = parms.get(XMR_PAYMENTID);
|
||||
// deal with empty payment_id created by non-spec-conforming apps
|
||||
if ((paymentId != null) && paymentId.isEmpty()) paymentId = null;
|
||||
|
||||
String description = parms.get(XMR_DESCRIPTION);
|
||||
String amount = parms.get(XMR_AMOUNT);
|
||||
if (amount != null) {
|
||||
@@ -235,6 +251,7 @@ public class BarcodeData {
|
||||
}
|
||||
}
|
||||
String address = bitcoin.getPath();
|
||||
String description = parms.get(BTC_DESCRIPTION);
|
||||
String amount = parms.get(BTC_AMOUNT);
|
||||
if (amount != null) {
|
||||
try {
|
||||
@@ -248,7 +265,7 @@ public class BarcodeData {
|
||||
Timber.d("address invalid");
|
||||
return null;
|
||||
}
|
||||
return new BarcodeData(BarcodeData.Asset.BTC, address, amount);
|
||||
return new BarcodeData(BarcodeData.Asset.BTC, address, null, description, amount);
|
||||
}
|
||||
|
||||
static public BarcodeData parseBitcoinNaked(String address) {
|
||||
@@ -264,7 +281,7 @@ public class BarcodeData {
|
||||
return new BarcodeData(BarcodeData.Asset.BTC, address);
|
||||
}
|
||||
|
||||
static public BarcodeData parseOpenAlias(String oaString) {
|
||||
static public BarcodeData parseOpenAlias(String oaString, boolean dnssec) {
|
||||
Timber.d("parseOpenAlias=%s", oaString);
|
||||
if (oaString == null) return null;
|
||||
|
||||
@@ -316,8 +333,8 @@ public class BarcodeData {
|
||||
return null;
|
||||
}
|
||||
|
||||
BarcodeData bc = new BarcodeData(asset, address, paymentId, description, amount);
|
||||
bc.setAddressName(addressName);
|
||||
return bc;
|
||||
Security sec = dnssec ? BarcodeData.Security.OA_DNSSEC : BarcodeData.Security.OA_NO_DNSSEC;
|
||||
|
||||
return new BarcodeData(asset, address, addressName, paymentId, description, amount, sec);
|
||||
}
|
||||
}
|
@@ -22,6 +22,7 @@ import com.burgstaller.okhttp.digest.CachingAuthenticator;
|
||||
import com.burgstaller.okhttp.digest.Credentials;
|
||||
import com.burgstaller.okhttp.digest.DigestAuthenticator;
|
||||
import com.m2049r.levin.scanner.Dispatcher;
|
||||
import com.m2049r.levin.scanner.LevinPeer;
|
||||
import com.m2049r.xmrwallet.util.OkHttpHelper;
|
||||
|
||||
import org.json.JSONException;
|
||||
@@ -99,21 +100,18 @@ public class NodeInfo extends Node {
|
||||
super(nodeString);
|
||||
}
|
||||
|
||||
public NodeInfo(InetSocketAddress socketAddress) {
|
||||
super(socketAddress);
|
||||
public NodeInfo(LevinPeer levinPeer) {
|
||||
super(levinPeer.getSocketAddress());
|
||||
}
|
||||
|
||||
public NodeInfo(InetSocketAddress address) {
|
||||
super(address);
|
||||
}
|
||||
|
||||
public NodeInfo() {
|
||||
super();
|
||||
}
|
||||
|
||||
public NodeInfo(InetSocketAddress peerAddress, long height, int majorVersion, double respTime) {
|
||||
super(peerAddress);
|
||||
this.height = height;
|
||||
this.majorVersion = majorVersion;
|
||||
this.responseTime = respTime;
|
||||
}
|
||||
|
||||
public long getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
@@ -296,11 +296,8 @@ public class SendAddressWizardFragment extends SendWizardFragment {
|
||||
}
|
||||
|
||||
private boolean isBitcoinAddress() {
|
||||
String address = etAddress.getEditText().getText().toString();
|
||||
if ((address.length() >= 27) && (address.length() <= 35))
|
||||
return BitcoinAddressValidator.validate(address);
|
||||
else
|
||||
return false;
|
||||
final String address = etAddress.getEditText().getText().toString();
|
||||
return BitcoinAddressValidator.validate(address);
|
||||
}
|
||||
|
||||
private boolean checkPaymentId() {
|
||||
|
@@ -18,10 +18,8 @@ package com.m2049r.xmrwallet.model;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
// this is not the TransactionInfo from the API as that is owned by the TransactionHistory
|
||||
// this is a POJO for the TransactionInfoAdapter
|
||||
@@ -53,11 +51,6 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
}
|
||||
}
|
||||
|
||||
// virtual std::set<uint32_t> subaddrIndex() const = 0;
|
||||
// virtual uint32_t subaddrAccount() const = 0;
|
||||
// virtual std::string label() const = 0;
|
||||
// virtual uint64_t confirmations() const = 0;
|
||||
|
||||
public Direction direction;
|
||||
public boolean isPending;
|
||||
public boolean isFailed;
|
||||
@@ -70,10 +63,12 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
public int account;
|
||||
public int subaddress;
|
||||
public long confirmations;
|
||||
public String subaddressLabel;
|
||||
public List<Transfer> transfers;
|
||||
|
||||
public String txKey = null;
|
||||
public String notes = null;
|
||||
public String address = null;
|
||||
|
||||
public TransactionInfo(
|
||||
int direction,
|
||||
@@ -88,6 +83,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
int account,
|
||||
int subaddress,
|
||||
long confirmations,
|
||||
String subaddressLabel,
|
||||
List<Transfer> transfers) {
|
||||
this.direction = Direction.values()[direction];
|
||||
this.isPending = isPending;
|
||||
@@ -101,6 +97,7 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
this.account = account;
|
||||
this.subaddress = subaddress;
|
||||
this.confirmations = confirmations;
|
||||
this.subaddressLabel = subaddressLabel;
|
||||
this.transfers = transfers;
|
||||
}
|
||||
|
||||
@@ -122,9 +119,11 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
out.writeInt(account);
|
||||
out.writeInt(subaddress);
|
||||
out.writeLong(confirmations);
|
||||
out.writeString(subaddressLabel);
|
||||
out.writeList(transfers);
|
||||
out.writeString(txKey);
|
||||
out.writeString(notes);
|
||||
out.writeString(address);
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<TransactionInfo> CREATOR = new Parcelable.Creator<TransactionInfo>() {
|
||||
@@ -150,9 +149,11 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
|
||||
account = in.readInt();
|
||||
subaddress = in.readInt();
|
||||
confirmations = in.readLong();
|
||||
subaddressLabel = in.readString();
|
||||
transfers = in.readArrayList(Transfer.class.getClassLoader());
|
||||
txKey = in.readString();
|
||||
notes = in.readString();
|
||||
address = in.readString();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -16,12 +16,13 @@
|
||||
|
||||
package com.m2049r.xmrwallet.util;
|
||||
|
||||
// based on https://rosettacode.org/wiki/Bitcoin/address_validation#Java
|
||||
// mostly based on https://rosettacode.org/wiki/Bitcoin/address_validation#Java
|
||||
|
||||
import com.m2049r.xmrwallet.model.NetworkType;
|
||||
import com.m2049r.xmrwallet.model.WalletManager;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
@@ -31,8 +32,9 @@ public class BitcoinAddressValidator {
|
||||
private static final String ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
||||
|
||||
public static boolean validate(String addrress) {
|
||||
return validate(addrress,
|
||||
WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet);
|
||||
boolean testnet = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet;
|
||||
if (validate(addrress, testnet)) return true;
|
||||
return validateBech32Segwit(addrress, testnet);
|
||||
}
|
||||
|
||||
public static boolean validate(String addrress, boolean testnet) {
|
||||
@@ -85,4 +87,112 @@ public class BitcoinAddressValidator {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// validate Bech32 segwit
|
||||
// see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki for spec
|
||||
//
|
||||
|
||||
private static final String DATA_CHARS = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
||||
|
||||
public static boolean validateBech32Segwit(String bech32, boolean testnet) {
|
||||
if (!bech32.equals(bech32.toLowerCase()) && !bech32.equals(bech32.toUpperCase())) {
|
||||
return false; // mixing upper and lower case not allowed
|
||||
}
|
||||
bech32 = bech32.toLowerCase();
|
||||
|
||||
if (testnet && !bech32.startsWith("tb1")) return false;
|
||||
if (!testnet && !bech32.startsWith("bc1")) return false;
|
||||
|
||||
if ((bech32.length() < 14) || (bech32.length() > 74)) return false;
|
||||
int mod = bech32.length() % 8;
|
||||
if ((mod == 0) || (mod == 3) || (mod == 5)) return false;
|
||||
|
||||
int sep = -1;
|
||||
final byte[] bytes = bech32.getBytes(StandardCharsets.US_ASCII);
|
||||
for (int i = 0; i < bytes.length; i++) {
|
||||
if ((bytes[i] < 33) || (bytes[i] > 126)) {
|
||||
return false;
|
||||
}
|
||||
if (bytes[i] == 49) sep = i; // 49 := '1' in ASCII
|
||||
}
|
||||
|
||||
if (sep != 2) return false; // bech32 always has len(hrp)==2
|
||||
if (sep > bytes.length - 7) {
|
||||
return false; // min 6 bytes data
|
||||
}
|
||||
if (bytes.length < 8) { // hrp{min}=1 + sep=1 + data{min}=6 := 8
|
||||
return false; // too short
|
||||
}
|
||||
if (bytes.length > 90) {
|
||||
return false; // too long
|
||||
}
|
||||
|
||||
final byte[] hrp = Arrays.copyOfRange(bytes, 0, sep);
|
||||
|
||||
final byte[] data = Arrays.copyOfRange(bytes, sep + 1, bytes.length);
|
||||
for (int i = 0; i < data.length; i++) {
|
||||
int b = DATA_CHARS.indexOf(data[i]);
|
||||
if (b < 0) return false; // invalid character
|
||||
data[i] = (byte) b;
|
||||
}
|
||||
|
||||
if (!validateBech32Data(data)) return false;
|
||||
|
||||
return verifyChecksum(hrp, data);
|
||||
}
|
||||
|
||||
private static int polymod(byte[] values) {
|
||||
final int[] GEN = {0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3};
|
||||
int chk = 1;
|
||||
for (byte v : values) {
|
||||
byte b = (byte) (chk >> 25);
|
||||
chk = ((chk & 0x1ffffff) << 5) ^ v;
|
||||
for (int i = 0; i < 5; i++) {
|
||||
chk ^= ((b >> i) & 1) == 1 ? GEN[i] : 0;
|
||||
}
|
||||
}
|
||||
return chk;
|
||||
}
|
||||
|
||||
private static byte[] hrpExpand(byte[] hrp) {
|
||||
final byte[] expanded = new byte[(2 * hrp.length) + 1];
|
||||
int i = 0;
|
||||
for (int j = 0; j < hrp.length; j++) {
|
||||
expanded[i++] = (byte) (hrp[j] >> 5);
|
||||
}
|
||||
expanded[i++] = 0;
|
||||
for (int j = 0; j < hrp.length; j++) {
|
||||
expanded[i++] = (byte) (hrp[j] & 0x1f);
|
||||
}
|
||||
return expanded;
|
||||
}
|
||||
|
||||
private static boolean verifyChecksum(byte[] hrp, byte[] data) {
|
||||
final byte[] hrpExpanded = hrpExpand(hrp);
|
||||
final byte[] values = new byte[hrpExpanded.length + data.length];
|
||||
System.arraycopy(hrpExpanded, 0, values, 0, hrpExpanded.length);
|
||||
System.arraycopy(data, 0, values, hrpExpanded.length, data.length);
|
||||
return (polymod(values) == 1);
|
||||
}
|
||||
|
||||
private static boolean validateBech32Data(final byte[] data) {
|
||||
if ((data[0] < 0) || (data[0] > 16)) return false; // witness version
|
||||
final int programLength = data.length - 1 - 6; // 1-byte version at beginning & 6-byte checksum at end
|
||||
|
||||
// since we are coming from our own decoder, we don't need to verify data is 5-bit bytes
|
||||
|
||||
final int convertedSize = programLength * 5 / 8;
|
||||
final int remainderSize = programLength * 5 % 8;
|
||||
|
||||
if ((convertedSize < 2) || (convertedSize > 40)) return false;
|
||||
|
||||
if ((data[0] == 0) && (convertedSize != 20) && (convertedSize != 32)) return false;
|
||||
|
||||
if (remainderSize >= 5) return false;
|
||||
// ignore checksum at end and get last byte of program
|
||||
if ((data[data.length - 1 - 6] & ((1 << remainderSize) - 1)) != 0) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -81,6 +81,8 @@ public class Helper {
|
||||
(BuildConfig.FLAVOR.startsWith("prod") ? "" : "." + BuildConfig.FLAVOR)
|
||||
+ (BuildConfig.DEBUG ? "-debug" : "");
|
||||
|
||||
static public final String NOCRAZYPASS_FLAGFILE = ".nocrazypass";
|
||||
|
||||
static public final String CRYPTO = "XMR";
|
||||
|
||||
static private final String WALLET_DIR = "monerujo" + FLAVOR_SUFFIX;
|
||||
@@ -347,6 +349,11 @@ public class Helper {
|
||||
WalletManager.setLogLevel(level);
|
||||
}
|
||||
|
||||
static public boolean useCrazyPass(Context context) {
|
||||
File flagFile = new File(getWalletRoot(context), NOCRAZYPASS_FLAGFILE);
|
||||
return !flagFile.exists();
|
||||
}
|
||||
|
||||
// try to figure out what the real wallet password is given the user password
|
||||
// which could be the actual wallet password or a (maybe malformed) CrAzYpass
|
||||
// or the password used to derive the CrAzYpass for the wallet
|
||||
|
@@ -84,7 +84,10 @@ public class KeyStoreHelper {
|
||||
}
|
||||
|
||||
public static String getCrazyPass(Context context, String password) {
|
||||
return getCrazyPass(context, password, 0);
|
||||
if (Helper.useCrazyPass(context))
|
||||
return getCrazyPass(context, password, 0);
|
||||
else
|
||||
return password;
|
||||
}
|
||||
|
||||
public static String getBrokenCrazyPass(Context context, String password, int brokenVariant) {
|
||||
|
@@ -140,9 +140,8 @@ public class OpenAliasHelper {
|
||||
if (success) {
|
||||
Map<BarcodeData.Asset, BarcodeData> dataMap = new HashMap<>();
|
||||
for (String txt : txts) {
|
||||
BarcodeData bc = BarcodeData.parseOpenAlias(txt);
|
||||
BarcodeData bc = BarcodeData.parseOpenAlias(txt, dnssec);
|
||||
if (bc != null) {
|
||||
bc.setSecurity(dnssec ? BarcodeData.Security.OA_DNSSEC : BarcodeData.Security.OA_NO_DNSSEC);
|
||||
if (!dataMap.containsKey(bc.asset)) {
|
||||
dataMap.put(bc.asset, bc);
|
||||
}
|
||||
|
@@ -97,6 +97,8 @@ public class RestoreHeight {
|
||||
blockheight.put("2018-09-01", 1651347L);
|
||||
blockheight.put("2018-10-01", 1673031L);
|
||||
blockheight.put("2018-11-01", 1695128L);
|
||||
blockheight.put("2018-12-01", 1716687L);
|
||||
blockheight.put("2019-01-01", 1738923L);
|
||||
}
|
||||
|
||||
public long getHeight(String date) {
|
||||
|
@@ -79,8 +79,8 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:drawablePadding="8dp"
|
||||
android:drawableStart="@drawable/ic_xmrto_32dp"
|
||||
android:drawablePadding="8dp"
|
||||
android:gravity="center"
|
||||
android:text="@string/label_send_btc_xmrto_info" />
|
||||
|
||||
@@ -115,6 +115,7 @@
|
||||
style="@style/MoneroLabel.Small"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="end"
|
||||
android:padding="8dp"
|
||||
android:text="@string/tx_destination_btc" />
|
||||
@@ -152,10 +153,10 @@
|
||||
android:background="@color/dotGray"
|
||||
android:drawableEnd="@drawable/ic_content_copy_white_24dp"
|
||||
android:drawablePadding="16dp"
|
||||
android:paddingBottom="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:paddingStart="24dp"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:paddingBottom="8dp"
|
||||
android:textColor="@color/white"
|
||||
tools:text="XMR.TO-d2KQ" />
|
||||
</LinearLayout>
|
||||
@@ -175,25 +176,51 @@
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="end"
|
||||
android:padding="8dp"
|
||||
android:text="@string/tx_account" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvAccount"
|
||||
style="@style/MoneroText"
|
||||
android:gravity="start"
|
||||
android:padding="8dp"
|
||||
android:selectAllOnFocus="true"
|
||||
android:textIsSelectable="true" />
|
||||
<RelativeLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvAccount"
|
||||
style="@style/MoneroText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:gravity="start"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:selectAllOnFocus="true"
|
||||
android:textIsSelectable="true"
|
||||
tools:text="(0,1)" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvAddress"
|
||||
style="@style/MoneroText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/tvAccount"
|
||||
android:gravity="start"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:paddingBottom="8dp"
|
||||
android:selectAllOnFocus="true"
|
||||
android:textIsSelectable="true"
|
||||
tools:text="4BKjy1uVRTPiz4pHyaXXawb82XpzLiowSDd8rEQJGqvN6AD6kWosLQ6VJXW9sghopxXgQSh1RTd54JdvvCRsXiF41xvfeW5" />
|
||||
</RelativeLayout>
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="end"
|
||||
android:padding="8sp"
|
||||
android:text="@string/tx_notes" />
|
||||
@@ -221,8 +248,8 @@
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_centerInParent="true"
|
||||
android:enabled="true"
|
||||
android:paddingEnd="8dp"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:text="@string/tx_button_notes" />
|
||||
</RelativeLayout>
|
||||
|
||||
@@ -232,7 +259,7 @@
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="end"
|
||||
android:padding="8dp"
|
||||
android:text="@string/tx_destination" />
|
||||
@@ -250,7 +277,7 @@
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="end"
|
||||
android:padding="8dp"
|
||||
android:text="@string/tx_paymentId" />
|
||||
@@ -268,7 +295,7 @@
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="end"
|
||||
android:padding="8dp"
|
||||
android:text="@string/tx_id" />
|
||||
@@ -286,7 +313,7 @@
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="end"
|
||||
android:padding="8dp"
|
||||
android:text="@string/tx_key" />
|
||||
@@ -304,7 +331,7 @@
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="end"
|
||||
android:padding="8dp"
|
||||
android:text="@string/tx_blockheight" />
|
||||
@@ -322,7 +349,7 @@
|
||||
|
||||
<TextView
|
||||
style="@style/MoneroLabel.Small"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="end"
|
||||
android:padding="8dp"
|
||||
android:text="@string/tx_transfers" />
|
||||
|
@@ -222,24 +222,24 @@
|
||||
]]></string>
|
||||
|
||||
<string name="help_create_ledger"><![CDATA[
|
||||
<h1>Create Wallet - Ledger</h1>
|
||||
<p>You want to recover your wallet from your Ledger Nano S device.</p>
|
||||
<p>Your secret keys never leave the Ledger device, so you need it plugged in every
|
||||
time you want to access your wallet.</p>
|
||||
<p>Enter a unique wallet name and password. The password is used for securing your wallet data on the Android
|
||||
device. Use a strong password - even better use a passphrase.</p>
|
||||
<p>Enter the block number of the first transaction used for this address in the
|
||||
field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
|
||||
enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
|
||||
<h1>Crear Monedero - Ledger</h1>
|
||||
<p>Deseas recuperar tu monedero desde tu dispositivo Ledger Nano S.</p>
|
||||
<p>Tus claves secretas nunca dejan el dispositivo Ledger, así que lo necesitas conectado cada
|
||||
vez que deseas acceder a tu monedero.</p>
|
||||
<p>Ingresa un nombre de monedero y contraseña únicos. La contraseña es usada para asegurar tu información del monedero en el dispositivo
|
||||
Android. Usa una contraseña fuerte - o mejor aún, usa una frase de contraseña.</p>
|
||||
<p>Ingresa el número del bloque de la primera transacción usada para esta dirección en el
|
||||
campo \"Altura de restaurado\". También puedes usar una fecha en formato AAAA-MM-DD. Si no estás seguro,
|
||||
ingresa una fecha o altura del bloque aproximada <em>anterior</em> a la primera vez que usaste esta dirección del monedero.</p>
|
||||
]]></string>
|
||||
|
||||
<string name="help_wallet"><![CDATA[
|
||||
<h1>El monedero</h1>
|
||||
<h2>Street Mode</h2>
|
||||
<p>Street mode can be enabled/disabled in the menu or Gunther\'s head icon. In this mode, your
|
||||
balance is not shown on any screen so you can safely use your wallet on the street, a pub or
|
||||
other public place. Previous transactions are also hidden. New transactions will be shown, so
|
||||
you can see that you have sent/received sweet Moneroj!</p>
|
||||
<h2>Modo Público</h2>
|
||||
<p>El Modo Público puede ser habilitado/deshabilitado en el menú o en el icono de Gunther\'s. En este modo, tu
|
||||
balance no se muestra en ninguna pantalla para que puedas usar de manera segura tu monedero en la calle, un pub u
|
||||
otro lugar público. Transacciones anteriores también se ocultan. Nuevas transacciones serán mostradas, para
|
||||
que puedas ver que has enviado/recibido Moneroj.</p>
|
||||
<h2>Escaneado</h2>
|
||||
Como a Monero le gusta mantener las cosas privadas, cada vez que abres una cartera de
|
||||
Monerujo es necesario escanear la cadena de bloques para ver si nuevos moneroj han sido
|
||||
@@ -257,51 +257,51 @@
|
||||
]]></string>
|
||||
|
||||
<string name="help_node"><![CDATA[
|
||||
<h1>Nodes</h1>
|
||||
<h1>Nodos</h1>
|
||||
<h2>TL;DR</h2>
|
||||
<p>Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
|
||||
to choose the best one for you!</p>
|
||||
<h2>What's a Node?</h2>
|
||||
<p>Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
|
||||
the Monero Network without having to download and store a copy of the
|
||||
whole blockchain itself.<p>
|
||||
<h2>Node List</h2>
|
||||
<p>If the list is empty, you can either add new nodes manually or let Monerujo
|
||||
scan the network for you. Or both. Read on…</p>
|
||||
<p>The node list shows all currently known nodes. Additionally, the timestamp
|
||||
of the latest block known to each node is shown under the node name. An icon
|
||||
representing the node's response behaviour
|
||||
(which indicates the level of connectivity to be expected)
|
||||
is shown next to each node.</p>
|
||||
<p>Any node in the list can be bookmarked for later use.
|
||||
Nodes which are not bookmarked will be forgotten.<p>
|
||||
<p>Monerujo will choose the optimal bookmarked node each time you use it.
|
||||
It does this by checking the blockheight (how up-to-date
|
||||
is the node?) as well as the response behaviour (how fast does the node respond to requests?).</p>
|
||||
<p>The list is sorted by these characteristics, so the top node would be the one Monerujo
|
||||
would choose right now. The bottom of the list would show very slow or unavailable nodes.</p>
|
||||
<h2>Add a Node</h2>
|
||||
<p>By touching the "Add Node" button at the bottom, you will be asked to
|
||||
enter the node details in the following dialog.
|
||||
The "Address" is the hostname or IP-address of the node - this is the only
|
||||
mandatory entry.
|
||||
Enter the "Port" if the node runs on a non-default port (e.g. 18089).
|
||||
You can also optionally name the node, so you can identify it easier later on.
|
||||
Some nodes require credentials to use them. Enter the provided username &
|
||||
password in the appropriate fields. Now you can "Test" these setting.
|
||||
The "Test Results" will display the blockheight, response time and actual IP used.
|
||||
The result may also be an error - usually because the hostname provided is
|
||||
not reachable in a sensible amount of time or the credentials are incorrect.
|
||||
Or the hostname/port combination does not point to an actual Monero Node!
|
||||
Once the test passes (no error) - you're set to press "OK" to save &
|
||||
bookmark this node.</p>
|
||||
<h2>Scan for Nodes</h2>
|
||||
<p>Additionally, you can scan the network for nodes. Monerujo will start
|
||||
scanning the network for Remote Nodes on port 18089. It begins by asking your
|
||||
bookmarked nodes for other peers in the Monero P2P network and then continues
|
||||
by asking those for their peers, and so on. If you have no bookmarked nodes
|
||||
(or they don't tell us about their peers),
|
||||
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
|
||||
scan stops when it finds 10 remote nodes in total.</p>
|
||||
<p>Refresca la lista de nodos al mostrar los marcadores de nodos para permitir a Monerujo
|
||||
elegir el mejor para ti.</p>
|
||||
<h2>¿Qué es un Nodo?h2>
|
||||
<p>Monerujo usa un Nodo Remoto (algunas veces también llamado Daemon) para comunicarse con
|
||||
la red de Monero sin tener que descargar y almacenar una copia de la
|
||||
cadena de bloques completa.<p>
|
||||
<h2>Lista de Nodos</h2>
|
||||
<p>Si la lista está vacía, puedes agregar nuevos nodos manualmente o dejar que Monerujo
|
||||
escanee la red por ti. O ambos.</p>
|
||||
<p>La lista de nodos muestra todos los nodos actualmente conocidos. Adicionalmente, la marca de tiempo
|
||||
del último bloque conocido para cada nodo se muestra bajo el nombre del nodo. Un icono
|
||||
representando el comportamiento de respuesta del nodo
|
||||
(el cual indica el nivel de conectividad esperado)
|
||||
es mostrado seguido de cada nodo.</p>
|
||||
<p>Cualquier nodo en la lista puede ser marcado para un posterior uso.
|
||||
Nodos que no sean marcados serán olvidados.<p>
|
||||
<p>Monerujo elegirá el nodo marcado óptimo cada vez que lo uses.
|
||||
Esto lo hace revisando la altura del bloque (¿qué tan al día
|
||||
está el nodo?) así como el comportamiento de respuesta (¿qué tan rápido responde el nodo a solicitudes?).</p>
|
||||
<p>La lista se ordena por estas características, por lo tanto el primer nodo en la lista sería el que Monerujo
|
||||
elegiría en ese momento. El final de la lista mostraría nodos muy lentos o no disponibles.</p>
|
||||
<h2>Agregar un Nodo</h2>
|
||||
<p>Presionando en el botón "Agregar Nodo" en la parte inferior, se te pedirá que
|
||||
ingreses los detalles del nodo en el siguiente cuadro de diálogo.
|
||||
La "Dirección" es el nombre del host o dirección IP del nodo - esta es la única
|
||||
entrada obligatoria.
|
||||
Ingresa el "Puerto" si el nodo se ejecuta en un puerto que no es por defecto (e.g. 18089).
|
||||
Puedes también nombrar el nodo opcionalmente, para que puedas identificarlo después fácilmente.
|
||||
Algunos nodos requieren credenciales para usarlos. Ingresa el nombre de usuario provisto &
|
||||
contraseña en los campos apropiados. Ahora puedes "Verificar" estos ajustes.
|
||||
Los "Resultados de la Prueba" mostrarán la altura del bloque, tiempo de respuesta y dirección IP real usados.
|
||||
El resultado puede ser también un error - usualmente porque el nombre de host provisto no
|
||||
es alcanzable en una sensible cantidad de tiempo o las credenciales son incorrectas.
|
||||
O la combinación nombre de host/puerto no indican a un nodo de Monero real.
|
||||
Una vez que la prueba sea exitosa (sin error) - estás listo para presionar "OK" para guardar &
|
||||
como marcador este nodo.</p>
|
||||
<h2>Escanear por Nodos</h2>
|
||||
<p>Adicionalmente, puedes escanear la red por nodos. Monerujo empezará
|
||||
escaneando la red por Nodos Remotos con puerto 18089. Comienza preguntando tus
|
||||
nodos marcados por otros compañeros en la red P2P de Monero y después continúa
|
||||
preguntando por nodos a ellos por sus compañeros, y así. Si no tienes nodos marcados
|
||||
(o no nos comunican sobre sus compañeros),
|
||||
Monerujo irá directo a los nodos semilla de Monero codificados en Monero. El
|
||||
escaneo parará cuando encuentre 10 nodos remotos en total.</p>
|
||||
]]></string>
|
||||
</resources>
|
||||
|
@@ -281,75 +281,75 @@
|
||||
<string name="accounts_new">Nueva cuenta agregada #%1$d</string>
|
||||
<string name="tx_account"># de cuenta</string>
|
||||
|
||||
<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="send_sweepall">¡Enviar todos los fondos confirmados en esta cuenta!</string>
|
||||
<string name="tx_subaddress">Subdirecciones #%1$d</string>
|
||||
<string name="generate_address_label_sub">Subdirecciones Públicas #%1$d</string>
|
||||
|
||||
<string name="menu_language">Language</string>
|
||||
<string name="language_system_default">Use System Language</string>
|
||||
<string name="menu_language">Lenguaje</string>
|
||||
<string name="language_system_default">Usar Idioma del Sistema</string>
|
||||
|
||||
<string name="fab_restore_ledger">Restore from Ledger Nano S</string>
|
||||
<string name="fab_restore_ledger">Restaurar desde Ledger Nano S</string>
|
||||
|
||||
<string name="progress_ledger_progress">Communicating with Ledger</string>
|
||||
<string name="progress_ledger_confirm">Confirmation on Ledger required!</string>
|
||||
<string name="progress_ledger_lookahead">Retrieving subaddresses</string>
|
||||
<string name="progress_ledger_verify">Verifying keys</string>
|
||||
<string name="progress_ledger_opentx">Doing crazy maths</string>
|
||||
<string name="progress_ledger_mlsag">Hashing stuff</string>
|
||||
<string name="open_wallet_ledger_missing">Please (re)connect Ledger device</string>
|
||||
<string name="progress_ledger_progress">Comunicándose con Ledger</string>
|
||||
<string name="progress_ledger_confirm">¡Confirmación en Ledger requerida!</string>
|
||||
<string name="progress_ledger_lookahead">Recuperando subdirecciones</string>
|
||||
<string name="progress_ledger_verify">Verificando claves</string>
|
||||
<string name="progress_ledger_opentx">Realizando cálculos alocados</string>
|
||||
<string name="progress_ledger_mlsag">Cosas de hash</string>
|
||||
<string name="open_wallet_ledger_missing">Por favor (re)conecta el dispositivo Ledger</string>
|
||||
|
||||
<string name="accounts_progress_new">Creating account</string>
|
||||
<string name="accounts_progress_new">Creando cuenta</string>
|
||||
|
||||
<string name="toast_ledger_attached">%1$s attached</string>
|
||||
<string name="toast_ledger_detached">%1$s detached</string>
|
||||
<string name="toast_ledger_attached">%1$s adjunto</string>
|
||||
<string name="toast_ledger_detached">%1$s separado</string>
|
||||
|
||||
<string name="progress_nfc_write">Writing Tag</string>
|
||||
<string name="nfc_write_failed">Writing Tag failed!</string>
|
||||
<string name="nfc_write_successful">Writing Tag successful</string>
|
||||
<string name="nfc_tag_unsupported">Tag does not support NDEF!</string>
|
||||
<string name="nfc_tag_size">Tag provides %1$d bytes, but we need %2$d!</string>
|
||||
<string name="nfc_tag_read_undef">I don\'t understand the Tag!</string>
|
||||
<string name="nfc_tag_read_what">I don\'t know what you want!</string>
|
||||
<string name="nfc_tag_read_success">Reading Tag successful</string>
|
||||
<string name="nfc_tag_tap">NFC Available!</string>
|
||||
<string name="progress_nfc_write">Escribiento Etiqueta</string>
|
||||
<string name="nfc_write_failed">¡Escritura de Etiqueta fallida!</string>
|
||||
<string name="nfc_write_successful">Escritura de Etiqueta exitosa</string>
|
||||
<string name="nfc_tag_unsupported">¡Etiqueta no soporta NDEF!</string>
|
||||
<string name="nfc_tag_size">La etiqueta provee %1$d bytes, pero necesitamos %2$d!</string>
|
||||
<string name="nfc_tag_read_undef">¡No comprendo la etiqueta!</string>
|
||||
<string name="nfc_tag_read_what">¡No sé lo que pides!</string>
|
||||
<string name="nfc_tag_read_success">Lectura de Etiqueta exitosa</string>
|
||||
<string name="nfc_tag_tap">¡NFC disponible!</string>
|
||||
|
||||
<string name="receive_desc_hint">Description (optional)</string>
|
||||
<string name="receive_desc_hint">Descripción (opcional)</string>
|
||||
|
||||
<string name="send_address_not_openalias">OpenAlias address not available</string>
|
||||
<string name="send_address_openalias">OpenAlias secure ✔</string>
|
||||
<string name="send_address_resolve_openalias">Resolving OpenAlias…</string>
|
||||
<string name="send_address_no_dnssec">OpenAlias without DNSSEC - address may be spoofed</string>
|
||||
<string name="send_address_hint">Receiver\'s XMR/BTC Address or OpenAlias</string>
|
||||
<string name="send_address_not_openalias">Dirección OpenAlias no disponible</string>
|
||||
<string name="send_address_openalias">OpenAlias asegurado ✔</string>
|
||||
<string name="send_address_resolve_openalias">Resolviendo OpenAlias…</string>
|
||||
<string name="send_address_no_dnssec">OpenAlias sin DNSSEC - la drección puede ser falsificada</string>
|
||||
<string name="send_address_hint">Dirección XMR/BTC del receptor u OpenAlias</string>
|
||||
|
||||
<string name="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
|
||||
<string name="status_wallet_connect_wrongversion">Versión de nodo incompatible - ¡por favor actualiza!</string>
|
||||
|
||||
<string name="menu_info">Detalles</string><!--Changed to: Show Secrets!-->
|
||||
<string name="menu_streetmode">Street Mode</string>
|
||||
<string name="menu_streetmode">Modo Público</string>
|
||||
|
||||
<string name="info_nodes_enabled">Node-o-matiC enabled, tap for more info.</string>
|
||||
<string name="node_height">Last block updated: %1$s</string>
|
||||
<string name="label_nodes">Nodes</string>
|
||||
<string name="node_name_hint">Node Name (Optional)</string>
|
||||
<string name="node_address_hint">Hostname</string>
|
||||
<string name="node_port_hint">Port</string>
|
||||
<string name="node_user_hint">Username (Optional)</string>
|
||||
<string name="node_pass_hint">Password (Optional)</string>
|
||||
<string name="node_host_unresolved">Cannot resolve host</string>
|
||||
<string name="node_host_empty">We need this!</string>
|
||||
<string name="node_port_numeric">Must be numeric</string>
|
||||
<string name="node_port_range">Must be 1–65535</string>
|
||||
<string name="node_fab_add">Add Node</string>
|
||||
<string name="node_refresh_hint">Touch to refresh!</string>
|
||||
<string name="node_test_error">CONNECTION ERROR %1$d</string>
|
||||
<string name="node_general_error">CONNECTION ERROR</string>
|
||||
<string name="node_auth_error">AUTHENTICATION FAILED</string>
|
||||
<string name="node_result_label">Test Result:</string>
|
||||
<string name="node_result">Height: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s</string>
|
||||
<string name="node_testing">Testing IP: %1$s …</string>
|
||||
<string name="node_refresh_wait">Please wait for scan to finish</string>
|
||||
<string name="node_create_hint">Touch to select or add nodes</string>
|
||||
<string name="node_pull_hint">Add nodes manually or pull down to scan</string>
|
||||
<string name="node_scanning">Scanning network…</string>
|
||||
<string name="node_nobookmark">Automatically bookmarked best %1$d nodes</string>
|
||||
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
|
||||
<string name="info_nodes_enabled">Nodo-o-matiC habilitado, toque para más información.</string>
|
||||
<string name="node_height">Último bloque actualizado: %1$s</string>
|
||||
<string name="label_nodes">Nodos</string>
|
||||
<string name="node_name_hint">Nombre del Nodo (Opcional)</string>
|
||||
<string name="node_address_hint">Nombre del Host</string>
|
||||
<string name="node_port_hint">Puerto</string>
|
||||
<string name="node_user_hint">Usuario (Opcional)</string>
|
||||
<string name="node_pass_hint">Contraseña (Opcional)</string>
|
||||
<string name="node_host_unresolved">No se puede resolver el host</string>
|
||||
<string name="node_host_empty">¡Necesitamos esto!</string>
|
||||
<string name="node_port_numeric">Debe ser numérico</string>
|
||||
<string name="node_port_range">Debe ser 1–65535</string>
|
||||
<string name="node_fab_add">Agregar Nodo</string>
|
||||
<string name="node_refresh_hint">¡Toca para refrescar!</string>
|
||||
<string name="node_test_error">ERROR DE CONECCIÓN %1$d</string>
|
||||
<string name="node_general_error">ERROR DE CONECCIÓN</string>
|
||||
<string name="node_auth_error">AUTENTIFICACIÓN FALLIDA</string>
|
||||
<string name="node_result_label">Resultados de la prueba:</string>
|
||||
<string name="node_result">Altura: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s</string>
|
||||
<string name="node_testing">Probando el IP: %1$s …</string>
|
||||
<string name="node_refresh_wait">Por favor espera a que termine el escaneo</string>
|
||||
<string name="node_create_hint">Toca para seleccionar o agregar nodos</string>
|
||||
<string name="node_pull_hint">Agregar nodos manualmente o presiona para escanear</string>
|
||||
<string name="node_scanning">Escaneando la red…</string>
|
||||
<string name="node_nobookmark">Mejores %1$d nodos marcados automáticamente</string>
|
||||
<string name="label_test">Probar</string><!--note: as in "Test a network connection"-->
|
||||
</resources>
|
||||
|
@@ -8,54 +8,54 @@
|
||||
<b>Autorid</b>
|
||||
<br/>
|
||||
m2049r, baltsar777, anhdres, keejef,
|
||||
rehrar, EarlOfEgo, ErCiccione et al.
|
||||
rehrar, EarlOfEgo, ErCiccione jt
|
||||
<br/><br/>
|
||||
<a href="https://monerujo.io/">monerujo.io</a>
|
||||
]]></string>
|
||||
|
||||
<string name="privacy_policy"><![CDATA[
|
||||
<h1>Privacy Policy</h1>
|
||||
<p>This page informs you of our policies regarding the collection,
|
||||
use and disclosure of personal information we receive from users of our
|
||||
app (monerujo: Monero Wallet).
|
||||
<h1>Privaatsuspoliitika</h1>
|
||||
<p>See leht informeerib sind personaalsete andmete kogumise, kasutamise ja
|
||||
avaldamise osas, mida saame meie äpi (monerujo: Monero Wallet) kasutajatelt.
|
||||
</p>
|
||||
<p>By using the app, you agree to the collection and use of information in
|
||||
accordance with this policy.
|
||||
<p>Äppi kasutades nõustute teabe kogumise ja kasutamisega vastavalt sellele
|
||||
poliitikale.
|
||||
</p>
|
||||
<h2>Data Collected</h2>
|
||||
<p>Personal data is any kind of data that could identify an individual.
|
||||
<h2>Kogutud andmed</h2>
|
||||
<p>Isikuandmed on igasugused andmed, mis võivad isikut tuvastada.
|
||||
</p>
|
||||
<p>Monero keys and public addresses are collected and processed by the app locally
|
||||
for the purpose of processing transactions and transmitted into the Monero Network
|
||||
in encrypted form.
|
||||
<p>Monero võtmeid ja avalikke aadresse kogutakse ja töödeldakse äpisiseselt
|
||||
tehingute töötlemiseks ja edastatakse Monero võrku krüptitud kujul.
|
||||
</p>
|
||||
<p>Other personal data is not collected by the app.</p>
|
||||
<p>If you use the exchange (optional) functionality, monerujo fetches the exchange
|
||||
rate through the public API of coinmarketcap.com.
|
||||
See their privacy policy at https://coinmarketcap.com/privacy for
|
||||
details on how data in your requests is collected.</p>
|
||||
<p>If you use the app to pay to BTC addresses, you will be using the XMR.TO service.
|
||||
See their privacy policy at https://xmr.to/ for details. Monerujo send them the BTC
|
||||
destination address and amount. Your IP will also be collectable.</p>
|
||||
<h2>App Permissions</h2>
|
||||
<p>Rakendus ei kogu muid isikuandmeid.</p>
|
||||
<p>Kui kasutate vahetusfunktsiooni, kasutab monerujo selleks coinmarketcap.com\'i
|
||||
avaliku API funktsiooni. Vaadake nende privaatsuspoliitikat aadressil
|
||||
https://coinmarketcap.com/privacy, et saada üksikasju, kuidas teie päringute kohta
|
||||
andmeid kogutakse.</p>
|
||||
<p>Kui kasutate äppi BTC-aadressitele raha saatmiseks, siis kasutatakse selleks
|
||||
XMR.TO teenust. Lisateabe saamiseks vaadake nende privaatsuspoliitikat aadressil
|
||||
https://xmr.to/. Monerujo saadab neile BTC sihtkoha aadressi ja summa. Koguda
|
||||
võidakse ka teie IP aadressi.</p>
|
||||
<h2>Äpi õigused</h2>
|
||||
<ul>
|
||||
<li>INTERNET : Connect to the Monero Network via a Monero Daemon Node</li>
|
||||
<li>READ_EXTERNAL_STORAGE : Read wallet files stored on the device</li>
|
||||
<li>WRITE_EXTERNAL_STORAGE : Write wallet files stored on the device</li>
|
||||
<li>WAKE_LOCK : Keep device awake while syncing</li>
|
||||
<li>CAMERA : Scan QR Codes for receiving Monero</li>
|
||||
<li>INTERNET : Monero võrguga ühenduse loomine Monero Daemoni sõlmpunkti kaudu</li>
|
||||
<li>READ_EXTERNAL_STORAGE : Seadmesse salvestatud rahakoti failide lugemiseks</li>
|
||||
<li>WRITE_EXTERNAL_STORAGE : Rahakoti failide seadmesse salvestamiseks</li>
|
||||
<li>WAKE_LOCK : Sünkroonimise ajal hoiab seadme ärkvel</li>
|
||||
<li>CAMERA : QR-koodi lugemine Monero saamiseks</li>
|
||||
</ul>
|
||||
<h2>Changes to this Privacy Policy</h2>
|
||||
<p>We may update this privacy policy from time to time. We will notify
|
||||
you of any changes by posting the new privacy policy in the app and on the
|
||||
website (www.monerujo.io)
|
||||
You are advised to review this privacy policy periodically for any changes.
|
||||
<p>This Privacy Policy was last updated: 10th November, 2017.
|
||||
<h2>Privaatsuspoliitika muudatused</h2>
|
||||
<p>Me võime aeg-ajalt seda privaatsuspoliitikat uuendada. Teatame teile kõigist
|
||||
muudatustest, avaldades uued privaatsuseeskirjad äpis ja veebis (www.monerujo.io)
|
||||
Soovitame teil seda privaatsuspoliitikat perioodiliselt üle vaadata juhuks,
|
||||
kui vahepeal on toimunud muutusi.
|
||||
</p>
|
||||
<h2>Contact Us</h2>
|
||||
<p>If you have any questions about our privacy policy,
|
||||
or how your data is being collected and processed,
|
||||
please e-mail privacy@monerujo.io.
|
||||
<p>Seda privaatsuspoliitikat uuendati viimati: 10. november, 2017.
|
||||
</p>
|
||||
<h2>Võta meiega ühendust</h2>
|
||||
<p>Kui teil on mingeid küsimusi meie privaatsuseeskirjade kohta või kuidas teie
|
||||
andmeid kogutakse ja töödeldakse, siis palume saata e-post aadressile
|
||||
privacy@monerujo.io.
|
||||
</p>
|
||||
]]></string>
|
||||
</resources>
|
||||
|
@@ -167,14 +167,11 @@
|
||||
<string name="generate_fingerprint_hint">Luba rahakoti avamine sõrmejäljega</string>
|
||||
<string name="generate_fingerprint_warn"><![CDATA[
|
||||
<strong>Sõrmejäljega avamine</strong>
|
||||
<p>With fingerprint authentication enabled, you can view wallet balance and receive funds
|
||||
without entering password.</p>
|
||||
<p>But for additional security, monerujo will still require you to enter password when
|
||||
viewing wallet details or sending funds.</p>
|
||||
<p>Kui sõrmejäljega avamine on sisse lülitatud, saad kontoseisu vaadata ja raha vastu võtta ilma parooli sisestamata.</p>
|
||||
<p>Kuid kõrgema turvalisuse nimel palutakse sul sisestada parool siis, kui vaatad rahakoti infot või saadad raha.</p>
|
||||
<strong>Turvahoiatus</strong>
|
||||
<p>Finally, monerujo wants to remind you that anyone who can get your fingerprint will be
|
||||
able to peep into your wallet balance.</p>
|
||||
<p>For instance, a malicious user around you can open your wallet when you are asleep.</p>
|
||||
<p>Lõpetuseks, monerujo tahab sulle meelde tuletada, et igaüks, kes pääseb ligi sinu sõrmejäljele, saab vaadata su kontoseisu.</p>
|
||||
<p>Näiteks on võimalik pahatahtlikel inimestel nii avada su rahakott, kui sa magad.</p>
|
||||
<strong>Oled kindel, et soovid selle aktiveerida?</strong>
|
||||
]]></string>
|
||||
<string name="generate_bad_passwordB">Paroolid ei kattu</string>
|
||||
@@ -336,32 +333,32 @@
|
||||
<string name="menu_info">Näita salajast infot</string>
|
||||
<string name="menu_streetmode">Avalik režiim</string>
|
||||
|
||||
<string name="info_nodes_enabled">Node-o-matiC enabled, tap for more info.</string>
|
||||
<string name="node_height">Last block updated: %1$s</string>
|
||||
<string name="label_nodes">Nodes</string>
|
||||
<string name="node_name_hint">Node Name (Optional)</string>
|
||||
<string name="node_address_hint">Hostname</string>
|
||||
<string name="info_nodes_enabled">Node-o-matiC sisse lülitatud, puuduta lisainfo saamiseks.</string>
|
||||
<string name="node_height">Viimane uuendatud plokk: %1$s</string>
|
||||
<string name="label_nodes">Serverid</string>
|
||||
<string name="node_name_hint">Serveri nimi (valikuline)</string>
|
||||
<string name="node_address_hint">Aadress</string>
|
||||
<string name="node_port_hint">Port</string>
|
||||
<string name="node_user_hint">Username (Optional)</string>
|
||||
<string name="node_pass_hint">Password (Optional)</string>
|
||||
<string name="node_host_unresolved">Cannot resolve host</string>
|
||||
<string name="node_host_empty">We need this!</string>
|
||||
<string name="node_port_numeric">Must be numeric</string>
|
||||
<string name="node_port_range">Must be 1–65535</string>
|
||||
<string name="node_fab_add">Add Node</string>
|
||||
<string name="node_refresh_hint">Touch to refresh!</string>
|
||||
<string name="node_test_error">CONNECTION ERROR %1$d</string>
|
||||
<string name="node_general_error">CONNECTION ERROR</string>
|
||||
<string name="node_auth_error">AUTHENTICATION FAILED</string>
|
||||
<string name="node_result_label">Test Result:</string>
|
||||
<string name="node_result">Height: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s</string>
|
||||
<string name="node_testing">Testing IP: %1$s …</string>
|
||||
<string name="node_refresh_wait">Please wait for scan to finish</string>
|
||||
<string name="node_create_hint">Touch to select or add nodes</string>
|
||||
<string name="node_pull_hint">Add nodes manually or pull down to scan</string>
|
||||
<string name="node_scanning">Scanning network…</string>
|
||||
<string name="node_nobookmark">Automatically bookmarked best %1$d nodes</string>
|
||||
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
|
||||
<string name="node_user_hint">Kasutajanimi (valikuline)</string>
|
||||
<string name="node_pass_hint">Parool (valikuline)</string>
|
||||
<string name="node_host_unresolved">Aadressi lahendmine ebaõnnestus</string>
|
||||
<string name="node_host_empty">Meil on seda vaja!</string>
|
||||
<string name="node_port_numeric">Peab olema arv</string>
|
||||
<string name="node_port_range">Peab olema 1–65535</string>
|
||||
<string name="node_fab_add">Lisa server</string>
|
||||
<string name="node_refresh_hint">Puuduta värskendamiseks!</string>
|
||||
<string name="node_test_error">ÜHENDUSE VIGA %1$d</string>
|
||||
<string name="node_general_error">ÜHENDUSE VIGA</string>
|
||||
<string name="node_auth_error">SISSE LOGIMINE EBAÕNNESTUS</string>
|
||||
<string name="node_result_label">Testi tulemus:</string>
|
||||
<string name="node_result">Kõrgus: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s</string>
|
||||
<string name="node_testing">Testimise IP: %1$s …</string>
|
||||
<string name="node_refresh_wait">Palun oota otsimise lõpuni</string>
|
||||
<string name="node_create_hint">Puuduta serverite valimiseks või lisamiseks</string>
|
||||
<string name="node_pull_hint">Lisa serverid käsitsi või pühi sõrmega alla, et otsida</string>
|
||||
<string name="node_scanning">Otsin võrgust…</string>
|
||||
<string name="node_nobookmark">Automaatselt salvestati parimad %1$d serverit</string>
|
||||
<string name="label_test">Testi</string><!--note: as in "Test a network connection"-->
|
||||
|
||||
<string name="backup_success">Backup successful</string>
|
||||
<string name="backup_success">Tagavarakoopia õnnestus</string>
|
||||
</resources>
|
||||
|
@@ -240,51 +240,49 @@
|
||||
]]></string>
|
||||
|
||||
<string name="help_node"><![CDATA[
|
||||
<h1>Nodes</h1>
|
||||
<h2>TL;DR</h2>
|
||||
<p>Refresh the nodes list by pulling down & bookmark 3–5 nodes to allow Monerujo
|
||||
to choose the best one for you!</p>
|
||||
<h2>What's a Node?</h2>
|
||||
<p>Monerujo uses a Remote Node (sometimes also called Daemon) to communicate with
|
||||
the Monero Network without having to download and store a copy of the
|
||||
whole blockchain itself.<p>
|
||||
<h2>Node List</h2>
|
||||
<p>If the list is empty, you can either add new nodes manually or let Monerujo
|
||||
scan the network for you. Or both. Read on…</p>
|
||||
<p>The node list shows all currently known nodes. Additionally, the timestamp
|
||||
of the latest block known to each node is shown under the node name. An icon
|
||||
representing the node's response behaviour
|
||||
(which indicates the level of connectivity to be expected)
|
||||
is shown next to each node.</p>
|
||||
<p>Any node in the list can be bookmarked for later use.
|
||||
Nodes which are not bookmarked will be forgotten.<p>
|
||||
<p>Monerujo will choose the optimal bookmarked node each time you use it.
|
||||
It does this by checking the blockheight (how up-to-date
|
||||
is the node?) as well as the response behaviour (how fast does the node respond to requests?).</p>
|
||||
<p>The list is sorted by these characteristics, so the top node would be the one Monerujo
|
||||
would choose right now. The bottom of the list would show very slow or unavailable nodes.</p>
|
||||
<h2>Add a Node</h2>
|
||||
<p>By touching the "Add Node" button at the bottom, you will be asked to
|
||||
enter the node details in the following dialog.
|
||||
The "Address" is the hostname or IP-address of the node - this is the only
|
||||
mandatory entry.
|
||||
Enter the "Port" if the node runs on a non-default port (e.g. 18089).
|
||||
You can also optionally name the node, so you can identify it easier later on.
|
||||
Some nodes require credentials to use them. Enter the provided username &
|
||||
password in the appropriate fields. Now you can "Test" these setting.
|
||||
The "Test Results" will display the blockheight, response time and actual IP used.
|
||||
The result may also be an error - usually because the hostname provided is
|
||||
not reachable in a sensible amount of time or the credentials are incorrect.
|
||||
Or the hostname/port combination does not point to an actual Monero Node!
|
||||
Once the test passes (no error) - you're set to press "OK" to save &
|
||||
bookmark this node.</p>
|
||||
<h2>Scan for Nodes</h2>
|
||||
<p>Additionally, you can scan the network for nodes. Monerujo will start
|
||||
scanning the network for Remote Nodes on port 18089. It begins by asking your
|
||||
bookmarked nodes for other peers in the Monero P2P network and then continues
|
||||
by asking those for their peers, and so on. If you have no bookmarked nodes
|
||||
(or they don't tell us about their peers),
|
||||
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
|
||||
scan stops when it finds 10 remote nodes in total.</p>
|
||||
<h1>Nodi</h1>
|
||||
<h2>In breve</h2>
|
||||
<p>Aggiorna la lista dei nodi tirando giù & contrassegna 3–5 i nodi per consentire a Monerujo
|
||||
di scegliere il migliore per te!</p>
|
||||
<h2>Cos'è un nodo?</h2>
|
||||
<p>Monerujo usa un nodo remoto (talvolta chiamato Daemon) per comunicare con la
|
||||
rete Monero senza dover scaricare e tenere in memoria una copia
|
||||
dell'intera blockchain</p>
|
||||
<h2>Lista dei nodi</h2>
|
||||
<p>Se la lista è vuota, puoi aggiungere nuovi nodi manualmente o lasciare che Monerujo
|
||||
effettui la scansione della rete per te. O entrambe le cose. Leggi su…</p>
|
||||
<p>La lista dei nodi mostra tutti i nodi conosciuti. Inoltre, sotto il nome del nodo viene visualizzato il timestamp
|
||||
dell'ultimo blocco conosciuto ad ogni nodo. Accanto ad ogni nodo viene visualizzata un'icona che
|
||||
rappresenta il comportamento in risposta di quel nodo
|
||||
(che in sostanza indica il livello di connettività atteso).</p>
|
||||
<p>Ogni nodo della lista può essere aggiunto come segnalibro per un utilizzo successivo.
|
||||
Nodi che non vengono aggiunti come segnalibro saranno dimenticati successivamente.<p>
|
||||
<p>Monerujo sceglie il miglior nodo registrato ogni volta che lo usi.
|
||||
Il nodo migliore viene selezionato controllando l'altezza di blocco (quanto è aggiornato
|
||||
il nodo?) nonché il suo comportamento in risposta (quanto velocemente il nodo risponde alle richieste?).</p>
|
||||
<p>La lista è ordinata per queste caratteristiche, in modo tale che il nodo in cima alla lista è quello che Monerujo
|
||||
selezionerebbe adesso. In fondo alla lista compaiono i nodi ritenuti molto lenti o non disponibili.</p>
|
||||
<h2>Aggiungere un nodo</h2>
|
||||
<p>Toccando il pulsante "Aggiungi nodo" in fondo, ti verrà chiesto di
|
||||
inserire i dettagli del nodo nella schermata successiva.
|
||||
L'"Indirizzo" è il nome host o l'indirizzo IP del nodo - questa è l'unica informazione necessaria.
|
||||
Inserisci la "Porta" se il nodo utilizza una porta diversa da quella di default (es. 18089).
|
||||
Puoi inoltre assegnare un nome al nodo, in modo tale da poterlo facilmente identificare in futuro.
|
||||
Alcuni nodi richiedono delle credenziali per poter essere usati. Inserisci negli appositi campi il nome utente &
|
||||
password forniti. Ora puoi "Effettuare un Test" con queste impostazioni.
|
||||
I "Risultati del Test" visualizzeranno l'altezza di blocco, il tempo di risposta e l'IP correntemente utilizzato.
|
||||
Il risultato potrebbe essere anche un errore - molte volte perché il nome host fornito non è
|
||||
raggiungibile per un ragionevole lasso di tempo o le credenziali non sono corrette.
|
||||
O se la combinazione nome host/porta non punta a un vero nodo Monero!
|
||||
Una volta che il test ha dato esito positivo (nessun errore) - hai la possibilità di premere "OK" per salvare&
|
||||
aggiungere questo nodo ai segnalibri.</p>
|
||||
<h2>Esegui scansione alla ricerca di nodi</h2>
|
||||
<p>Puoi anche eseguire una scansione su rete alla ricerca di nodi. Monerujo inizierà
|
||||
la scansione della rete alla ricerca di nodi sulla porta 18089, chiedendo dapprima ai tuoi
|
||||
nodi salvati i loro peer all'interno della rete P2P di Monero per poi proseguire
|
||||
chiedendo peer a questi ultimi e così via. Se non hai nodi salvati
|
||||
(o se essi non ci comunicano i loro peer),
|
||||
Monerujo proseguirà con i nodi seed codificati in Monero. La scansione
|
||||
termina quando vengono trovati 10 nodi in totale.</p>
|
||||
]]></string>
|
||||
</resources>
|
||||
|
@@ -340,30 +340,30 @@
|
||||
<string name="menu_info">Mostra i segreti!</string>
|
||||
<string name="menu_streetmode">Modalità strada</string>
|
||||
|
||||
<string name="info_nodes_enabled">Node-o-matiC enabled, tap for more info.</string>
|
||||
<string name="node_height">Last block updated: %1$s</string>
|
||||
<string name="label_nodes">Nodes</string>
|
||||
<string name="node_name_hint">Node Name (Optional)</string>
|
||||
<string name="node_address_hint">Hostname</string>
|
||||
<string name="node_port_hint">Port</string>
|
||||
<string name="node_user_hint">Username (Optional)</string>
|
||||
<string name="node_pass_hint">Password (Optional)</string>
|
||||
<string name="node_host_unresolved">Cannot resolve host</string>
|
||||
<string name="node_host_empty">We need this!</string>
|
||||
<string name="node_port_numeric">Must be numeric</string>
|
||||
<string name="node_port_range">Must be 1–65535</string>
|
||||
<string name="node_fab_add">Add Node</string>
|
||||
<string name="node_refresh_hint">Touch to refresh!</string>
|
||||
<string name="node_test_error">CONNECTION ERROR %1$d</string>
|
||||
<string name="node_general_error">CONNECTION ERROR</string>
|
||||
<string name="node_auth_error">AUTHENTICATION FAILED</string>
|
||||
<string name="node_result_label">Test Result:</string>
|
||||
<string name="node_result">Height: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s</string>
|
||||
<string name="node_testing">Testing IP: %1$s …</string>
|
||||
<string name="node_refresh_wait">Please wait for scan to finish</string>
|
||||
<string name="node_create_hint">Touch to select or add nodes</string>
|
||||
<string name="node_pull_hint">Add nodes manually or pull down to scan</string>
|
||||
<string name="node_scanning">Scanning network…</string>
|
||||
<string name="node_nobookmark">Automatically bookmarked best %1$d nodes</string>
|
||||
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
|
||||
<string name="info_nodes_enabled">Node-o-matiC abilitato, tocca per maggiori informazioni.</string>
|
||||
<string name="node_height">Ultimo blocco aggiornato: %1$s</string>
|
||||
<string name="label_nodes">Nodi</string>
|
||||
<string name="node_name_hint">Nome nodo (opzionale)</string>
|
||||
<string name="node_address_hint">Nome host</string>
|
||||
<string name="node_port_hint">Porta</string>
|
||||
<string name="node_user_hint">Nome utente (opzionale)</string>
|
||||
<string name="node_pass_hint">Password (opzionale)</string>
|
||||
<string name="node_host_unresolved">Host non risolvibile</string>
|
||||
<string name="node_host_empty">Abbiamo bisogno di questo!</string>
|
||||
<string name="node_port_numeric">Deve essere numerico</string>
|
||||
<string name="node_port_range">Deve essere 1–65535</string>
|
||||
<string name="node_fab_add">Aggiungi nodo</string>
|
||||
<string name="node_refresh_hint">Tocca per aggiornare!</string>
|
||||
<string name="node_test_error">ERRORE CONNESSIONE %1$d</string>
|
||||
<string name="node_general_error">ERRORE CONNESSIONE</string>
|
||||
<string name="node_auth_error">AUTENTICAZIONE FALLITA</string>
|
||||
<string name="node_result_label">Risultato del test:</string>
|
||||
<string name="node_result">Altezza: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s</string>
|
||||
<string name="node_testing">Controllo IP: %1$s …</string>
|
||||
<string name="node_refresh_wait">Attendi il termine della scansione</string>
|
||||
<string name="node_create_hint">Tocca per selezionare o aggiungere nodi</string>
|
||||
<string name="node_pull_hint">Aggiungi nodi manualmente o tira giù per effettuare scansione</string>
|
||||
<string name="node_scanning">Scansione rete…</string>
|
||||
<string name="node_nobookmark">Aggiunti automaticamente ai segnalibri i %1$d nodi migliori</string>
|
||||
<string name="label_test">Effettua Test</string><!--note: as in "Test a network connection"-->
|
||||
</resources>
|
||||
|
63
app/src/main/res/values-ja/about.xml
Normal file
63
app/src/main/res/values-ja/about.xml
Normal file
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="about_close">閉じる</string>
|
||||
<string name="about_whoami">私はmonerujoです</string>
|
||||
<string name="about_version">バージョン %1$s (%2$d)</string>
|
||||
|
||||
<string name="credits_text"><![CDATA[
|
||||
<b>クレジット</b>
|
||||
<br/>
|
||||
m2049r, baltsar777, anhdres, keejef,
|
||||
rehrar, EarlOfEgo, ErCiccione et al.
|
||||
<br/><br/>
|
||||
<a href="https://monerujo.io/">monerujo.io</a>
|
||||
]]></string>
|
||||
|
||||
<string name="privacy_policy"><![CDATA[
|
||||
<h1>プライバシーポリシー</h1>
|
||||
<p>このページでは私達のアプリ(monerujo: Monero Wallet)
|
||||
のユーザーから収集される個人情報の収集、利用、
|
||||
開示に関する私達のポリシーを説明します。
|
||||
</p>
|
||||
<p>アプリを利用することによって、あなたはこのポリシーに従って
|
||||
個人情報が収集・利用されることに同意したとみなされます。
|
||||
</p>
|
||||
<h2>収集されるデータ</h2>
|
||||
<p>個人情報は、個人を識別できるあらゆる種類のデータのことをいいます。
|
||||
</p>
|
||||
<p>モネロの鍵と公開アドレスは、トランザクション処理のために
|
||||
アプリによってローカル領域で収集・処理され、
|
||||
モネロネットワークには暗号化された形で送信されます。
|
||||
</p>
|
||||
<p>その他の個人情報はアプリによって収集されません。</p>
|
||||
<p>もしあなたが(オプションで)交換機能を利用する場合は、
|
||||
monerujoは交換レートを coinmarketcap.com の公開APIを通じて取得します。
|
||||
あなたのリクエストのデータがどのように収集されているのかの
|
||||
詳細については、coinmarketcap.com のプライバシーポリシーを
|
||||
https://coinmarketcap.com/privacy にて参照してください。</p>
|
||||
<p>もしあなたがこのアプリをビットコインアドレス宛に支払う場合、
|
||||
あなたは XMR.TO のサービスを使うことになります。
|
||||
https://xmr.to/ を参照して XMR.TO のプライバシーポリシーを
|
||||
ご覧ください。Monerujoは XMR.TO にビットコインの支払先アドレスと
|
||||
数量を送信します。あなたのIPアドレスもまた収集されます。</p>
|
||||
<h2>アプリの権限</h2>
|
||||
<ul>
|
||||
<li>インターネット接続 : モネロネットワークに、モネロデーモンノードを通じて接続します</li>
|
||||
<li>外部ストレージからの読み込み : デバイスに保存されたウォレットファイルを読み込みます</li>
|
||||
<li>外部ストレージへの書き込み : デバイスに保存されたウォレットファイルに書き込みます</li>
|
||||
<li>ウェイク・ロック : 同期中にデバイスを起動した状態に保ちます</li>
|
||||
<li>カメラ : モネロ受取用のQRコードを読み取ります</li>
|
||||
</ul>
|
||||
<h2>このプライバシーポリシーに対する変更</h2>
|
||||
<p>私達はこのプライバシーポリシーを時々更新することがあります。
|
||||
その際はアプリとウェブサイト(www.monerujo.io)にて新しい
|
||||
プライバシーポリシーを表示し、通知します。
|
||||
あなたはこのプライバシーポリシーに変更がないか定期的に目を通すことが推奨されます。
|
||||
<p>このプライバシーポリシーの最後の変更日時: 10th November, 2017.
|
||||
</p>
|
||||
<h2>コンタクト</h2>
|
||||
<p>もし私達のプライバシーポリシーやデータの収集・利用に関して何か質問があれば
|
||||
privacy@monerujo.io までメールをお願いします。
|
||||
</p>
|
||||
]]></string>
|
||||
</resources>
|
425
app/src/main/res/values-ja/help.xml
Normal file
425
app/src/main/res/values-ja/help.xml
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user