Feature bitpay (#525)

* support bitcoin payment protocol (BIP70/72)

* prep translations
This commit is contained in:
m2049r 2019-01-27 21:32:06 +01:00 committed by GitHub
parent 1a5d2d0399
commit 39d048fd5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
59 changed files with 872 additions and 175 deletions

View File

@ -36,7 +36,7 @@ import com.m2049r.xmrwallet.model.TransactionInfo;
import com.m2049r.xmrwallet.model.Transfer;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.UserNotes;
import com.m2049r.xmrwallet.data.UserNotes;
import com.m2049r.xmrwallet.widget.Toolbar;
import java.text.SimpleDateFormat;

View File

@ -59,7 +59,7 @@ import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.service.WalletService;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
import com.m2049r.xmrwallet.util.UserNotes;
import com.m2049r.xmrwallet.data.UserNotes;
import com.m2049r.xmrwallet.widget.Toolbar;
import java.util.ArrayList;
@ -958,8 +958,6 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
}
if (!processed || (onUriScannedListener == null)) {
Toast.makeText(this, getString(R.string.nfc_tag_read_what), Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, getString(R.string.nfc_tag_read_success), Toast.LENGTH_SHORT).show();
}
}

View File

@ -21,7 +21,10 @@ import android.net.Uri;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.util.BitcoinAddressValidator;
import com.m2049r.xmrwallet.util.OpenAliasHelper;
import com.m2049r.xmrwallet.util.PaymentProtocolHelper;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
@ -37,9 +40,10 @@ public class BarcodeData {
public static final String OA_XMR_ASSET = "xmr";
public static final String OA_BTC_ASSET = "btc";
static final String BTC_SCHEME = "bitcoin:";
static final String BTC_SCHEME = "bitcoin";
static final String BTC_DESCRIPTION = "message";
static final String BTC_AMOUNT = "amount";
static final String BTC_BIP70_PARM = "r";
public enum Asset {
XMR, BTC
@ -48,7 +52,8 @@ public class BarcodeData {
public enum Security {
NORMAL,
OA_NO_DNSSEC,
OA_DNSSEC
OA_DNSSEC,
BIP70
}
final public Asset asset;
@ -58,57 +63,44 @@ public class BarcodeData {
final public String amount;
final public String description;
final public Security security;
final public String bip70;
public BarcodeData(Asset asset, String address) {
this.asset = asset;
this.address = address;
amount = null;
paymentId = null;
addressName = null;
description = null;
this.security = Security.NORMAL;
this(asset, address, null, null, null, null, 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;
this(asset, address, null, null, null, amount, Security.NORMAL);
}
public BarcodeData(Asset asset, String address, String amount, String description, Security security) {
this(asset, address, null, null, description, amount, security);
}
public BarcodeData(Asset asset, String address, String paymentId, String amount) {
this.asset = asset;
this.address = address;
this.paymentId = paymentId;
this.amount = amount;
addressName = null;
description = null;
this.security = Security.NORMAL;
this(asset, address, null, paymentId, null, amount, Security.NORMAL);
}
public BarcodeData(Asset asset, String address, String paymentId, String description, String amount) {
this.asset = asset;
this.address = address;
this.paymentId = paymentId;
this.description = description;
this.amount = amount;
addressName = null;
this.security = Security.NORMAL;
this(asset, address, null, paymentId, description, amount, Security.NORMAL);
}
public BarcodeData(Asset asset, String address, String addressName, String paymentId, String description, String amount, Security sec) {
public BarcodeData(Asset asset, String address, String addressName, String paymentId, String description, String amount, Security security) {
this(asset, address, addressName, null, paymentId, description, amount, security);
}
public BarcodeData(Asset asset, String address, String addressName, String bip70, String paymentId, String description, String amount, Security security) {
this.asset = asset;
this.address = address;
this.bip70 = bip70;
this.addressName = addressName;
this.paymentId = paymentId;
this.description = description;
this.amount = amount;
this.security = sec;
this.security = security;
}
public Uri getUri() {
return Uri.parse(getUriString());
}
@ -146,6 +138,10 @@ public class BarcodeData {
if (bcData == null) {
bcData = parseBitcoinUri(qrCode);
}
// check for btc payment uri (like bitpay)
if (bcData == null) {
bcData = parseBitcoinPaymentUrl(qrCode);
}
// check for naked btc address
if (bcData == null) {
bcData = parseBitcoinNaked(qrCode);
@ -228,19 +224,28 @@ public class BarcodeData {
}
// bitcoin:mpQ84J43EURZHkCnXbyQ4PpNDLLBqdsMW2?amount=0.01
static public BarcodeData parseBitcoinUri(String uri) {
Timber.d("parseBitcoinUri=%s", uri);
// bitcoin:?r=https://bitpay.com/i/xxx
static public BarcodeData parseBitcoinUri(String uriString) {
Timber.d("parseBitcoinUri=%s", uriString);
if (uri == null) return null;
if (uriString == null) return null;
URI uri;
try {
uri = new URI(uriString);
} catch (URISyntaxException ex) {
return null;
}
if (!uri.isOpaque() ||
!uri.getScheme().equals(BTC_SCHEME)) return null;
if (!uri.startsWith(BTC_SCHEME)) return null;
String noScheme = uri.substring(BTC_SCHEME.length());
Uri bitcoin = Uri.parse(noScheme);
String[] parts = uri.getRawSchemeSpecificPart().split("[?]");
if ((parts.length <= 0) || (parts.length > 2)) {
Timber.d("invalid number of parts %d", parts.length);
return null;
}
Map<String, String> parms = new HashMap<>();
String query = bitcoin.getQuery();
if (query != null) {
String[] args = query.split("&");
if (parts.length == 2) {
String[] args = parts[1].split("&");
for (String arg : args) {
String[] namevalue = arg.split("=");
if (namevalue.length == 0) {
@ -250,10 +255,26 @@ public class BarcodeData {
namevalue.length > 1 ? Uri.decode(namevalue[1]) : "");
}
}
String address = bitcoin.getPath();
String description = parms.get(BTC_DESCRIPTION);
String address = parts[0]; // no need to decode as there can bo no special characters
if (address.isEmpty()) { // possibly a BIP72 uri
String bip70 = parms.get(BTC_BIP70_PARM);
if (bip70 == null) {
Timber.d("no address and can't find pp url");
return null;
}
if (!PaymentProtocolHelper.isHttp(bip70)) {
Timber.d("[%s] is not http url", bip70);
return null;
}
return new BarcodeData(BarcodeData.Asset.BTC, null, null, bip70, null, description, null, Security.NORMAL);
}
if (!BitcoinAddressValidator.validate(address)) {
Timber.d("BTC address (%s) invalid", address);
return null;
}
String amount = parms.get(BTC_AMOUNT);
if (amount != null) {
if ((amount != null) && (!amount.isEmpty())) {
try {
Double.parseDouble(amount);
} catch (NumberFormatException ex) {
@ -261,11 +282,22 @@ public class BarcodeData {
return null; // we have an amount but its not a number!
}
}
if (!BitcoinAddressValidator.validate(address)) {
Timber.d("address invalid");
return new BarcodeData(BarcodeData.Asset.BTC, address, null, description, amount);
}
// https://bitpay.com/invoice?id=xxx
// https://bitpay.com/i/KbMdd4EhnLXSbpWGKsaeo6
static public BarcodeData parseBitcoinPaymentUrl(String url) {
Timber.d("parseBitcoinUri=%s", url);
if (url == null) return null;
if (!PaymentProtocolHelper.isHttp(url)) {
Timber.d("[%s] is not http url", url);
return null;
}
return new BarcodeData(BarcodeData.Asset.BTC, address, null, description, amount);
return new BarcodeData(Asset.BTC, url);
}
static public BarcodeData parseBitcoinNaked(String address) {

View File

@ -20,9 +20,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import com.m2049r.xmrwallet.model.PendingTransaction;
import com.m2049r.xmrwallet.util.UserNotes;
import timber.log.Timber;
// https://stackoverflow.com/questions/2139134/how-to-send-an-object-from-one-android-activity-to-another-using-intents
public class TxData implements Parcelable {

View File

@ -18,12 +18,11 @@ package com.m2049r.xmrwallet.data;
import android.os.Parcel;
import com.m2049r.xmrwallet.model.PendingTransaction;
public class TxDataBtc extends TxData {
private String xmrtoUuid;
private String btcAddress;
private String bip70;
private double btcAmount;
public TxDataBtc() {
@ -50,6 +49,14 @@ public class TxDataBtc extends TxData {
this.btcAddress = btcAddress;
}
public String getBip70() {
return bip70;
}
public void setBip70(String bip70) {
this.bip70 = bip70;
}
public double getBtcAmount() {
return btcAmount;
}
@ -63,6 +70,7 @@ public class TxDataBtc extends TxData {
super.writeToParcel(out, flags);
out.writeString(xmrtoUuid);
out.writeString(btcAddress);
out.writeString(bip70);
out.writeDouble(btcAmount);
}
@ -81,16 +89,19 @@ public class TxDataBtc extends TxData {
super(in);
xmrtoUuid = in.readString();
btcAddress = in.readString();
bip70 = in.readString();
btcAmount = in.readDouble();
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
sb.append(",xmrtoUuid:");
sb.append(xmrtoUuid);
sb.append(",btcAddress:");
sb.append(btcAddress);
sb.append(",bip70:");
sb.append(bip70);
sb.append(",btcAmount:");
sb.append(btcAmount);
return sb.toString();

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package com.m2049r.xmrwallet.util;
package com.m2049r.xmrwallet.data;
import com.m2049r.xmrwallet.xmrto.api.QueryOrderStatus;

View File

@ -39,12 +39,15 @@ import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.data.BarcodeData;
import com.m2049r.xmrwallet.data.TxData;
import com.m2049r.xmrwallet.data.TxDataBtc;
import com.m2049r.xmrwallet.data.UserNotes;
import com.m2049r.xmrwallet.model.PendingTransaction;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.util.BitcoinAddressValidator;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.OpenAliasHelper;
import com.m2049r.xmrwallet.util.UserNotes;
import com.m2049r.xmrwallet.util.PaymentProtocolHelper;
import com.m2049r.xmrwallet.xmrto.XmrToError;
import com.m2049r.xmrwallet.xmrto.XmrToException;
import java.util.Map;
@ -72,6 +75,8 @@ public class SendAddressWizardFragment extends SendWizardFragment {
BarcodeData getBarcodeData();
BarcodeData popBarcodeData();
void setMode(SendFragment.Mode mode);
TxData getTxData();
@ -89,6 +94,8 @@ public class SendAddressWizardFragment extends SendWizardFragment {
private View llXmrTo;
private boolean resolvingOA = false;
private boolean resolvingPP = false;
private String resolvedPP = null;
OnScanListener onScanListener;
@ -113,28 +120,54 @@ public class SendAddressWizardFragment extends SendWizardFragment {
etAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
etAddress.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
|| (actionId == EditorInfo.IME_ACTION_NEXT)) {
String dnsOA = dnsFromOpenAlias(etAddress.getEditText().getText().toString());
// ignore ENTER
return ((event != null) && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER));
}
});
etAddress.getEditText().setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
View next = etAddress;
String enteredAddress = etAddress.getEditText().getText().toString().trim();
String dnsOA = dnsFromOpenAlias(enteredAddress);
Timber.d("OpenAlias is %s", dnsOA);
if (dnsOA != null) {
processOpenAlias(dnsOA);
next = null;
} else {
// maybe a bip72 or 70 URI
String bip70 = PaymentProtocolHelper.getBip70(enteredAddress);
if (bip70 != null) {
// looks good - resolve through xmr.to
processBip70(bip70);
next = null;
} else if (checkAddress()) {
if (llPaymentId.getVisibility() == View.VISIBLE) {
etPaymentId.requestFocus();
next = etPaymentId;
} else {
etDummy.requestFocus();
Helper.hideKeyboard(getActivity());
next = etNotes;
}
}
return true;
}
return false;
if (next != null) {
final View focus = next;
etAddress.post(new Runnable() {
@Override
public void run() {
focus.requestFocus();
}
});
}
}
}
});
etAddress.getEditText().addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable editable) {
Timber.d("AFTER: %s", editable.toString());
if (editable.toString().equals(resolvedPP)) return; // no change required
resolvedPP = null;
etAddress.setError(null);
if (isIntegratedAddress()) {
Timber.d("isIntegratedAddress");
@ -143,15 +176,11 @@ public class SendAddressWizardFragment extends SendWizardFragment {
tvPaymentIdIntegrated.setVisibility(View.VISIBLE);
llXmrTo.setVisibility(View.INVISIBLE);
sendListener.setMode(SendFragment.Mode.XMR);
} else if (isBitcoinAddress()) {
} else if (isBitcoinAddress() || (resolvedPP != null)) {
Timber.d("isBitcoinAddress");
etPaymentId.getEditText().getText().clear();
llPaymentId.setVisibility(View.INVISIBLE);
tvPaymentIdIntegrated.setVisibility(View.INVISIBLE);
llXmrTo.setVisibility(View.VISIBLE);
sendListener.setMode(SendFragment.Mode.BTC);
setBtcMode();
} else {
Timber.d("isStandardAddress");
Timber.d("isStandardAddress or other");
llPaymentId.setVisibility(View.VISIBLE);
tvPaymentIdIntegrated.setVisibility(View.INVISIBLE);
llXmrTo.setVisibility(View.INVISIBLE);
@ -227,7 +256,6 @@ public class SendAddressWizardFragment extends SendWizardFragment {
}
});
etDummy = view.findViewById(R.id.etDummy);
etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
etDummy.requestFocus();
@ -241,8 +269,18 @@ public class SendAddressWizardFragment extends SendWizardFragment {
return view;
}
private void setBtcMode() {
Timber.d("setBtcMode");
etPaymentId.getEditText().getText().clear();
llPaymentId.setVisibility(View.INVISIBLE);
tvPaymentIdIntegrated.setVisibility(View.INVISIBLE);
llXmrTo.setVisibility(View.VISIBLE);
sendListener.setMode(SendFragment.Mode.BTC);
}
private void processOpenAlias(String dnsOA) {
if (resolvingOA) return; // already resolving - just wait
sendListener.popBarcodeData();
if (dnsOA != null) {
resolvingOA = true;
etAddress.setError(getString(R.string.send_address_resolve_openalias));
@ -255,8 +293,6 @@ public class SendAddressWizardFragment extends SendWizardFragment {
if (barcodeData != null) {
Timber.d("Security=%s, %s", barcodeData.security.toString(), barcodeData.address);
processScannedData(barcodeData);
etDummy.requestFocus();
Helper.hideKeyboard(getActivity());
} else {
etAddress.setError(getString(R.string.send_address_not_openalias));
Timber.d("NO XMR OPENALIAS TXT FOUND");
@ -273,10 +309,62 @@ public class SendAddressWizardFragment extends SendWizardFragment {
} // else ignore
}
private void processBip70(final String bip70) {
Timber.d("RESOLVED PP: %s", resolvedPP);
if (resolvingPP) return; // already resolving - just wait
resolvingPP = true;
sendListener.popBarcodeData();
etAddress.setError(getString(R.string.send_address_resolve_bip70));
PaymentProtocolHelper.resolve(bip70, new PaymentProtocolHelper.OnResolvedListener() {
@Override
public void onResolved(BarcodeData.Asset asset, String address, double amount, String resolvedBip70) {
resolvingPP = false;
if (asset != BarcodeData.Asset.BTC)
throw new IllegalArgumentException("only BTC here");
if (resolvedBip70 == null)
throw new IllegalArgumentException("success means we have a pp_url - else die");
final BarcodeData barcodeData =
new BarcodeData(BarcodeData.Asset.BTC, address, null,
resolvedBip70, null, null, String.valueOf(amount),
BarcodeData.Security.BIP70);
etNotes.post(new Runnable() {
@Override
public void run() {
Timber.d("security is %s", barcodeData.security);
processScannedData(barcodeData);
etNotes.requestFocus();
}
});
}
@Override
public void onFailure(final Exception ex) {
resolvingPP = false;
etAddress.post(new Runnable() {
@Override
public void run() {
int errorMsgId = R.string.send_address_not_bip70;
if (ex instanceof XmrToException) {
XmrToError error = ((XmrToException) ex).getError();
if (error != null) {
errorMsgId = error.getErrorMsgId();
}
}
etAddress.setError(getString(errorMsgId));
}
});
Timber.d("PP FAILED");
}
});
}
private boolean checkAddressNoError() {
String address = etAddress.getEditText().getText().toString();
return Wallet.isAddressValid(address)
|| BitcoinAddressValidator.validate(address);
|| BitcoinAddressValidator.validate(address)
|| (resolvedPP != null);
}
private boolean checkAddress() {
@ -322,25 +410,39 @@ public class SendAddressWizardFragment extends SendWizardFragment {
@Override
public boolean onValidateFields() {
boolean ok = true;
if (!checkAddressNoError()) {
shakeAddress();
ok = false;
String dnsOA = dnsFromOpenAlias(etAddress.getEditText().getText().toString());
String enteredAddress = etAddress.getEditText().getText().toString().trim();
String dnsOA = dnsFromOpenAlias(enteredAddress);
Timber.d("OpenAlias is %s", dnsOA);
if (dnsOA != null) {
processOpenAlias(dnsOA);
} else {
String bip70 = PaymentProtocolHelper.getBip70(enteredAddress);
if (bip70 != null) {
processBip70(bip70);
}
}
return false;
}
if (!checkPaymentId()) {
etPaymentId.startAnimation(Helper.getShakeAnimation(getContext()));
ok = false;
return false;
}
if (!ok) return false;
if (sendListener != null) {
TxData txData = sendListener.getTxData();
if (isBitcoinAddress()) {
if (txData instanceof TxDataBtc) {
if (resolvedPP != null) {
// take the value from the field nonetheless as this is what the user sees
// (in case we have a bug somewhere)
((TxDataBtc) txData).setBip70(etAddress.getEditText().getText().toString());
((TxDataBtc) txData).setBtcAddress(null);
} else {
((TxDataBtc) txData).setBtcAddress(etAddress.getEditText().getText().toString());
((TxDataBtc) txData).setBip70(null);
}
txData.setDestinationAddress(null);
txData.setPaymentId("");
} else {
@ -381,12 +483,22 @@ public class SendAddressWizardFragment extends SendWizardFragment {
}
public void processScannedData() {
resolvedPP = null;
BarcodeData barcodeData = sendListener.getBarcodeData();
if (barcodeData != null) {
Timber.d("GOT DATA");
String scannedAddress = barcodeData.address;
if (scannedAddress != null) {
etAddress.getEditText().setText(scannedAddress);
if (barcodeData.bip70 != null) {
setBtcMode();
if (barcodeData.security == BarcodeData.Security.BIP70) {
resolvedPP = barcodeData.bip70;
etAddress.setError(getString(R.string.send_address_bip70));
} else {
processBip70(barcodeData.bip70);
}
etAddress.getEditText().setText(barcodeData.bip70);
} else if (barcodeData.address != null) {
etAddress.getEditText().setText(barcodeData.address);
if (checkAddress()) {
if (barcodeData.security == BarcodeData.Security.OA_NO_DNSSEC)
etAddress.setError(getString(R.string.send_address_no_dnssec));
@ -397,6 +509,7 @@ public class SendAddressWizardFragment extends SendWizardFragment {
etAddress.getEditText().getText().clear();
etAddress.setError(null);
}
String scannedPaymentId = barcodeData.paymentId;
if (scannedPaymentId != null) {
etPaymentId.getEditText().setText(scannedPaymentId);

View File

@ -120,6 +120,15 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
return true;
}
private void setBip70Mode() {
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
if (txDataBtc.getBip70() != null) {
numberPad.setVisibility(View.INVISIBLE);
} else {
numberPad.setVisibility(View.VISIBLE);
}
}
double maxBtc = 0;
double minBtc = 0;
@ -141,12 +150,13 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
tvFunds.setText(getString(R.string.send_available,
getString(R.string.unknown_amount)));
}
if ((evAmount.getAmount() == null) || evAmount.getAmount().isEmpty()) {
final BarcodeData data = sendListener.popBarcodeData();
if ((data != null) && (data.amount != null)) {
if (data != null) {
if (data.amount != null) {
evAmount.setAmount(data.amount);
}
}
setBip70Mode();
callXmrTo();
}

View File

@ -524,8 +524,8 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
xmrtoStatus = null;
showProgress(1, getString(R.string.label_send_progress_xmrto_create));
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
double btcAmount = txDataBtc.getBtcAmount();
getXmrToApi().createOrder(btcAmount, txDataBtc.getBtcAddress(), new XmrToCallback<CreateOrder>() {
XmrToCallback<CreateOrder> callback = new XmrToCallback<CreateOrder>() {
@Override
public void onSuccess(CreateOrder createOrder) {
if (!isResumed) return;
@ -545,7 +545,13 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
}
processCreateOrderError(ex);
}
});
};
if (txDataBtc.getBip70() != null) {
getXmrToApi().createOrder(txDataBtc.getBip70(), callback);
} else {
getXmrToApi().createOrder(txDataBtc.getBtcAmount(), txDataBtc.getBtcAddress(), callback);
}
}
private QueryOrderStatus xmrtoStatus = null;
@ -666,7 +672,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
private XmrToApi xmrToApi = null;
private final XmrToApi getXmrToApi() {
private XmrToApi getXmrToApi() {
if (xmrToApi == null) {
synchronized (this) {
if (xmrToApi == null) {

View File

@ -36,7 +36,7 @@ import com.m2049r.xmrwallet.data.TxData;
import com.m2049r.xmrwallet.model.PendingTransaction;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.UserNotes;
import com.m2049r.xmrwallet.data.UserNotes;
import timber.log.Timber;

View File

@ -34,7 +34,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.m2049r.xmrwallet.OnBackPressedListener;
import com.m2049r.xmrwallet.OnUriScannedListener;
@ -47,7 +46,7 @@ import com.m2049r.xmrwallet.layout.SpendViewPager;
import com.m2049r.xmrwallet.model.PendingTransaction;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.Notice;
import com.m2049r.xmrwallet.util.UserNotes;
import com.m2049r.xmrwallet.data.UserNotes;
import com.m2049r.xmrwallet.widget.DotBar;
import com.m2049r.xmrwallet.widget.Toolbar;

View File

@ -28,7 +28,7 @@ import android.widget.TextView;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.model.TransactionInfo;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.UserNotes;
import com.m2049r.xmrwallet.data.UserNotes;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

View File

@ -0,0 +1,102 @@
/*
* Copyright (c) 2018 m2049r
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Specs from https://openalias.org/
package com.m2049r.xmrwallet.util;
import com.m2049r.xmrwallet.data.BarcodeData;
import com.m2049r.xmrwallet.xmrto.api.CreateOrder;
import com.m2049r.xmrwallet.xmrto.api.XmrToApi;
import com.m2049r.xmrwallet.xmrto.api.XmrToCallback;
import com.m2049r.xmrwallet.xmrto.network.XmrToApiImpl;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import timber.log.Timber;
public class PaymentProtocolHelper {
//https://bitpay.com/i/xxx
public static boolean isHttp(String string) {
if ((string == null) || (string.isEmpty())) return false;
try {
// new URL(string).toURI() checks if its a real url
return new URL(string).toURI().getScheme().startsWith("http");
} catch (MalformedURLException | URISyntaxException ex) {
return false;
}
}
// guess if the string may be a valid payment uri
//https://bitpay.com/i/xxx
//bitcoin:?r=https://bitpay.com/i/xxx
public static String getBip70(String bip72Or70) {
if ((bip72Or70 == null) || (bip72Or70.isEmpty())) return null;
if (isHttp(bip72Or70)) return bip72Or70;
BarcodeData bc = BarcodeData.parseBitcoinUri(bip72Or70);
if (bc == null) return null;
return bc.bip70;
}
public interface OnResolvedListener {
void onResolved(BarcodeData.Asset asset, String address, double amount, String bip70);
void onFailure(Exception ex);
}
static public boolean resolve(final String bip70, final OnResolvedListener resolvedListener) {
if ((bip70 == null) || (bip70.isEmpty()))
return false; //pointless trying to lookup nothing
Timber.d("Resolving %s", bip70);
getXmrToApi().createOrder(bip70, new XmrToCallback<CreateOrder>() {
@Override
public void onSuccess(CreateOrder createOrder) {
if (resolvedListener != null) {
resolvedListener.onResolved(BarcodeData.Asset.BTC,
createOrder.getBtcDestAddress(),
createOrder.getBtcAmount(),
createOrder.getBtcBip70());
}
}
@Override
public void onError(Exception ex) {
if (resolvedListener != null) {
resolvedListener.onFailure(ex);
}
}
});
return true;
}
static private XmrToApi xmrToApi = null;
static private XmrToApi getXmrToApi() {
if (xmrToApi == null) {
synchronized (PaymentProtocolHelper.class) {
if (xmrToApi == null) {
xmrToApi = new XmrToApiImpl(OkHttpHelper.getOkHttpClient(),
Helper.getXmrToBaseUrl());
}
}
}
return xmrToApi;
}
}

View File

@ -16,6 +16,8 @@
package com.m2049r.xmrwallet.xmrto;
import com.m2049r.xmrwallet.R;
import org.json.JSONException;
import org.json.JSONObject;
@ -33,7 +35,10 @@ public class XmrToError {
XMRTO_ERROR_006, // (404) requested order not found check order UUID
XMRTO_ERROR_007, // (503) third party service not available try again later
XMRTO_ERROR_008, // (503) insufficient funds available try again later
XMRTO_ERROR_009 // (400) invalid request check request parameters
XMRTO_ERROR_009, // (400) invalid request check request parameters
XMRTO_ERROR_010, // (400) payment protocol failed invalid or outdated data served by url
XMRTO_ERROR_011, // (400) malformed payment protocol url url is malformed or cannot be contacted
XMRTO_ERROR_012 // (403) too many requests
}
public boolean isRetryable() {
@ -78,6 +83,21 @@ public class XmrToError {
return errorMsg;
}
public int getErrorMsgId() {
switch (errorId) {
case XMRTO_ERROR_001:
return R.string.xmrto_error_001;
case XMRTO_ERROR_004:
return R.string.xmrto_error_004;
case XMRTO_ERROR_010:
return R.string.xmrto_error_010;
case XMRTO_ERROR_012:
return R.string.xmrto_error_012;
default:
return R.string.xmrto_error;
}
}
@Override
public String toString() {
return getErrorIdString(getErrorId()) + ": " + getErrorMsg();
@ -97,6 +117,10 @@ public class XmrToError {
400 XMRTO-ERROR-003 invalid bitcoin amount check amount data type
503 XMRTO-ERROR-004 bitcoin amount out of bounds check min and max amount
400 XMRTO-ERROR-005 unexpected validation error contact support
Errors from Create Order Payment Protocol
400 XMRTO-ERROR-010 payment protocol failed invalid or outdated data served by url
400 XMRTO-ERROR-011 malformed payment protocol url url is malformed or cannot be contacted
*/
/* Errors from Query Order
@ -104,4 +128,8 @@ public class XmrToError {
400 XMRTO-ERROR-009 invalid request check request parameters
404 XMRTO-ERROR-006 requested order not found check order UUID
*/
/* General
403 XMRTO-ERROR-012 too many requests
*/
}

View File

@ -21,6 +21,8 @@ public interface CreateOrder {
String getBtcDestAddress();
String getBtcBip70();
String getState();
String getUuid();

View File

@ -35,6 +35,13 @@ public interface XmrToApi {
*/
void createOrder(final double amount, @NonNull final String address, @NonNull final XmrToCallback<CreateOrder> callback);
/**
* Creates an order through BIP70 payment protocol like bitpay
*
* @param url the BIP70 URL
*/
void createOrder(@NonNull final String url, @NonNull final XmrToCallback<CreateOrder> callback);
/**
* Queries the order status for given current order
*

View File

@ -18,8 +18,8 @@ package com.m2049r.xmrwallet.xmrto.network;
import android.support.annotation.NonNull;
import com.m2049r.xmrwallet.xmrto.api.XmrToCallback;
import com.m2049r.xmrwallet.xmrto.api.CreateOrder;
import com.m2049r.xmrwallet.xmrto.api.XmrToCallback;
import org.json.JSONException;
import org.json.JSONObject;
@ -29,6 +29,7 @@ class CreateOrderImpl implements CreateOrder {
private final String state;
private final double btcAmount;
private final String btcDestAddress;
private final String btcBip70;
private final String uuid;
public Double getBtcAmount() {
@ -39,6 +40,10 @@ class CreateOrderImpl implements CreateOrder {
return btcDestAddress;
}
public String getBtcBip70() {
return btcBip70;
}
public String getUuid() {
return uuid;
}
@ -51,6 +56,10 @@ class CreateOrderImpl implements CreateOrder {
this.state = jsonObject.getString("state");
this.btcAmount = jsonObject.getDouble("btc_amount");
this.btcDestAddress = jsonObject.getString("btc_dest_address");
if (jsonObject.has("pp_url"))
this.btcBip70 = jsonObject.getString("pp_url");
else
this.btcBip70 = null;
this.uuid = jsonObject.getString("uuid");
}
@ -78,6 +87,30 @@ class CreateOrderImpl implements CreateOrder {
}
}
public static void call(@NonNull final XmrToApiCall api, @NonNull final String url,
@NonNull final XmrToCallback<CreateOrder> callback) {
try {
final JSONObject request = createRequest(url);
api.call("order_create_pp", request, new NetworkCallback() {
@Override
public void onSuccess(JSONObject jsonObject) {
try {
callback.onSuccess(new CreateOrderImpl(jsonObject));
} catch (JSONException ex) {
callback.onError(ex);
}
}
@Override
public void onError(Exception ex) {
callback.onError(ex);
}
});
} catch (JSONException ex) {
callback.onError(ex);
}
}
static JSONObject createRequest(final double amount, final String address) throws JSONException {
final JSONObject jsonObject = new JSONObject();
jsonObject.put("btc_amount", amount);
@ -85,5 +118,10 @@ class CreateOrderImpl implements CreateOrder {
return jsonObject;
}
static JSONObject createRequest(final String ppUrl) throws JSONException {
final JSONObject jsonObject = new JSONObject();
jsonObject.put("pp_url", ppUrl);
return jsonObject;
}
}

View File

@ -64,6 +64,12 @@ public class XmrToApiImpl implements XmrToApi, XmrToApiCall {
CreateOrderImpl.call(this, amount, address, callback);
}
@Override
public void createOrder(@NonNull final String url,
@NonNull final XmrToCallback<CreateOrder> callback) {
CreateOrderImpl.call(this, url, callback);
}
@Override
public void queryOrderStatus(@NonNull final String uuid,
@NonNull final XmrToCallback<QueryOrderStatus> callback) {
@ -113,6 +119,7 @@ public class XmrToApiImpl implements XmrToApi, XmrToApiCall {
} else {
try {
final JSONObject json = new JSONObject(response.body().string());
Timber.d(json.toString(2));
final XmrToError error = new XmrToError(json);
Timber.e("xmr.to says %d/%s", response.code(), error.toString());
callback.onError(new XmrToException(response.code(), error));

View File

@ -47,8 +47,8 @@
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:layout_margin="8dp"
android:drawablePadding="8dp"
android:drawableStart="@drawable/ic_check_gray_24dp"
android:drawablePadding="8dp"
android:gravity="center"
android:text="@string/info_paymentid_intergrated"
android:textSize="18sp"
@ -83,21 +83,21 @@
tools:text="@string/info_xmrto" />
</LinearLayout>
<LinearLayout
<RelativeLayout
android:id="@+id/llPaymentId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="4dp"
android:orientation="horizontal"
android:visibility="visible"
android:weightSum="10">
android:visibility="visible">
<android.support.design.widget.TextInputLayout
android:id="@+id/etPaymentId"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="10"
android:layout_alignParentStart="true"
android:layout_toStartOf="@+id/bPaymentId"
app:counterEnabled="true"
app:counterMaxLength="16"
app:errorEnabled="true">
@ -118,12 +118,13 @@
style="@style/MoneroText.Button.Small"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_alignParentEnd="true"
android:layout_gravity="center"
android:layout_marginStart="8dp"
android:background="?android:selectableItemBackground"
android:background="?android:selectableItemBackgroundBorderless"
android:drawableTop="@drawable/ic_settings_orange_24dp"
android:text="@string/send_generate_paymentid_hint" />
</LinearLayout>
</RelativeLayout>
</FrameLayout>
<android.support.design.widget.TextInputLayout
@ -177,8 +178,8 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:drawablePadding="8dp"
android:drawableStart="@drawable/ic_nfc_black_24dp"
android:drawablePadding="8dp"
android:gravity="center"
android:text="@string/nfc_tag_tap"
android:visibility="visible" />

View File

@ -144,8 +144,14 @@
<p>Dies ist die öffentliche Adresse des Wallets, an die du Moneroj sendest. Du kannst sie aus der Zwischenablage kopieren,
einen QR-Code scannen oder sie manuell eingeben. Vergewissere dich, dass es die richtige Adresse ist um
sicherzustellen die Moneroj nicht irrtümlich an eine falsche Adresse zu senden.</p>
<p>Zusätzlich zum Senden von XMR kannst du auch BTC mittels des XMR.TO Service versenden (siehe https://xmr.to
für Details). Siehe den Abschnitt über das Versenden von BTC unten.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>Zahlungs-ID</h2>
<p>Du kannst eine Zahlungs-ID benutzen um den Grund einer Transaktion zwischen zwei Parteien zu identifizieren. Dies ist optional
und nicht öffentlich einsehbar. Zum Beispiel kann ein Unternehmen damit Zahlungen und Verkäufe miteinander verbinden.<p>
@ -281,4 +287,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -322,7 +322,6 @@
<string name="send_address_openalias">OpenAlias sicher &#x2714;</string>
<string name="send_address_resolve_openalias">Löse OpenAlias auf&#8230;</string>
<string name="send_address_no_dnssec">OpenAlias ohne DNSSEC - Adresse kann gefälscht sein!</string>
<string name="send_address_hint">Empfänger XMR/BTC Adresse oder OpenAlias</string>
<string name="progress_nfc_write">Schreibe Tag</string>
<string name="nfc_write_failed">Schreiben des Tags fehlgeschlagen!</string>
@ -365,4 +364,14 @@
<string name="node_scanning">Scanning network&#8230;</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="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<string name="send_address_hint">Empfänger</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -123,8 +123,14 @@
<p>Αυή είναι η δημόσια διεύθυνση πορτοφολιού που στέλνεις Moneroj, μπορείς να το αντιγράψεις
από το πρόχειρο, να σαρώσεις έναν κωδικό QR ή να το πληκτρολογήσεις. Βεβαιώσου οτι έχεις τριπλο-ελέγξει
για να είσαι σίγουρος ότι δεν στέλνεις σε λάθος διύθυνση τα κεφάλαια σου.</p>
<p>Εκτός από την αποστολή XMR, μπορείς να στείλεις BTC δια μέσου της υπηρεσίας XMR.TO (δες https://xmr.to
για πληροφορίες). Δες την ενότητα σχετικά με αποστολή BTC παρακάτω.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>ID Πληρωμής</h2>
<p>Μπορείς να χρησιμοποιήσεις ένα ID Πληρωμής(Payment ID) για να προσδιορίσεις τον λόγο που στέλνεις Monero
ανάμεσα σε δύο ενδιαφερόμενους αυτό είναι προεραιτικό και ιδωτικό. Για παράδειγμα μπορεί να επιτρέψει σε μια επιχείρηση
@ -266,4 +272,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -331,7 +331,6 @@
<string name="send_address_openalias">OpenAlias secure &#x2714;</string>
<string name="send_address_resolve_openalias">Resolving OpenAlias&#8230;</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="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
@ -364,4 +363,14 @@
<string name="node_scanning">Scanning network&#8230;</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="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -78,7 +78,7 @@
Asegúrate de escribir esta contraseña. Si restablececes tu dispositivo o desinstalas esta
aplicación, vas a necesitarla para acceder a tu monedero otra vez.<br/>
<h3>CrAzYpass</h3>
Si la contraseña que se muestra consiste de 52 caracteres alfanuméricos en grupos de 4...
Si la contraseña que se muestra consiste de 52 caracteres alfanuméricos en grupos de 4&#8230;
¡felicitaciones!
Los archivos de tu monedero están asegurado con una clave de 256 bits, generada por tu
propio dispositivo basándose en la contraseña que elegiste (al crear el monedero o luego
@ -160,6 +160,14 @@
<p>Esta es la dirección pública del monedero al que vas a enviar moneroj. Puedes copiarla
desde tu portapapeles, escanear un código QR o introducirla manualmente. Asegúrate de
comprobarla varias veces para confirmar que no estás enviando moneroj a la dirección equivocada.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>ID de Pago</h2>
Al ser Monero ofuscado por naturaleza, puedes usar un ID de Pago para identificar un envío de Monero entre
dos partes. Esto es completamente opcional y privado. Por ejemplo, esto permitiría que un
@ -304,4 +312,6 @@
Monerujo irá directo a los nodos semilla de Monero codificados en Monero. El
escaneo parará cuando encuentre 10 nodos remotos en total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -319,11 +319,11 @@
<string name="send_address_openalias">OpenAlias asegurado &#x2714;</string>
<string name="send_address_resolve_openalias">Resolviendo OpenAlias&#8230;</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">Versión de nodo incompatible - ¡por favor actualiza!</string>
<string name="menu_info">Detalles</string><!--Changed to: Show Secrets!-->
<string name="menu_streetmode">Modo Público</string>
<string name="info_nodes_enabled">Nodo-o-matiC habilitado, toque para más información.</string>
@ -352,4 +352,15 @@
<string name="node_scanning">Escaneando la red&#8230;</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"-->
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Receptor</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -155,7 +155,13 @@
<p>This is the public address of the wallet you are sending Moneroj to, you can copy this from
your clipboard, scan a QR code or enter it manually. Make sure you triple check this to
ensure you arent sending coins to the wrong address.</p>
<p>In addition to sending XMR, you can send BTC through the XMR.TO service (see https://xmr.to
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>Makse ID</h2>
<p>You can use a Payment ID to identify the reason you sent Monero between two parties. This
@ -298,4 +304,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -210,7 +210,6 @@
<string name="send_amount_btc_xmr">%1$s (umbkaudne)</string>
<string name="send_address_hint">Saaja XMR/BTC aadress või OpenAlias</string>
<string name="send_paymentid_hint">Makse ID (valikuline)</string>
<string name="send_amount_hint">0.00</string>
<string name="send_notes_hint">Privaatsed kommentaarid (valikuline)</string>
@ -361,4 +360,15 @@
<string name="label_test">Testi</string><!--note: as in "Test a network connection"-->
<string name="backup_success">Tagavarakoopia õnnestus</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Saaja</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -153,8 +153,14 @@
<p>Cest ladresse publique du portefeuille auquel vous allez envoyer des Moneroj, vous pouvez
la copier/coller, scanner un QR code ou la saisir manuellement. Vérifiez là bien trois fois
afin de vous assurer que vous nenvoyez pas de pièces à la mauvaise adresse.</p>
<p>En plus denvoyer des XMR, vous pouvez envoyer des BTC via le service XMR.TO (voir https://xmr.to
pour plus de détails). Consultez la rubrique sur lenvoie de BTC ci-dessous.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>ID de Paiement</h2>
<p>Vous pouvez utiliser un ID de paiement pour identifier la raison pour laquelle vous avez
envoyé des Moneroj entre deux parties. Cest totallement privé et optionnel. Il permet par
@ -303,4 +309,6 @@
Monerujo va communiquer directement avec les nœuds densemencement codés en dur dans Monero. La
recherche sarrête lorsquun total de 10 nœuds distant est récupéré.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -334,7 +334,6 @@
<string name="send_address_openalias">Sécurisé OpenAlias &#x2714;</string>
<string name="send_address_resolve_openalias">Résolution OpenAlias&#8230;</string>
<string name="send_address_no_dnssec">OpenAlias sans DNSSEC - l\'adresse pourrait être usurpée !</string>
<string name="send_address_hint">Adresse ou OpenAlias XMR/BTC du Destinataire</string>
<string name="status_wallet_connect_wrongversion">Version du Nœud incompatible - merci de mettre à jour !</string>
@ -367,4 +366,15 @@
<string name="node_scanning">Recherche de nœuds&#8230;</string>
<string name="node_nobookmark">%1$d meilleurs nœuds mis en favoris automatiquement</string>
<string name="label_test">Tester</string><!--note: as in "Test a network connection"-->
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Destinataire</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -142,8 +142,14 @@
<h2>Kedvezményezett címe</h2>
<p>Azon tárca nyilvános címe, melyre Monerót küldesz. Begépelhető kézileg, de akár vágólapról vagy
QR-kódból is beilleszthető. Többször is ellenőrizd, hogy biztosan jó címre utalsz-e.</p>
<p>Az XMR-küldés mellett BTC-küldésre is lehetőség van az XMR.TO szolgálatatásn keresztül. Részletekért
látogass el a https://xmr.to weboldalra és olvasd el a lentebb található BTC-küldés című pontot.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>Fizetési azonosító</h2>
<p>Fizetési azonosítót (payment ID) használhatsz arra a célra, hogy beazonosítsd, miért történt
tranzakció két fél között. Ez teljes mértékben opcionális és privát. A fizetési azonosító például
@ -288,4 +294,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -331,7 +331,6 @@
<string name="send_address_openalias">OpenAlias secure &#x2714;</string>
<string name="send_address_resolve_openalias">Resolving OpenAlias&#8230;</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="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
@ -366,4 +365,14 @@
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
<string name="backup_success">Backup successful</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -148,8 +148,14 @@
<p>Questo è l&apos;indirizzo pubblico del portafoglio cui stai inviando Moneroj, puoi incollare qui un indirizzo
che hai precededentemente copiato sul blocco appunti, scansionare un codice QR o inserire un indirizzo
manualmente. Accertati più volte che sia l&apos;indirizzo corretto e che tu non stia inviando Moneroj ad un indirizzo sbagliato.</p>
<p>Oltre ad inviare Moneroj (XMR), puoi anche inviare Bitcoin (BTC) attraverso il servizio XMR.TO (vedi https://xmr.to
per ulteriori dettagli). Controlla la sezione sull&apos;invio di BTC più avanti.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>ID Pagamento</h2>
<p>Puoi usare un ID Pagamento per identificare la causale della transazione. Questa è un&apos;informazione
opzionale e privata. Ad esempio può aiutare un venditore ad associare una transazione ricevuta ad un bene da te acquistato.<p>
@ -285,4 +291,6 @@
Monerujo proseguirà con i nodi seed codificati in Monero. La scansione
termina quando vengono trovati 10 nodi in totale.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -333,7 +333,6 @@
<string name="send_address_openalias">OpenAlias sicuro &#x2714;</string>
<string name="send_address_resolve_openalias">Risolvendo OpenAlias&#8230;</string>
<string name="send_address_no_dnssec">OpenAlias senza DNSSEC - L\'indirizzo potrebbe essere rubato</string>
<string name="send_address_hint"> Indirizzo XMR/BTC del ricevente o OpenAlias</string>
<string name="status_wallet_connect_wrongversion">Versione del nodo incompatibile - si prega di aggiornare!</string>
@ -366,4 +365,15 @@
<string name="node_scanning">Scansione rete&#8230;</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"-->
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Ricevitore</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -239,9 +239,14 @@
コピーするか、QRコードから読み取るか、直接入力することができます。
間違ったアドレスにコインが送金されないように、
このアドレスは確実に間違いがないことを確認してください。</p>
<p>XMRの送金に加えて、あなたはBTCを XMR.TO のサービスを使って
送金することができます(詳細は https://xmr.to をご覧ください)。
下記のBTCの送金のセクションをご覧ください。</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>ペイメントID(Payment ID)</h2>
<p>あなたは2者間でモネロを送金した理由を特定するために
ペイメントIDを使うことができます。
@ -422,4 +427,6 @@
シードノードと直接通信します。
スキャンは全部で10個のリモートードを見つけたときに終了します。</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -215,7 +215,6 @@
<string name="send_amount_btc_xmr">%1$s (指定)</string>
<string name="send_address_hint">受け取り手の XMR/BTC アドレスまたは OpenAlias</string>
<string name="send_paymentid_hint">ペイメントID (オプション)</string>
<string name="send_amount_hint">0.00</string>
<string name="send_notes_hint">プライベートノート (オプション)</string>
@ -409,4 +408,15 @@
<string name="label_test">テスト</string><!--note: as in "Test a network connection"-->
<string name="backup_success">バックアップ成功</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">受け取り手</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -143,8 +143,14 @@
<p>Dette er den offentlige adressen til lommeboka du skal sende moneroj til, som du kan
kopiere fra utklippstavla, skanne fra en QR-kode eller skrive inn manuellt. Vær sikker på at du trippelsjekker dette
for å forsikre deg om at du ikke sender moneroj til feil adresse.</p>
<p>I tillegg til å sende XMR, kan du sende BTC gjennom XMR.TO tjenesten (se https://xmr.to
for detaljer). Se seksjonen på å sende BTC under.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>Betalings-ID</h2>
<p>Du kan bruke betalings-ID til å identifisere hvorfor du sendte Monero mellom to parter. Dette er
helt frivillig og privat. For eksempel lar det en bedrift tilknytte transaksjonen din med
@ -286,4 +292,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -331,7 +331,6 @@
<string name="send_address_openalias">OpenAlias secure &#x2714;</string>
<string name="send_address_resolve_openalias">Resolving OpenAlias&#8230;</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="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
@ -364,4 +363,14 @@
<string name="node_scanning">Scanning network&#8230;</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="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -112,8 +112,14 @@
<h1>Verzenden</h1>
<h2>Adres ontvanger</h2>
<p>Dit is het openbare adres van de portemonnee waar je moneroj naartoe stuurt. Je kunt dit kopiëren via het klembord, een QR-code scannen of het adres handmatig invoeren. Controleer dit nauwkeurig om er zeker van te zijn dat je geen geld naar het verkeerde adres stuurt.</p>
<p>Je kunt niet alleen XMR verzenden, maar ook BTC via XMR.TO (zie https://xmr.to
voor meer informatie). Zie ook het gedeelte over BTC verzenden hieronder.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>Betalings-ID</h2>
<p>Je kunt een Betalings-ID gebruiken om aan te geven waarom je Monero verzendt. Dit is volledig optioneel en blijft vertrouwelijk tussen beide partijen. Een bedrijf kan bijvoorbeeld jouw transactie koppelen aan een artikel dat je hebt gekocht.<p>
<h1>BTC verzenden</h1>
@ -214,4 +220,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -210,7 +210,6 @@
<string name="send_amount_btc_xmr">%1$s (schatting)</string>
<string name="send_address_hint">XMR- of BTC-adres ontvanger</string>
<string name="send_paymentid_hint">Betalings-ID (optioneel)</string>
<string name="send_amount_hint">0,00</string>
<string name="send_notes_hint">Opmerkingen voor jezelf (optioneel)</string>
@ -363,4 +362,15 @@
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
<string name="backup_success">Backup successful</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Ontvanger</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -154,8 +154,14 @@
<p>Este é o endereço público da carteira na qual você está enviando Monero. Você pode colar da sua área de transferência,
escanear um código QR ou escrevê-lo manualmente. Verifique-o múltiplas vezes para garantir que você não está enviando
Monero para o endereço errado.</p>
<p>Além de enviar XMR, você também pode enviar BTC através do serviço XMR.TO (consulte https://xmr.to para mais detalhes).
Consulte a seção de envio de BTC mais abaixo.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>ID do Pagamento</h2>
<p>Você pode usar o ID do Pagamento para identificar a razão pela qual você transacionou com a contraparte.
Essa opção é opcional e privada. Por exemplo, lojistas podem reconciliar o seu pagamento com
@ -281,4 +287,6 @@
o Monerujo irá direto para os nós codificados direto no Monero em si. O
escaneamento termina quando 10 nós remotos são encontrados no total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -212,7 +212,6 @@
<string name="send_amount_btc_xmr">%1$s (indicativo)</string>
<string name="send_address_hint">Endereço de destino XMR ou BTC</string>
<string name="send_paymentid_hint">ID do pagamento (opcional)</string>
<string name="send_amount_hint">0.00</string>
<string name="send_notes_hint">Notas (opcional)</string>
@ -356,4 +355,14 @@
<string name="label_test">Testar</string><!--note: as in "Test a network connection"-->
<string name="backup_success">Backup feito com successo</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -141,8 +141,14 @@
<p> Este é o endereço público da carteira para a qual vais enviar Moneroj, podes copiar esta
informação da área de transferência, capturara um código QR, ou introduzir manualmente. Confirma
atentamente que não estás a enviar para o endereço errado.</p>
<p>Em adição a enviar XMR, podes enviar BTC através do serviço XMR.TO (ver https://xmr.to
para mais detalhes). Vê a secção de enviar BTC mais abaixo.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>ID do Pagamento</h2>
<p>Utiliza-se o ID do Pagamento para identificar a razão porque foram transaccionados Moneroj.
Isto é opcional e privado. Por exemplo, isto permite que um negócio identifique que item
@ -289,4 +295,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -333,7 +333,6 @@
<string name="send_address_openalias">OpenAlias secure &#x2714;</string>
<string name="send_address_resolve_openalias">Resolving OpenAlias&#8230;</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="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
@ -368,4 +367,14 @@
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
<string name="backup_success">Backup successful</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -133,8 +133,14 @@
<p>Aceasta este adresa publică a destinatarului la care vrei să trimiți Monero, poți copia
această adresă folosind clipboard-ul, scanând codul QR sau introducând-o manual. Verifică
de trei ori această adresă pentru a fi sigur că nu trimiți monedele la o adresă greșită.</p>
<p>Pe lângă trimiterea de XMR, poți trimite BTC prin intermediul serviciului XMR.TO
(vezi https://xmr.to pentru detalii). Vizualizează secțiunea despre trimiterea BTC mai jos.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>Payment ID</h2>
<p>Poți utiliza un ID de plată pentru a identifica suma trimisă între două terțe, acest lucru
este complet opțional și privat. Ca exemplu, poate permite identificare într-o activitate comercială
@ -274,4 +280,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -331,7 +331,6 @@
<string name="send_address_openalias">OpenAlias secure &#x2714;</string>
<string name="send_address_resolve_openalias">Resolving OpenAlias&#8230;</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="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
@ -364,4 +363,14 @@
<string name="node_scanning">Scanning network&#8230;</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="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -146,8 +146,14 @@
<p>Это публичный адрес кошелька, на который вы отправляете Monero. Вы можете скопировать его
из буфера, отсканировать QR-код или ввести вручную. Следует трижды проверить правильность
этого адреса, чтобы не отправить монеты на ошибочный адрес.</p>
<p>Помимо XMR служба XMR.TO позволяет отправлять BTC (подробности ищите на https://xmr.to).
См. раздел по отправке BTC ниже.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>Идентификатор оплаты (Payment ID)</h2>
<p>Вы можете использовать Payment ID для идентификации причины, по которой Monero передаётся
между двумя сторонами. Это опциональная и конфиденциальная операция. Например,
@ -292,4 +298,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -332,7 +332,6 @@
<string name="send_address_openalias">OpenAlias безопасен &#x2714;</string>
<string name="send_address_resolve_openalias">Разрешения OpenAlias&#8230;</string>
<string name="send_address_no_dnssec">OpenAlias без DNSSEC - адрес может быть подделан</string>
<string name="send_address_hint">XMR/BTC адрес получателя или OpenAlias</string>
<string name="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
@ -367,4 +366,15 @@
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
<string name="backup_success">Backup successful</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Получател</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -148,8 +148,14 @@
<h2>Adresa Príjemcu</h2>
<p>Toto je verejná adresa peňaženky kam posielaš Monero. Môžeš ju kopírovať zo schránky, skenovať QR kód alebo vložiť manuálne.
Trikrát sa uisti, že neposielaš mince na zlú adresu.</p>
<p>Okrem posielana XMR, môžeš posielať BTC cez sllužbu XMR.TO (pozri https://xmr.to).
Pozri sekciu posielanie BTC nižšie.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>ID Platby</h2>
<p>ID Platby môžeš použiť na identifikáciu platby medzi dvoma stranami.
Nie je to síce povinný, ale je to súkromný údaj.
@ -225,14 +231,13 @@
]]></string>
<string name="help_node"><![CDATA[
<h1>Uzly</h1>
<h2>TL;DR</h2>
<p>Aktuálny zoznam uzlov získaš tak, že potiahneš a pridáš do záložiek 5 uzlov, z ktorých si Monerujo jeden vyberie.</p>
<h2>Čo je Uzol?</h2>
<p>Monerujo používa vzdialený uzol (Remote Node, niekedy nazývaný aj Daemon) a peňaženka tak môže komunikovať so sieťou Monero bez toho, aby bolo potrebné sťahovať celú blockchain.<p>
<h2>Zoznam Uzlov</h2>
<p>Ak je zoznam prázdny, môžeš zadať adresu uzla manuálne, alebo môžeš nechať Monerujo preskúmať celú sieť. Prípadne oboje. Čítaj ďalej...</p>
<p>Ak je zoznam prázdny, môžeš zadať adresu uzla manuálne, alebo môžeš nechať Monerujo preskúmať celú sieť. Prípadne oboje. Čítaj ďalej&#8230;</p>
<p>Zoznam uzlov zobrazuje všetky momentálne známe uzly. Pod každým uzlom je zobrazená časová pečiatka jeho posledného bloku.
Vedľa je ikonka nodu, ktorá indikuje úroveň pripojenia.</p>
<p>Ktorýkoľvek uzol v zozname si môžte pridať do záložiek pre budúce použitie. Uzly, ktoré nebudú uložené, sa z pamäte vymažú.<p>
@ -254,4 +259,6 @@
Začína tým, že sa opýta uzlov vo vašich záložkách na ďalšie uzly v P2P sieti Monero, ktoré sú s nimi spojené, tých sa opýta zas na ďalšie uzly atď.
V prípade, že nemáte žiadne uzly vo svojich záložkách, Monerujo bude skúšať uzly (seed nodes) natvrdo zapísané v kóde Monero. Vyhľadávanie končí ak Monerujo nájde aspoň 10 vzdialených uzlov.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -329,7 +329,6 @@
<string name="send_address_openalias">OpenAlias zabezpečený &#x2714;</string>
<string name="send_address_resolve_openalias">Prekladám OpenAlias&#8230;</string>
<string name="send_address_no_dnssec">OpenAlias bez DNSSEC - adresa môže byť zneužitá</string>
<string name="send_address_hint">Prijímateľova XMR/BTC adresa alebo OpenAlias</string>
<string name="status_wallet_connect_wrongversion">Nekompatibilný s verziou uzla - nutná aktualizácia!</string>
@ -364,4 +363,15 @@
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
<string name="backup_success">Backup successful</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Prijímatel</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -131,8 +131,14 @@
<p>Det här är offentliga adressen av plånboken du skickar Moneroj till, du kan kopiera den från
urklipp, skanna en QR-kod eller ange den manuellt. Se till att du trippel-kollar den för att
vara säker på att du inte skickar pengar till fel adress.</p>
<p>Dessutom kan du skicka BTC genom XMR.TO tjänsten (se https://xmr.to för detaljer). Se delen
om att skicka BTC nedan.</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>Betalnings-ID</h2>
<p>Du kan använda ett Betalnings-ID för att identifiera anledningen du skickat Monero till någon,
det är valfritt och privat. Till exempel tillåter det en affär att förknippa din transaktion
@ -269,4 +275,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -315,7 +315,6 @@
<string name="send_address_openalias">OpenAlias säkrad &#x2714;</string>
<string name="send_address_resolve_openalias">Slår upp OpenAlias&#8230;</string>
<string name="send_address_no_dnssec">OpenAlias utan DNSSEC - adressen kan vara förfalskad</string>
<string name="send_address_hint">Mottagarens XMR/BTC-adress eller OpenAlias</string>
<string name="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
@ -348,4 +347,15 @@
<string name="node_scanning">Scanning network&#8230;</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="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Mottagaren</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -332,7 +332,6 @@
<string name="send_address_openalias">OpenAlias безпечний &#x2714;</string>
<string name="send_address_resolve_openalias">Дозволи OpenAlias&#8230;</string>
<string name="send_address_no_dnssec">OpenAlias без DNSSEC - адреса може бути підмінена</string>
<string name="send_address_hint">XMR/BTC адреса отримувача або OpenAlias</string>
<string name="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
@ -367,4 +366,15 @@
<string name="label_test">Test</string><!--note: as in "Test a network connection"-->
<string name="backup_success">Backup successful</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -123,8 +123,14 @@
<h2>收款者地址</h2>
<p>这是你欲发送Monero过去的钱包地址。你可以从剪贴簿贴上, 扫描QR码或是手动输入。
请务必再三确认地址正确以免发送至错误的钱包地址</p>
<p>除了发送XMR你还可透过 XMR.TO 服务来发送BTC (请至 https://xmr.to
了解更多)或在下面阅读发送BTC的說明</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>付款ID</h2>
<p>你可以使用付款ID以帮助识別双方的款项交易。这是选填项目并且完全为隐私保护的。
举例来說这可以让公司行号辨別你的这笔款项是用来支付某项购买的商品。<p>
@ -247,4 +253,6 @@
Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The
scan stops when it finds 10 remote nodes in total.</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -329,7 +329,6 @@
<string name="send_address_openalias">OpenAlias secure &#x2714;</string>
<string name="send_address_resolve_openalias">Resolving OpenAlias&#8230;</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="status_wallet_connect_wrongversion">Node version incompatible - please upgrade!</string>
@ -362,4 +361,14 @@
<string name="node_scanning">Scanning network&#8230;</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="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -116,8 +116,14 @@
<h2>收款者地址</h2>
<p>這是你欲發送 Monero 過去的錢包地址。你可以從剪貼簿貼上, 掃描 QR 碼或是手動輸入。
請務必再三確認地址正確以免發送至錯誤的錢包地址</p>
<p>除了發送 XMR你還可透過 XMR.TO 服務來發送 BTC (請至 https://xmr.to
了解更多),或在下面閱讀發送 BTC 的說明</p>
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>付款 ID</h2>
<p>你可以使用付款 ID 以幫助識別雙方的款項交易。這是選填項目並且完全為隱私保護的。
舉例來說這可以讓公司行號辨別你的這筆款項是用來支付某項購買的商品。<p>
@ -218,4 +224,6 @@
如果你沒有任何書籤節點 (或是書籤節點無法提供它們的連接清單)Monerujo 將會直接從 Monero 內建的種子節點取得清單。
這個掃描功能將會在總共可用節點的數量達到十個後停止。</p>
]]></string>
<!-- Note for translators: new/changed text also in help_send -->
</resources>

View File

@ -330,7 +330,6 @@
<string name="send_address_openalias">這個 OpenAlias 已確認安全可用 &#x2714;</string>
<string name="send_address_resolve_openalias">正在解析 OpenAlias &#8230;</string>
<string name="send_address_no_dnssec">這個 OpenAlias 沒有使用 DNSSEC - 地址有被欺騙的風險</string>
<string name="send_address_hint">收款者的 XMR/BTC 地址或 OpenAlias</string>
<string name="status_wallet_connect_wrongversion">節點版本不相容 - 請盡速更新!</string>
@ -363,4 +362,15 @@
<string name="node_scanning">掃描節點中 &#8230;</string>
<string name="node_nobookmark">已自動加入 %1$d 個節點至書籤</string>
<string name="label_test">測試節點</string>
<string name="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">收款者</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
</resources>

View File

@ -155,7 +155,13 @@
<p>This is the public address of the wallet you are sending Moneroj to, you can copy this from
your clipboard, scan a QR code or enter it manually. Make sure you triple check this to
ensure you arent sending coins to the wrong address.</p>
<p>In addition to sending XMR, you can send BTC through the XMR.TO service (see https://xmr.to
<p>In addition to using an XMR address, you can also use
<ul>
<li>an OpenAlias for XMR or BTC</li>
<li>a BTC address</li>
<li>a bitcoin: URI (including BIP70 like bitpay)</li>
</u>
Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to
for details). See the section on sending BTC below.</p>
<h2>Payment ID</h2>
<p>You can use a Payment ID to identify the reason you sent Monero between two parties. This

View File

@ -219,7 +219,6 @@
<string name="send_amount_btc_xmr">%1$s (indicative)</string>
<string name="send_address_hint">Receiver\'s XMR/BTC Address or OpenAlias</string>
<string name="send_paymentid_hint">Payment ID (optional)</string>
<string name="send_amount_hint">0.00</string>
<string name="send_notes_hint">Private Notes (optional)</string>
@ -411,4 +410,16 @@
<string name="node_scanning">Scanning network&#8230;</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="send_address_resolve_bip70">Resolving Payment URI&#8230;</string>
<string name="send_address_not_bip70">Could not resolve Payment URI</string>
<string name="send_address_bip70">Resolved Payment URI &#x2714;</string>
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">XMR.TO offline - try again later</string>
<string name="xmrto_error_004">BTC amount out of bounds</string>
<string name="xmrto_error_010">Invalid or outdated Payment URL</string>
<string name="xmrto_error_012">Too many requests</string>
<string name="xmrto_error" translatable="false">XMR.TO Service Error</string>
</resources>

View File

@ -16,6 +16,8 @@
package com.m2049r.xmrwallet.util;
import com.m2049r.xmrwallet.data.UserNotes;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;