add more output currencies (#714)

This commit is contained in:
m2049r 2021-02-15 21:38:26 +01:00 committed by GitHub
parent 57ddddfce2
commit faf57c96fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
83 changed files with 1867 additions and 1105 deletions

View File

@ -7,8 +7,8 @@ android {
applicationId "com.m2049r.xmrwallet"
minSdkVersion 21
targetSdkVersion 29
versionCode 702
versionName "1.17.2 'Druk'"
versionCode 705
versionName "1.17.5.1 'Druk'"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {

View File

@ -213,7 +213,7 @@ public class BaseActivity extends SecureActivity implements GenerateReviewFragme
if (uri == null) {
Toast.makeText(this, getString(R.string.nfc_tag_read_undef), Toast.LENGTH_LONG).show();
} else {
BarcodeData bc = BarcodeData.fromQrCode(uri.toString());
BarcodeData bc = BarcodeData.fromString(uri.toString());
if (bc == null)
Toast.makeText(this, getString(R.string.nfc_tag_read_undef), Toast.LENGTH_LONG).show();
else

View File

@ -58,6 +58,7 @@ import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.m2049r.xmrwallet.BuildConfig;
import com.m2049r.xmrwallet.data.BarcodeData;
import com.m2049r.xmrwallet.data.Crypto;
import com.m2049r.xmrwallet.ledger.LedgerProgressDialog;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.model.WalletManager;
@ -469,7 +470,7 @@ public class ReceiveFragment extends Fragment {
Timber.d("CLEARQR");
return;
}
bcData = new BarcodeData(BarcodeData.Asset.XMR, address, notes, xmrAmount);
bcData = new BarcodeData(Crypto.XMR, address, notes, xmrAmount);
int size = Math.max(ivQrCode.getWidth(), ivQrCode.getHeight());
Bitmap qr = generate(bcData.getUriString(), size, size);
if (qr != null) {

View File

@ -73,14 +73,7 @@ public class ScannerFragment extends Fragment implements ZXingScannerView.Result
// * On older devices continuously stopping and resuming camera preview can result in freezing the app.
// * I don't know why this is the case but I don't have the time to figure out.
Handler handler = new Handler();
handler.postDelayed(new
Runnable() {
@Override
public void run() {
mScannerView.resumeCameraPreview(ScannerFragment.this);
}
}, 2000);
handler.postDelayed(() -> mScannerView.resumeCameraPreview(ScannerFragment.this), 2000);
}
@Override

View File

@ -300,7 +300,7 @@ public class TxFragment extends Fragment {
}
tvTxXmrToKey.setText(key);
tvDestinationBtc.setText(userNotes.xmrtoDestination);
tvTxAmountBtc.setText(userNotes.xmrtoAmount + " BTC");
tvTxAmountBtc.setText(userNotes.xmrtoAmount + " "+ userNotes.xmrtoCurrency);
switch (userNotes.xmrtoTag) {
case "xmrto":
tvXmrToSupport.setVisibility(View.GONE);

View File

@ -921,7 +921,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
@Override
public boolean onScanned(String qrCode) {
// #gurke
BarcodeData bcData = BarcodeData.fromQrCode(qrCode);
BarcodeData bcData = BarcodeData.fromString(qrCode);
if (bcData != null) {
popFragmentStack(null);
Timber.d("AAA");

View File

@ -49,6 +49,7 @@ import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.ServiceHelper;
import com.m2049r.xmrwallet.widget.Toolbar;
import java.text.NumberFormat;
@ -242,7 +243,7 @@ public class WalletFragment extends Fragment
String balanceCurrency = Helper.BASE_CRYPTO;
double balanceRate = 1.0;
private final ExchangeApi exchangeApi = Helper.getExchangeApi();
private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi();
void refreshBalance() {
double unconfirmedXmr = Helper.getDecimalAmount(balance - unlockedBalance).doubleValue();

View File

@ -18,69 +18,57 @@ package com.m2049r.xmrwallet.data;
import android.net.Uri;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.util.BitcoinAddressValidator;
import com.m2049r.xmrwallet.util.OpenAliasHelper;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.ToString;
import timber.log.Timber;
@ToString
public class BarcodeData {
public static final String XMR_SCHEME = "monero:";
public static final String XMR_PAYMENTID = "tx_payment_id";
public static final String XMR_AMOUNT = "tx_amount";
public static final String XMR_DESCRIPTION = "tx_description";
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_DESCRIPTION = "message";
static final String BTC_AMOUNT = "amount";
public enum Asset {
XMR, BTC
}
public enum Security {
NORMAL,
OA_NO_DNSSEC,
OA_DNSSEC
}
final public Asset asset;
final public Crypto asset;
final public List<Crypto> ambiguousAssets;
final public String address;
final public String addressName;
final public String amount;
final public String description;
final public Security security;
public BarcodeData(Asset asset, String address) {
this(asset, address, null, null, null, Security.NORMAL);
public BarcodeData(List<Crypto> assets, String address) {
if (assets.isEmpty())
throw new IllegalArgumentException("no assets specified");
this.addressName = null;
this.description = null;
this.amount = null;
this.security = Security.NORMAL;
this.address = address;
if (assets.size() == 1) {
this.asset = assets.get(0);
this.ambiguousAssets = null;
} else {
this.asset = null;
this.ambiguousAssets = assets;
}
}
public BarcodeData(Asset asset, String address, String amount) {
this(asset, address, null, null, amount, Security.NORMAL);
}
public BarcodeData(Asset asset, String address, String amount, String description, Security security) {
this(asset, address, null, description, amount, security);
}
public BarcodeData(Asset asset, String address, String paymentId, String description, String amount) {
public BarcodeData(Crypto asset, String address, String description, String amount) {
this(asset, address, null, description, amount, Security.NORMAL);
}
public BarcodeData(Asset asset, String address, String description, String amount) {
this(asset, address, null, description, amount, Security.NORMAL);
}
public BarcodeData(Asset asset, String address, String addressName, String description, String amount, Security security) {
public BarcodeData(Crypto asset, String address, String addressName, String description, String amount, Security security) {
this.ambiguousAssets = null;
this.asset = asset;
this.address = address;
this.addressName = addressName;
@ -94,133 +82,54 @@ public class BarcodeData {
}
public String getUriString() {
if (asset != Asset.XMR) throw new IllegalStateException("We can only do XMR stuff!");
if (asset != Crypto.XMR) throw new IllegalStateException("We can only do XMR stuff!");
StringBuilder sb = new StringBuilder();
sb.append(BarcodeData.XMR_SCHEME).append(address);
sb.append(Crypto.XMR.getUriScheme()).append(address);
boolean first = true;
if ((description != null) && !description.isEmpty()) {
sb.append(first ? "?" : "&");
first = false;
sb.append(BarcodeData.XMR_DESCRIPTION).append('=').append(Uri.encode(description));
sb.append(Crypto.XMR.getUriMessage()).append('=').append(Uri.encode(description));
}
if ((amount != null) && !amount.isEmpty()) {
sb.append(first ? "?" : "&");
sb.append(BarcodeData.XMR_AMOUNT).append('=').append(amount);
sb.append(Crypto.XMR.getUriAmount()).append('=').append(amount);
}
return sb.toString();
}
static public BarcodeData fromQrCode(String qrCode) {
// check for monero uri
BarcodeData bcData = parseMoneroUri(qrCode);
// check for naked monero address / integrated address
if (bcData == null) {
bcData = parseMoneroNaked(qrCode);
}
// check for btc uri
if (bcData == null) {
bcData = parseBitcoinUri(qrCode);
}
// check for naked btc address
if (bcData == null) {
bcData = parseBitcoinNaked(qrCode);
}
// check for OpenAlias
if (bcData == null) {
bcData = parseOpenAlias(qrCode, false);
}
return bcData;
}
/**
* Parse and decode a monero scheme string. It is here because it needs to validate the data.
*
* @param uri String containing a monero URL
* @return BarcodeData object or null if uri not valid
*/
static public BarcodeData parseMoneroUri(String uri) {
Timber.d("parseMoneroUri=%s", uri);
if (uri == null) return null;
if (!uri.startsWith(XMR_SCHEME)) return null;
String noScheme = uri.substring(XMR_SCHEME.length());
Uri monero = Uri.parse(noScheme);
Map<String, String> parms = new HashMap<>();
String query = monero.getEncodedQuery();
if (query != null) {
String[] args = query.split("&");
for (String arg : args) {
String[] namevalue = arg.split("=");
if (namevalue.length == 0) {
continue;
}
parms.put(Uri.decode(namevalue[0]).toLowerCase(),
namevalue.length > 1 ? Uri.decode(namevalue[1]) : "");
static private BarcodeData parseNaked(String address) {
List<Crypto> possibleAssets = new ArrayList<>();
for (Crypto crypto : Crypto.values()) {
if (crypto.validate(address)) {
possibleAssets.add(crypto);
}
}
String address = monero.getPath();
String paymentId = parms.get(XMR_PAYMENTID);
// no support for payment ids!
if (paymentId != null) {
Timber.e("no support for payment ids!");
if (possibleAssets.isEmpty())
return null;
}
String description = parms.get(XMR_DESCRIPTION);
String amount = parms.get(XMR_AMOUNT);
if (amount != null) {
try {
Double.parseDouble(amount);
} catch (NumberFormatException ex) {
Timber.d(ex.getLocalizedMessage());
return null; // we have an amount but its not a number!
}
}
if ((address == null) || !Wallet.isAddressValid(address)) {
Timber.d("address invalid");
return null;
}
return new BarcodeData(Asset.XMR, address, description, amount);
return new BarcodeData(possibleAssets, address);
}
static public BarcodeData parseMoneroNaked(String address) {
Timber.d("parseMoneroNaked=%s", address);
static public BarcodeData parseUri(String uriString) {
Timber.d("parseBitUri=%s", uriString);
if (address == null) return null;
if (!Wallet.isAddressValid(address)) {
Timber.d("address invalid");
return null;
}
return new BarcodeData(Asset.XMR, address);
}
// bitcoin:mpQ84J43EURZHkCnXbyQ4PpNDLLBqdsMW2?amount=0.01
// bitcoin:?r=https://bitpay.com/i/xxx
static public BarcodeData parseBitcoinUri(String uriString) {
Timber.d("parseBitcoinUri=%s", uriString);
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.isOpaque()) return null;
final String scheme = uri.getScheme();
Crypto crypto = Crypto.withScheme(scheme);
if (crypto == null) return null;
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<>();
if (parts.length == 2) {
String[] args = parts[1].split("&");
@ -233,17 +142,19 @@ public class BarcodeData {
namevalue.length > 1 ? Uri.decode(namevalue[1]) : "");
}
}
String description = parms.get(BTC_DESCRIPTION);
String address = parts[0]; // no need to decode as there can bo no special characters
String addressName = parms.get(crypto.getUriLabel());
String description = parms.get(crypto.getUriMessage());
String address = parts[0]; // no need to decode as there can be no special characters
if (address.isEmpty()) {
Timber.d("no address");
return null;
}
if (!BitcoinAddressValidator.validate(address)) {
Timber.d("BTC address (%s) invalid", address);
if (!crypto.validate(address)) {
Timber.d("%s address (%s) invalid", crypto, address);
return null;
}
String amount = parms.get(BTC_AMOUNT);
String amount = parms.get(crypto.getUriAmount());
if ((amount != null) && (!amount.isEmpty())) {
try {
Double.parseDouble(amount);
@ -252,20 +163,21 @@ public class BarcodeData {
return null; // we have an amount but its not a number!
}
}
return new BarcodeData(BarcodeData.Asset.BTC, address, description, amount);
return new BarcodeData(crypto, address, addressName, description, amount, Security.NORMAL);
}
static public BarcodeData parseBitcoinNaked(String address) {
Timber.d("parseBitcoinNaked=%s", address);
if (address == null) return null;
if (!BitcoinAddressValidator.validate(address)) {
Timber.d("address invalid");
return null;
static public BarcodeData fromString(String qrCode) {
BarcodeData bcData = parseUri(qrCode);
if (bcData == null) {
// maybe it's naked?
bcData = parseNaked(qrCode);
}
return new BarcodeData(BarcodeData.Asset.BTC, address);
if (bcData == null) {
// check for OpenAlias
bcData = parseOpenAlias(qrCode, false);
}
return bcData;
}
static public BarcodeData parseOpenAlias(String oaString, boolean dnssec) {
@ -281,29 +193,16 @@ public class BarcodeData {
String address = oaAttrs.get(OpenAliasHelper.OA1_ADDRESS);
if (address == null) return null;
Asset asset;
if (OA_XMR_ASSET.equals(oaAsset)) {
if (!Wallet.isAddressValid(address)) {
Timber.d("XMR address invalid");
return null;
}
asset = Asset.XMR;
} else if (OA_BTC_ASSET.equals(oaAsset)) {
if (!BitcoinAddressValidator.validate(address)) {
Timber.d("BTC address invalid");
return null;
}
asset = Asset.BTC;
} else {
Crypto crypto = Crypto.withSymbol(oaAsset);
if (crypto == null) {
Timber.i("Unsupported OpenAlias asset %s", oaAsset);
return null;
}
String paymentId = oaAttrs.get(OpenAliasHelper.OA1_PAYMENTID);
if (paymentId != null) {
Timber.e("paymentId not supported");
if (!crypto.validate(address)) {
Timber.d("%s address invalid", crypto);
return null;
}
String description = oaAttrs.get(OpenAliasHelper.OA1_DESCRIPTION);
if (description == null) {
description = oaAttrs.get(OpenAliasHelper.OA1_NAME);
@ -322,6 +221,10 @@ public class BarcodeData {
Security sec = dnssec ? BarcodeData.Security.OA_DNSSEC : BarcodeData.Security.OA_NO_DNSSEC;
return new BarcodeData(asset, address, addressName, description, amount, sec);
return new BarcodeData(crypto, address, addressName, description, amount, sec);
}
public boolean isAmbiguous() {
return ambiguousAssets != null;
}
}

View File

@ -0,0 +1,89 @@
package com.m2049r.xmrwallet.data;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.util.validator.BitcoinAddressType;
import com.m2049r.xmrwallet.util.validator.BitcoinAddressValidator;
import com.m2049r.xmrwallet.util.validator.EthAddressValidator;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public enum Crypto {
XMR("XMR", true, "monero:tx_amount:recipient_name:tx_description", R.id.ibXMR, R.drawable.ic_monero, R.drawable.ic_monero_bw, Wallet::isAddressValid),
BTC("BTC", true, "bitcoin:amount:label:message", R.id.ibBTC, R.drawable.ic_xmrto_btc, R.drawable.ic_xmrto_btc_off, address -> {
return BitcoinAddressValidator.validate(address, BitcoinAddressType.BTC);
}),
DASH("DASH", true, "dash:amount:label:message", R.id.ibDASH, R.drawable.ic_xmrto_dash, R.drawable.ic_xmrto_dash_off, address -> {
return BitcoinAddressValidator.validate(address, BitcoinAddressType.DASH);
}),
DOGE("DOGE", true, "dogecoin:amount:label:message", R.id.ibDOGE, R.drawable.ic_xmrto_doge, R.drawable.ic_xmrto_doge_off, address -> {
return BitcoinAddressValidator.validate(address, BitcoinAddressType.DOGE);
}),
ETH("ETH", false, "ethereum:amount:label:message", R.id.ibETH, R.drawable.ic_xmrto_eth, R.drawable.ic_xmrto_eth_off, EthAddressValidator::validate),
LTC("LTC", true, "litecoin:amount:label:message", R.id.ibLTC, R.drawable.ic_xmrto_ltc, R.drawable.ic_xmrto_ltc_off, address -> {
return BitcoinAddressValidator.validate(address, BitcoinAddressType.LTC);
});
@Getter
@NonNull
private final String symbol;
@Getter
private final boolean casefull;
@NonNull
private final String uriSpec;
@Getter
private final int buttonId;
@Getter
private final int iconEnabledId;
@Getter
private final int iconDisabledId;
@NonNull
private final Validator validator;
@Nullable
public static Crypto withScheme(@NonNull String scheme) {
for (Crypto crypto : values()) {
if (crypto.getUriScheme().equals(scheme)) return crypto;
}
return null;
}
@Nullable
public static Crypto withSymbol(@NonNull String symbol) {
final String upperSymbol = symbol.toUpperCase();
for (Crypto crypto : values()) {
if (crypto.symbol.equals(upperSymbol)) return crypto;
}
return null;
}
interface Validator {
boolean validate(String address);
}
// TODO maybe cache these segments
String getUriScheme() {
return uriSpec.split(":")[0];
}
String getUriAmount() {
return uriSpec.split(":")[1];
}
String getUriLabel() {
return uriSpec.split(":")[2];
}
String getUriMessage() {
return uriSpec.split(":")[3];
}
boolean validate(String address) {
return validator.validate(address);
}
}

View File

@ -24,6 +24,9 @@ import lombok.Getter;
import lombok.Setter;
public class TxDataBtc extends TxData {
@Getter
@Setter
private String btcSymbol; // the actual non-XMR thing we're sending
@Getter
@Setter
private String xmrtoOrderId; // shown in success screen
@ -45,6 +48,7 @@ public class TxDataBtc extends TxData {
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeString(btcSymbol);
out.writeString(xmrtoOrderId);
out.writeString(btcAddress);
out.writeDouble(btcAmount);
@ -63,6 +67,7 @@ public class TxDataBtc extends TxData {
protected TxDataBtc(Parcel in) {
super(in);
btcSymbol = in.readString();
xmrtoOrderId = in.readString();
btcAddress = in.readString();
btcAmount = in.readDouble();
@ -74,10 +79,23 @@ public class TxDataBtc extends TxData {
StringBuilder sb = new StringBuilder();
sb.append("xmrtoOrderId:");
sb.append(xmrtoOrderId);
sb.append(",btcSymbol:");
sb.append(btcSymbol);
sb.append(",btcAddress:");
sb.append(btcAddress);
sb.append(",btcAmount:");
sb.append(btcAmount);
return sb.toString();
}
public boolean validateAddress(@NonNull String address) {
if ((btcSymbol == null) || (btcAddress == null)) return false;
final Crypto crypto = Crypto.withSymbol(btcSymbol);
if (crypto == null) return false;
if (crypto.isCasefull()) { // compare as-is
return address.equals(btcAddress);
} else { // normalize & compare (e.g. ETH with and without checksum capitals
return address.toLowerCase().equals(btcAddress.toLowerCase());
}
}
}

View File

@ -28,6 +28,7 @@ public class UserNotes {
public String xmrtoTag = null;
public String xmrtoKey = null;
public String xmrtoAmount = null; // could be a double - but we are not doing any calculations
public String xmrtoCurrency = null;
public String xmrtoDestination = null;
public UserNotes(final String txNotes) {
@ -35,14 +36,15 @@ public class UserNotes {
return;
}
this.txNotes = txNotes;
Pattern p = Pattern.compile("^\\{([a-z]+)-(\\w{6,}),([0-9.]*)BTC,(\\w*)\\} ?(.*)");
Pattern p = Pattern.compile("^\\{([a-z]+)-(\\w{6,}),([0-9.]*)([A-Z]+),(\\w*)\\} ?(.*)");
Matcher m = p.matcher(txNotes);
if (m.find()) {
xmrtoTag = m.group(1);
xmrtoKey = m.group(2);
xmrtoAmount = m.group(3);
xmrtoDestination = m.group(4);
note = m.group(5);
xmrtoCurrency = m.group(4);
xmrtoDestination = m.group(5);
note = m.group(6);
} else {
note = txNotes;
}
@ -62,6 +64,7 @@ public class UserNotes {
xmrtoTag = order.TAG;
xmrtoKey = order.getOrderId();
xmrtoAmount = Helper.getDisplayAmount(order.getBtcAmount());
xmrtoCurrency = order.getBtcCurrency();
xmrtoDestination = order.getBtcAddress();
} else {
xmrtoTag = null;
@ -83,7 +86,8 @@ public class UserNotes {
sb.append(xmrtoKey);
sb.append(",");
sb.append(xmrtoAmount);
sb.append("BTC,");
sb.append(xmrtoCurrency);
sb.append(",");
sb.append(xmrtoDestination);
sb.append("}");
if ((note != null) && (!note.isEmpty()))

View File

@ -39,16 +39,23 @@ import androidx.annotation.NonNull;
import com.google.android.material.textfield.TextInputLayout;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.data.BarcodeData;
import com.m2049r.xmrwallet.data.Crypto;
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.ServiceHelper;
import com.m2049r.xmrwallet.util.validator.BitcoinAddressType;
import com.m2049r.xmrwallet.util.validator.BitcoinAddressValidator;
import com.m2049r.xmrwallet.util.validator.EthAddressValidator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import timber.log.Timber;
@ -64,9 +71,8 @@ public class SendAddressWizardFragment extends SendWizardFragment {
Listener sendListener;
public SendAddressWizardFragment setSendListener(Listener listener) {
public void setSendListener(Listener listener) {
this.sendListener = listener;
return this;
}
public interface Listener {
@ -84,11 +90,10 @@ public class SendAddressWizardFragment extends SendWizardFragment {
private EditText etDummy;
private TextInputLayout etAddress;
private TextInputLayout etNotes;
private View cvScan;
private View tvPaymentIdIntegrated;
private TextView tvXmrTo;
private View llXmrTo;
private ImageButton bPasteAddress;
private Map<Crypto, ImageButton> ibCrypto;
final private Set<Crypto> possibleCryptos = new HashSet<>();
private Crypto selectedCrypto = null;
private boolean resolvingOA = false;
@ -98,6 +103,13 @@ public class SendAddressWizardFragment extends SendWizardFragment {
void onScan();
}
private Crypto getCryptoForButton(ImageButton button) {
for (Map.Entry<Crypto, ImageButton> entry : ibCrypto.entrySet()) {
if (entry.getValue() == button) return entry.getKey();
}
return null;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@ -105,10 +117,31 @@ public class SendAddressWizardFragment extends SendWizardFragment {
View view = inflater.inflate(R.layout.fragment_send_address, container, false);
tvPaymentIdIntegrated = view.findViewById(R.id.tvPaymentIdIntegrated);
llXmrTo = view.findViewById(R.id.llXmrTo);
tvXmrTo = view.findViewById(R.id.tvXmrTo);
tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto)));
ibCrypto = new HashMap<>();
for (Crypto crypto : Crypto.values()) {
final ImageButton button = view.findViewById(crypto.getButtonId());
ibCrypto.put(crypto, button);
button.setOnClickListener(v -> {
if (possibleCryptos.contains(crypto)) {
selectedCrypto = crypto;
updateCryptoButtons(false);
} else {
// show help what to do:
if (button.getId() != R.id.ibXMR) {
final String name = getResources().getStringArray(R.array.cryptos)[crypto.ordinal()];
final String symbol = getCryptoForButton(button).getSymbol();
tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_help, name, symbol)));
tvXmrTo.setVisibility(View.VISIBLE);
} else {
tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_help_xmr)));
tvXmrTo.setVisibility(View.VISIBLE);
}
}
});
}
updateCryptoButtons(true);
etAddress = view.findViewById(R.id.etAddress);
etAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
@ -118,16 +151,13 @@ public class SendAddressWizardFragment extends SendWizardFragment {
return ((event != null) && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER));
}
});
etAddress.getEditText().setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
String enteredAddress = etAddress.getEditText().getText().toString().trim();
String dnsOA = dnsFromOpenAlias(enteredAddress);
Timber.d("OpenAlias is %s", dnsOA);
if (dnsOA != null) {
processOpenAlias(dnsOA);
}
etAddress.getEditText().setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
String enteredAddress = etAddress.getEditText().getText().toString().trim();
String dnsOA = dnsFromOpenAlias(enteredAddress);
Timber.d("OpenAlias is %s", dnsOA);
if (dnsOA != null) {
processOpenAlias(dnsOA);
}
}
});
@ -136,21 +166,47 @@ public class SendAddressWizardFragment extends SendWizardFragment {
public void afterTextChanged(Editable editable) {
Timber.d("AFTER: %s", editable.toString());
etAddress.setError(null);
if (isIntegratedAddress()) {
possibleCryptos.clear();
selectedCrypto = null;
final String address = etAddress.getEditText().getText().toString();
if (isIntegratedAddress(address)) {
Timber.d("isIntegratedAddress");
possibleCryptos.add(Crypto.XMR);
selectedCrypto = Crypto.XMR;
etAddress.setError(getString(R.string.info_paymentid_integrated));
tvPaymentIdIntegrated.setVisibility(View.VISIBLE);
llXmrTo.setVisibility(View.INVISIBLE);
sendListener.setMode(SendFragment.Mode.XMR);
} else if (isBitcoinAddress()) {
Timber.d("isBitcoinAddress");
setBtcMode();
} else {
Timber.d("isStandardAddress or other");
tvPaymentIdIntegrated.setVisibility(View.INVISIBLE);
llXmrTo.setVisibility(View.INVISIBLE);
} else if (isStandardAddress(address)) {
Timber.d("isStandardAddress");
possibleCryptos.add(Crypto.XMR);
selectedCrypto = Crypto.XMR;
sendListener.setMode(SendFragment.Mode.XMR);
}
if ((selectedCrypto == null) && isEthAddress(address)) {
Timber.d("isEthAddress");
possibleCryptos.add(Crypto.ETH);
selectedCrypto = Crypto.ETH;
tvXmrTo.setVisibility(View.VISIBLE);
sendListener.setMode(SendFragment.Mode.BTC);
}
if (possibleCryptos.isEmpty()) {
Timber.d("isBitcoinAddress");
for (BitcoinAddressType type : BitcoinAddressType.values()) {
if (BitcoinAddressValidator.validate(address, type)) {
possibleCryptos.add(Crypto.valueOf(type.name()));
}
}
if (!possibleCryptos.isEmpty()) // found something in need of shifting!
sendListener.setMode(SendFragment.Mode.BTC);
if (possibleCryptos.size() == 1) {
selectedCrypto = (Crypto) possibleCryptos.toArray()[0];
}
}
if (possibleCryptos.isEmpty()) {
Timber.d("other");
tvXmrTo.setVisibility(View.INVISIBLE);
sendListener.setMode(SendFragment.Mode.XMR);
}
updateCryptoButtons(address.isEmpty());
}
@Override
@ -162,45 +218,38 @@ public class SendAddressWizardFragment extends SendWizardFragment {
}
});
bPasteAddress = view.findViewById(R.id.bPasteAddress);
bPasteAddress.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String clip = Helper.getClipBoardText(getActivity());
if (clip == null) return;
// clean it up
final String address = clip.replaceAll("[^0-9A-Z-a-z]", "");
if (Wallet.isAddressValid(address) || BitcoinAddressValidator.validate(address)) {
final EditText et = etAddress.getEditText();
et.setText(address);
et.setSelection(et.getText().length());
etAddress.requestFocus();
} else {
Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show();
}
final ImageButton bPasteAddress = view.findViewById(R.id.bPasteAddress);
bPasteAddress.setOnClickListener(v -> {
final String clip = Helper.getClipBoardText(getActivity());
if (clip == null) return;
// clean it up
final String address = clip.replaceAll("( +)|(\\r?\\n?)", "");
BarcodeData bc = BarcodeData.fromString(address);
if (bc != null) {
processScannedData(bc);
final EditText et = etAddress.getEditText();
et.setSelection(et.getText().length());
etAddress.requestFocus();
} else {
Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show();
}
});
etNotes = view.findViewById(R.id.etNotes);
etNotes.getEditText().setRawInputType(InputType.TYPE_CLASS_TEXT);
etNotes.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_DONE)) {
etDummy.requestFocus();
return true;
}
return false;
}
});
etNotes.getEditText().
cvScan = view.findViewById(R.id.bScan);
cvScan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onScanListener.onScan();
}
});
setOnEditorActionListener((v, actionId, event) -> {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
|| (actionId == EditorInfo.IME_ACTION_DONE)) {
etDummy.requestFocus();
return true;
}
return false;
});
final View cvScan = view.findViewById(R.id.bScan);
cvScan.setOnClickListener(v -> onScanListener.onScan());
etDummy = view.findViewById(R.id.etDummy);
etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
@ -214,11 +263,49 @@ public class SendAddressWizardFragment extends SendWizardFragment {
return view;
}
private void setBtcMode() {
Timber.d("setBtcMode");
tvPaymentIdIntegrated.setVisibility(View.INVISIBLE);
llXmrTo.setVisibility(View.VISIBLE);
sendListener.setMode(SendFragment.Mode.BTC);
private void selectedCrypto(Crypto crypto) {
final ImageButton button = ibCrypto.get(crypto);
button.setImageResource(crypto.getIconEnabledId());
button.setImageAlpha(255);
button.setEnabled(true);
}
private void possibleCrypto(Crypto crypto) {
final ImageButton button = ibCrypto.get(crypto);
button.setImageResource(crypto.getIconDisabledId());
button.setImageAlpha(255);
button.setEnabled(true);
}
private void impossibleCrypto(Crypto crypto) {
final ImageButton button = ibCrypto.get(crypto);
button.setImageResource(crypto.getIconDisabledId());
button.setImageAlpha(128);
button.setEnabled(true);
}
private void updateCryptoButtons(boolean noAddress) {
for (Crypto crypto : Crypto.values()) {
if (crypto == selectedCrypto) {
selectedCrypto(crypto);
} else if (possibleCryptos.contains(crypto)) {
possibleCrypto(crypto);
} else {
impossibleCrypto(crypto);
}
}
if ((selectedCrypto != null) && (selectedCrypto != Crypto.XMR)) {
tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto, selectedCrypto.getSymbol())));
tvXmrTo.setVisibility(View.VISIBLE);
} else if ((selectedCrypto == null) && (possibleCryptos.size() > 1)) {
tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_ambiguous)));
tvXmrTo.setVisibility(View.VISIBLE);
} else {
tvXmrTo.setVisibility(View.INVISIBLE);
}
if (noAddress) {
selectedCrypto(Crypto.XMR);
}
}
private void processOpenAlias(String dnsOA) {
@ -229,10 +316,10 @@ public class SendAddressWizardFragment extends SendWizardFragment {
etAddress.setError(getString(R.string.send_address_resolve_openalias));
OpenAliasHelper.resolve(dnsOA, new OpenAliasHelper.OnResolvedListener() {
@Override
public void onResolved(Map<BarcodeData.Asset, BarcodeData> dataMap) {
public void onResolved(Map<Crypto, BarcodeData> dataMap) {
resolvingOA = false;
BarcodeData barcodeData = dataMap.get(BarcodeData.Asset.XMR);
if (barcodeData == null) barcodeData = dataMap.get(BarcodeData.Asset.BTC);
BarcodeData barcodeData = dataMap.get(Crypto.XMR);
if (barcodeData == null) barcodeData = dataMap.get(Crypto.BTC);
if (barcodeData != null) {
Timber.d("Security=%s, %s", barcodeData.security.toString(), barcodeData.address);
processScannedData(barcodeData);
@ -253,9 +340,7 @@ public class SendAddressWizardFragment extends SendWizardFragment {
}
private boolean checkAddressNoError() {
String address = etAddress.getEditText().getText().toString();
return Wallet.isAddressValid(address)
|| BitcoinAddressValidator.validate(address);
return selectedCrypto != null;
}
private boolean checkAddress() {
@ -268,19 +353,37 @@ public class SendAddressWizardFragment extends SendWizardFragment {
return ok;
}
private boolean isIntegratedAddress() {
String address = etAddress.getEditText().getText().toString();
private boolean isStandardAddress(String address) {
return Wallet.isAddressValid(address);
}
private boolean isIntegratedAddress(String address) {
return (address.length() == INTEGRATED_ADDRESS_LENGTH)
&& Wallet.isAddressValid(address);
}
private boolean isBitcoinAddress() {
final String address = etAddress.getEditText().getText().toString();
return BitcoinAddressValidator.validate(address);
private boolean isBitcoinishAddress(String address) {
return BitcoinAddressValidator.validate(address, BitcoinAddressType.BTC)
||
BitcoinAddressValidator.validate(address, BitcoinAddressType.LTC)
||
BitcoinAddressValidator.validate(address, BitcoinAddressType.DASH);
}
private boolean isEthAddress(String address) {
return EthAddressValidator.validate(address);
}
private void shakeAddress() {
etAddress.startAnimation(Helper.getShakeAnimation(getContext()));
if (possibleCryptos.size() > 1) { // address ambiguous
for (Crypto crypto : Crypto.values()) {
if (possibleCryptos.contains(crypto)) {
ibCrypto.get(crypto).startAnimation(Helper.getShakeAnimation(getContext()));
}
}
} else {
etAddress.startAnimation(Helper.getShakeAnimation(getContext()));
}
}
@Override
@ -300,9 +403,12 @@ public class SendAddressWizardFragment extends SendWizardFragment {
TxData txData = sendListener.getTxData();
if (txData instanceof TxDataBtc) {
((TxDataBtc) txData).setBtcAddress(etAddress.getEditText().getText().toString());
((TxDataBtc) txData).setBtcSymbol(selectedCrypto.getSymbol());
txData.setDestinationAddress(null);
ServiceHelper.ASSET = selectedCrypto.getSymbol().toLowerCase();
} else {
txData.setDestinationAddress(etAddress.getEditText().getText().toString());
ServiceHelper.ASSET = null;
}
txData.setUserNotes(new UserNotes(etNotes.getEditText().getText().toString()));
txData.setPriority(PendingTransaction.Priority.Priority_Default);
@ -344,6 +450,15 @@ public class SendAddressWizardFragment extends SendWizardFragment {
if (barcodeData.address != null) {
etAddress.getEditText().setText(barcodeData.address);
possibleCryptos.clear();
selectedCrypto = null;
if (barcodeData.isAmbiguous()) {
possibleCryptos.addAll(barcodeData.ambiguousAssets);
} else {
possibleCryptos.add(barcodeData.asset);
selectedCrypto = barcodeData.asset;
}
updateCryptoButtons(false);
if (checkAddress()) {
if (barcodeData.security == BarcodeData.Security.OA_NO_DNSSEC)
etAddress.setError(getString(R.string.send_address_no_dnssec));
@ -355,7 +470,12 @@ public class SendAddressWizardFragment extends SendWizardFragment {
etAddress.setError(null);
}
String scannedNotes = barcodeData.description;
String scannedNotes = barcodeData.addressName;
if (scannedNotes == null) {
scannedNotes = barcodeData.description;
} else if (barcodeData.description != null) {
scannedNotes = scannedNotes + ": " + barcodeData.description;
}
if (scannedNotes != null) {
etNotes.getEditText().setText(scannedNotes);
} else {

View File

@ -42,9 +42,8 @@ public class SendAmountWizardFragment extends SendWizardFragment {
Listener sendListener;
public SendAmountWizardFragment setSendListener(Listener listener) {
public void setSendListener(Listener listener) {
this.sendListener = listener;
return this;
}
interface Listener {

View File

@ -28,16 +28,16 @@ import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.data.BarcodeData;
import com.m2049r.xmrwallet.data.TxDataBtc;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.OkHttpHelper;
import com.m2049r.xmrwallet.widget.ExchangeOtherEditText;
import com.m2049r.xmrwallet.widget.SendProgressView;
import com.m2049r.xmrwallet.service.shift.ShiftCallback;
import com.m2049r.xmrwallet.service.shift.ShiftError;
import com.m2049r.xmrwallet.service.shift.ShiftException;
import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters;
import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
import com.m2049r.xmrwallet.service.shift.ShiftCallback;
import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl;
import com.m2049r.xmrwallet.util.OkHttpHelper;
import com.m2049r.xmrwallet.util.ServiceHelper;
import com.m2049r.xmrwallet.widget.ExchangeOtherEditText;
import com.m2049r.xmrwallet.widget.SendProgressView;
import java.text.NumberFormat;
import java.util.Locale;
@ -85,6 +85,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
etAmount = view.findViewById(R.id.etAmount);
etAmount.requestFocus();
return view;
}
@ -130,20 +131,26 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
public void onResumeFragment() {
super.onResumeFragment();
Timber.d("onResumeFragment()");
final String btcSymbol = ((TxDataBtc) sendListener.getTxData()).getBtcSymbol();
if (!btcSymbol.toLowerCase().equals(ServiceHelper.ASSET))
throw new IllegalStateException("Asset Symbol is wrong!");
final long funds = getTotalFunds();
if (!sendListener.getActivityCallback().isStreetMode()) {
tvFunds.setText(getString(R.string.send_available,
Wallet.getDisplayAmount(funds)));
//TODO
} else {
tvFunds.setText(getString(R.string.send_available,
getString(R.string.unknown_amount)));
}
etAmount.setAmount("");
final BarcodeData data = sendListener.popBarcodeData();
if (data != null) {
if (data.amount != null) {
etAmount.setAmount(data.amount);
}
}
etAmount.setBaseCurrency(btcSymbol);
callXmrTo();
}
@ -166,7 +173,9 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
String min = df.format(minBtc);
String max = df.format(maxBtc);
String rate = df.format(price);
Spanned xmrParmText = Html.fromHtml(getString(R.string.info_send_xmrto_parms, min, max, rate));
final TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
Spanned xmrParmText = Html.fromHtml(getString(R.string.info_send_xmrto_parms,
min, max, rate, txDataBtc.getBtcSymbol()));
tvXmrToParms.setText(xmrParmText);
final long funds = getTotalFunds();
@ -183,7 +192,8 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
}
tvFunds.setText(getString(R.string.send_available_btc,
availXmrString,
availBtcString));
availBtcString,
((TxDataBtc) sendListener.getTxData()).getBtcSymbol()));
llXmrToParms.setVisibility(View.VISIBLE);
evParams.hideProgress();
});
@ -246,7 +256,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
synchronized (this) {
if (xmrToApi == null) {
xmrToApi = new SideShiftApiImpl(OkHttpHelper.getOkHttpClient(),
Helper.getXmrToBaseUrl());
ServiceHelper.getXmrToBaseUrl());
}
}
}

View File

@ -29,16 +29,17 @@ import com.m2049r.xmrwallet.data.TxData;
import com.m2049r.xmrwallet.data.TxDataBtc;
import com.m2049r.xmrwallet.model.PendingTransaction;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.OkHttpHelper;
import com.m2049r.xmrwallet.widget.SendProgressView;
import com.m2049r.xmrwallet.service.shift.ShiftCallback;
import com.m2049r.xmrwallet.service.shift.ShiftError;
import com.m2049r.xmrwallet.service.shift.ShiftException;
import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder;
import com.m2049r.xmrwallet.service.shift.sideshift.api.RequestQuote;
import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
import com.m2049r.xmrwallet.service.shift.ShiftCallback;
import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.OkHttpHelper;
import com.m2049r.xmrwallet.util.ServiceHelper;
import com.m2049r.xmrwallet.widget.SendProgressView;
import java.text.NumberFormat;
import java.util.Locale;
@ -67,6 +68,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
private TextView tvTxBtcAmount;
private TextView tvTxBtcRate;
private TextView tvTxBtcAddress;
private TextView tvTxBtcAddressLabel;
private TextView tvTxXmrToKey;
private TextView tvTxFee;
private TextView tvTxTotal;
@ -84,6 +86,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
R.layout.fragment_send_btc_confirm, container, false);
tvTxBtcAddress = view.findViewById(R.id.tvTxBtcAddress);
tvTxBtcAddressLabel = view.findViewById(R.id.tvTxBtcAddressLabel);
tvTxBtcAmount = view.findViewById(R.id.tvTxBtcAmount);
tvTxBtcRate = view.findViewById(R.id.tvTxBtcRate);
tvTxXmrToKey = view.findViewById(R.id.tvTxXmrToKey);
@ -259,6 +262,8 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
if (sendListener.getMode() != SendFragment.Mode.BTC) {
throw new IllegalStateException("Mode is not BTC!");
}
if (!((TxDataBtc) sendListener.getTxData()).getBtcSymbol().toLowerCase().equals(ServiceHelper.ASSET))
throw new IllegalStateException("Asset Symbol is wrong!");
Helper.hideKeyboard(getActivity());
llStageA.setVisibility(View.INVISIBLE);
evStageA.hideProgress();
@ -392,9 +397,10 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
df.setMaximumFractionDigits(12);
final String btcAmount = df.format(xmrtoQuote.getBtcAmount());
final String xmrAmountTotal = df.format(xmrtoQuote.getXmrAmount());
tvTxBtcAmount.setText(getString(R.string.text_send_btc_amount, btcAmount, xmrAmountTotal));
tvTxBtcAmount.setText(getString(R.string.text_send_btc_amount,
btcAmount, xmrAmountTotal, txDataBtc.getBtcSymbol()));
final String xmrPriceBtc = df.format(xmrtoQuote.getPrice());
tvTxBtcRate.setText(getString(R.string.text_send_btc_rate, xmrPriceBtc));
tvTxBtcRate.setText(getString(R.string.text_send_btc_rate, xmrPriceBtc, txDataBtc.getBtcSymbol()));
hideProgress();
});
stageB(requestQuote.getId());
@ -477,13 +483,14 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
// verify amount & destination
if ((order.getBtcAmount() != txDataBtc.getBtcAmount())
|| (!order.getBtcAddress().equals(txDataBtc.getBtcAddress()))) {
|| (!txDataBtc.validateAddress(order.getBtcAddress()))) {
throw new IllegalStateException("Order does not fulfill quote!"); // something is terribly wrong - die
}
xmrtoOrder = order;
getView().post(() -> {
tvTxXmrToKey.setText(order.getOrderId());
tvTxBtcAddress.setText(order.getBtcAddress());
tvTxBtcAddressLabel.setText(getString(R.string.label_send_btc_address, txDataBtc.getBtcSymbol()));
hideProgress();
Timber.d("Expires @ %s", order.getExpiresAt().toString());
final int timeout = (int) (order.getExpiresAt().getTime() - order.getCreatedAt().getTime()) / 1000 - 60; // -1 minute buffer
@ -561,7 +568,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
synchronized (this) {
if (xmrToApi == null) {
xmrToApi = new SideShiftApiImpl(OkHttpHelper.getOkHttpClient(),
Helper.getXmrToBaseUrl());
ServiceHelper.getXmrToBaseUrl());
}
}
}

View File

@ -30,6 +30,7 @@ import android.widget.TextView;
import android.widget.Toast;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.data.Crypto;
import com.m2049r.xmrwallet.data.PendingTx;
import com.m2049r.xmrwallet.data.TxDataBtc;
import com.m2049r.xmrwallet.service.shift.ShiftCallback;
@ -39,6 +40,7 @@ import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.OkHttpHelper;
import com.m2049r.xmrwallet.util.ServiceHelper;
import java.text.NumberFormat;
import java.util.Locale;
@ -62,10 +64,10 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment {
ImageButton bCopyTxId;
private TextView tvTxId;
private TextView tvTxAddress;
private TextView tvTxPaymentId;
private TextView tvTxAmount;
private TextView tvTxFee;
private TextView tvXmrToAmount;
private ImageView ivXmrToIcon;
private TextView tvXmrToStatus;
private ImageView ivXmrToStatus;
private ImageView ivXmrToStatusBig;
@ -90,13 +92,13 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment {
});
tvXmrToAmount = view.findViewById(R.id.tvXmrToAmount);
ivXmrToIcon = view.findViewById(R.id.ivXmrToIcon);
tvXmrToStatus = view.findViewById(R.id.tvXmrToStatus);
ivXmrToStatus = view.findViewById(R.id.ivXmrToStatus);
ivXmrToStatusBig = view.findViewById(R.id.ivXmrToStatusBig);
tvTxId = view.findViewById(R.id.tvTxId);
tvTxAddress = view.findViewById(R.id.tvTxAddress);
tvTxPaymentId = view.findViewById(R.id.tvTxPaymentId);
tvTxAmount = view.findViewById(R.id.tvTxAmount);
tvTxFee = view.findViewById(R.id.tvTxFee);
@ -150,9 +152,11 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment {
NumberFormat df = NumberFormat.getInstance(Locale.US);
df.setMaximumFractionDigits(12);
String btcAmount = df.format(btcData.getBtcAmount());
tvXmrToAmount.setText(getString(R.string.info_send_xmrto_success_btc, btcAmount));
tvXmrToAmount.setText(getString(R.string.info_send_xmrto_success_btc, btcAmount, btcData.getBtcSymbol()));
//TODO btcData.getBtcAddress();
tvTxXmrToKey.setText(btcData.getXmrtoOrderId());
final Crypto crypto = Crypto.withSymbol(btcData.getBtcSymbol());
ivXmrToIcon.setImageResource(crypto.getIconEnabledId());
tvXmrToSupport.setOnClickListener(v -> {
Uri orderUri = getXmrToApi().getQueryOrderUri(btcData.getXmrtoOrderId());
Intent intent = new Intent(Intent.ACTION_VIEW, orderUri);
@ -211,7 +215,7 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment {
statusResource = R.drawable.ic_error_red_24dp;
pbXmrto.getIndeterminateDrawable().setColorFilter(0xff8b0000, android.graphics.PorterDuff.Mode.MULTIPLY);
} else if (status.isSent() || status.isPaid()) {
tvXmrToStatus.setText(getString(R.string.info_send_xmrto_sent));
tvXmrToStatus.setText(getString(R.string.info_send_xmrto_sent, btcData.getBtcSymbol()));
statusResource = R.drawable.ic_success_green_24dp;
pbXmrto.getIndeterminateDrawable().setColorFilter(0xFF417505, android.graphics.PorterDuff.Mode.MULTIPLY);
} else if (status.isWaiting()) {
@ -228,6 +232,7 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment {
ivXmrToStatus.setImageResource(statusResource);
if (status.isTerminal()) {
pbXmrto.setVisibility(View.INVISIBLE);
ivXmrToIcon.setVisibility(View.GONE);
ivXmrToStatus.setVisibility(View.GONE);
ivXmrToStatusBig.setImageResource(statusResource);
ivXmrToStatusBig.setVisibility(View.VISIBLE);
@ -241,7 +246,7 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment {
synchronized (this) {
if (xmrToApi == null) {
xmrToApi = new SideShiftApiImpl(OkHttpHelper.getOkHttpClient(),
Helper.getXmrToBaseUrl());
ServiceHelper.getXmrToBaseUrl());
}
}
}

View File

@ -29,6 +29,7 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@ -92,8 +93,6 @@ public class SendFragment extends Fragment
void setOnUriScannedListener(OnUriScannedListener onUriScannedListener);
}
private EditText etDummy;
private View llNavBar;
private DotBar dotBar;
private Button bPrev;
@ -101,7 +100,7 @@ public class SendFragment extends Fragment
private Button bDone;
static private int MAX_FALLBACK = Integer.MAX_VALUE;
static private final int MAX_FALLBACK = Integer.MAX_VALUE;
public static SendFragment newInstance(String uri) {
SendFragment f = new SendFragment();
@ -166,28 +165,18 @@ public class SendFragment extends Fragment
}
});
bPrev.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
spendViewPager.previous();
}
});
bPrev.setOnClickListener(v -> spendViewPager.previous());
bNext.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
spendViewPager.next();
}
});
bNext.setOnClickListener(v -> spendViewPager.next());
bDone.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Timber.d("bDone.onClick");
activityCallback.onFragmentDone();
}
bDone.setOnClickListener(v -> {
Timber.d("bDone.onClick");
activityCallback.onFragmentDone();
});
updatePosition(0);
etDummy = view.findViewById(R.id.etDummy);
final EditText etDummy = view.findViewById(R.id.etDummy);
etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
etDummy.requestFocus();
Helper.hideKeyboard(getActivity());
@ -197,7 +186,7 @@ public class SendFragment extends Fragment
String uri = args.getString(WalletActivity.REQUEST_URI);
Timber.d("URI: %s", uri);
if (uri != null) {
barcodeData = BarcodeData.fromQrCode(uri);
barcodeData = BarcodeData.fromString(uri);
Timber.d("barcodeData: %s", barcodeData != null ? barcodeData.toString() : "null");
}
}
@ -236,7 +225,7 @@ public class SendFragment extends Fragment
}
@Override
public void onAttach(Context context) {
public void onAttach(@NonNull Context context) {
Timber.d("onAttach %s", context);
super.onAttach(context);
if (context instanceof Listener) {
@ -300,12 +289,7 @@ public class SendFragment extends Fragment
default:
throw new IllegalArgumentException("Mode " + String.valueOf(aMode) + " unknown!");
}
getView().post(new Runnable() {
@Override
public void run() {
pagerAdapter.notifyDataSetChanged();
}
});
getView().post(() -> pagerAdapter.notifyDataSetChanged());
Timber.d("New Mode = %s", mode.toString());
}
}
@ -338,8 +322,9 @@ public class SendFragment extends Fragment
return numPages;
}
@NonNull
@Override
public Object instantiateItem(ViewGroup container, int position) {
public Object instantiateItem(@NonNull ViewGroup container, int position) {
Timber.d("instantiateItem %d", position);
SendWizardFragment fragment = (SendWizardFragment) super.instantiateItem(container, position);
myFragments.put(position, new WeakReference<>(fragment));
@ -347,20 +332,21 @@ public class SendFragment extends Fragment
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
Timber.d("destroyItem %d", position);
myFragments.remove(position);
super.destroyItem(container, position, object);
}
public SendWizardFragment getFragment(int position) {
WeakReference ref = myFragments.get(position);
WeakReference<SendWizardFragment> ref = myFragments.get(position);
if (ref != null)
return myFragments.get(position).get();
else
return null;
}
@NonNull
@Override
public SendWizardFragment getItem(int position) {
Timber.d("getItem(%d) CREATE", position);
@ -415,7 +401,7 @@ public class SendFragment extends Fragment
}
@Override
public int getItemPosition(Object object) {
public int getItemPosition(@NonNull Object object) {
Timber.d("getItemPosition %s", String.valueOf(object));
if (object instanceof SendAddressWizardFragment) {
// keep these pages

View File

@ -17,18 +17,20 @@
package com.m2049r.xmrwallet.layout;
import android.content.Context;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.data.Crypto;
import com.m2049r.xmrwallet.data.UserNotes;
import com.m2049r.xmrwallet.model.TransactionInfo;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.data.UserNotes;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@ -141,7 +143,13 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
UserNotes userNotes = new UserNotes(infoItem.notes);
if (userNotes.xmrtoKey != null) {
ivTxType.setVisibility(View.VISIBLE);
final Crypto crypto = Crypto.withSymbol(userNotes.xmrtoCurrency);
if (crypto != null) {
ivTxType.setImageResource(crypto.getIconEnabledId());
ivTxType.setVisibility(View.VISIBLE);
} else {// otherwirse pretend we don't know it's a shift
ivTxType.setVisibility(View.GONE);
}
} else {
ivTxType.setVisibility(View.GONE); // gives us more space for the amount
}

View File

@ -21,6 +21,8 @@ import java.util.Date;
public interface CreateOrder {
String TAG = "side";
String getBtcCurrency();
double getBtcAmount();
String getBtcAddress();

View File

@ -23,8 +23,6 @@ import androidx.annotation.NonNull;
import com.m2049r.xmrwallet.service.shift.ShiftCallback;
public interface SideShiftApi {
String ASSET = "btc";
int QUERY_INTERVAL = 5000; // ms
/**

View File

@ -25,6 +25,7 @@ import com.m2049r.xmrwallet.service.shift.ShiftCallback;
import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder;
import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
import com.m2049r.xmrwallet.util.DateHelper;
import com.m2049r.xmrwallet.util.ServiceHelper;
import org.json.JSONException;
import org.json.JSONObject;
@ -35,6 +36,8 @@ import java.util.Date;
import lombok.Getter;
class CreateOrderImpl implements CreateOrder {
@Getter
private final String btcCurrency;
@Getter
private final double btcAmount;
@Getter
@ -56,9 +59,10 @@ class CreateOrderImpl implements CreateOrder {
// sanity checks
final String depositMethod = jsonObject.getString("depositMethodId");
final String settleMethod = jsonObject.getString("settleMethodId");
if (!"xmr".equals(depositMethod) || !SideShiftApi.ASSET.equals(settleMethod))
if (!"xmr".equals(depositMethod) || !ServiceHelper.ASSET.equals(settleMethod))
throw new IllegalStateException();
btcCurrency = settleMethod.toUpperCase();
btcAmount = jsonObject.getDouble("settleAmount");
JSONObject settleAddress = jsonObject.getJSONObject("settleAddress");
btcAddress = settleAddress.getString("address");

View File

@ -23,6 +23,7 @@ import com.m2049r.xmrwallet.service.shift.ShiftApiCall;
import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters;
import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
import com.m2049r.xmrwallet.service.shift.ShiftCallback;
import com.m2049r.xmrwallet.util.ServiceHelper;
import org.json.JSONException;
import org.json.JSONObject;
@ -53,7 +54,7 @@ class QueryOrderParametersImpl implements QueryOrderParameters {
public static void call(@NonNull final ShiftApiCall api,
@NonNull final ShiftCallback<QueryOrderParameters> callback) {
api.call("pairs/xmr/" + SideShiftApi.ASSET, new NetworkCallback() {
api.call("pairs/xmr/" + ServiceHelper.ASSET, new NetworkCallback() {
@Override
public void onSuccess(JSONObject jsonObject) {
try {

View File

@ -24,6 +24,7 @@ import com.m2049r.xmrwallet.util.DateHelper;
import com.m2049r.xmrwallet.service.shift.sideshift.api.RequestQuote;
import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi;
import com.m2049r.xmrwallet.service.shift.ShiftCallback;
import com.m2049r.xmrwallet.util.ServiceHelper;
import org.json.JSONException;
import org.json.JSONObject;
@ -55,7 +56,7 @@ class RequestQuoteImpl implements RequestQuote {
// sanity checks
final String depositMethod = jsonObject.getString("depositMethod");
final String settleMethod = jsonObject.getString("settleMethod");
if (!"xmr".equals(depositMethod) || !SideShiftApi.ASSET.equals(settleMethod))
if (!"xmr".equals(depositMethod) || !ServiceHelper.ASSET.equals(settleMethod))
throw new IllegalStateException();
btcAmount = jsonObject.getDouble("settleAmount");
@ -106,7 +107,7 @@ class RequestQuoteImpl implements RequestQuote {
static JSONObject createRequest(final double xmrAmount) throws JSONException {
final JSONObject jsonObject = new JSONObject();
jsonObject.put("depositMethod", "xmr");
jsonObject.put("settleMethod", SideShiftApi.ASSET);
jsonObject.put("settleMethod", ServiceHelper.ASSET);
// #sideshift is silly and likes numbers as strings
String amount = AmountFormatter.format(xmrAmount);
jsonObject.put("depositAmount", amount);

View File

@ -323,15 +323,6 @@ public class Helper {
return ShakeAnimation;
}
static public HttpUrl getXmrToBaseUrl() {
if ((WalletManager.getInstance() == null)
|| (WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet)) {
throw new IllegalStateException("Only mainnet not supported");
} else {
return HttpUrl.parse("https://sideshift.ai/api/v1/");
}
}
private final static char[] HexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] data) {
@ -639,10 +630,6 @@ public class Helper {
}
}
static public ExchangeApi getExchangeApi() {
return new com.m2049r.xmrwallet.service.exchange.krakenEcb.ExchangeApiImpl(OkHttpHelper.getOkHttpClient());
}
public interface Action {
boolean run();
}

View File

@ -21,6 +21,7 @@ package com.m2049r.xmrwallet.util;
import android.os.AsyncTask;
import com.m2049r.xmrwallet.data.BarcodeData;
import com.m2049r.xmrwallet.data.Crypto;
import org.jitsi.dnssec.validator.ValidatingResolver;
import org.xbill.DNS.DClass;
@ -52,7 +53,6 @@ public class OpenAliasHelper {
public static final String OA1_NAME = "recipient_name";
public static final String OA1_DESCRIPTION = "tx_description";
public static final String OA1_AMOUNT = "tx_amount";
public static final String OA1_PAYMENTID = "tx_payment_id";
public static final int DNS_LOOKUP_TIMEOUT = 2500; // ms
@ -65,7 +65,7 @@ public class OpenAliasHelper {
}
public interface OnResolvedListener {
void onResolved(Map<BarcodeData.Asset, BarcodeData> dataMap);
void onResolved(Map<Crypto, BarcodeData> dataMap);
void onFailure();
}
@ -138,7 +138,7 @@ public class OpenAliasHelper {
public void onPostExecute(Boolean success) {
if (resolvedListener != null)
if (success) {
Map<BarcodeData.Asset, BarcodeData> dataMap = new HashMap<>();
Map<Crypto, BarcodeData> dataMap = new HashMap<>();
for (String txt : txts) {
BarcodeData bc = BarcodeData.parseOpenAlias(txt, dnssec);
if (bc != null) {

View File

@ -0,0 +1,24 @@
package com.m2049r.xmrwallet.util;
import com.m2049r.xmrwallet.model.NetworkType;
import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
import okhttp3.HttpUrl;
public class ServiceHelper {
public static String ASSET = null;
static public HttpUrl getXmrToBaseUrl() {
if ((WalletManager.getInstance() == null)
|| (WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet)) {
throw new IllegalStateException("Only mainnet not supported");
} else {
return HttpUrl.parse("https://sideshift.ai/api/v1/");
}
}
static public ExchangeApi getExchangeApi() {
return new com.m2049r.xmrwallet.service.exchange.krakenEcb.ExchangeApiImpl(OkHttpHelper.getOkHttpClient());
}
}

View File

@ -0,0 +1,51 @@
package com.m2049r.xmrwallet.util.validator;
import lombok.Getter;
public enum BitcoinAddressType {
BTC(Type.BTC, Type.BTC_BECH32_PREFIX),
LTC(Type.LTC, Type.LTC_BECH32_PREFIX),
DASH(Type.DASH, null),
DOGE(Type.DOGE, null);
@Getter
private final byte[] production;
@Getter
private final byte[] testnet;
@Getter
private final String productionBech32Prefix;
@Getter
private final String testnetBech32Prefix;
public boolean hasBech32() {
return productionBech32Prefix != null;
}
public String getBech32Prefix(boolean testnet) {
return testnet ? testnetBech32Prefix : productionBech32Prefix;
}
BitcoinAddressType(byte[][] types, String[] bech32Prefix) {
production = types[0];
testnet = types[1];
if (bech32Prefix != null) {
productionBech32Prefix = bech32Prefix[0];
testnetBech32Prefix = bech32Prefix[1];
} else {
productionBech32Prefix = null;
testnetBech32Prefix = null;
}
}
// Java is silly and doesn't allow array initializers in the construction
private static class Type {
private static final byte[][] BTC = {{0x00, 0x05}, {0x6f, (byte) 0xc4}};
private static final String[] BTC_BECH32_PREFIX = {"bc", "tb"};
private static final byte[][] LTC = {{0x30, 0x05, 0x32}, {0x6f, (byte) 0xc4, 0x3a}};
private static final String[] LTC_BECH32_PREFIX = {"ltc", "tltc"};
private static final byte[][] DASH = {{0x4c, 0x10}, {(byte) 0x8c, 0x13}};
private static final byte[][] DOGE = {{0x1e, 0x16}, {0x71, (byte) 0xc4}};
}
}

View File

@ -14,10 +14,11 @@
* limitations under the License.
*/
package com.m2049r.xmrwallet.util;
package com.m2049r.xmrwallet.util.validator;
// mostly based on https://rosettacode.org/wiki/Bitcoin/address_validation#Java
import com.m2049r.xmrwallet.data.Crypto;
import com.m2049r.xmrwallet.model.NetworkType;
import com.m2049r.xmrwallet.model.WalletManager;
@ -28,28 +29,47 @@ import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class BitcoinAddressValidator {
private static final String ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
public static boolean validate(String addrress) {
boolean testnet = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet;
if (validate(addrress, testnet)) return true;
return validateBech32Segwit(addrress, testnet);
public static Crypto validate(String address) {
for (BitcoinAddressType type : BitcoinAddressType.values()) {
if (validate(address, type))
return Crypto.valueOf(type.name());
}
return null;
}
public static boolean validate(String addrress, boolean testnet) {
// just for tests
public static boolean validateBTC(String addrress, boolean testnet) {
return validate(addrress, BitcoinAddressType.BTC, testnet);
}
public static boolean validate(String addrress, BitcoinAddressType type, boolean testnet) {
if (validate(addrress, testnet ? type.getTestnet() : type.getProduction()))
return true;
if (type.hasBech32())
return validateBech32Segwit(addrress, type, testnet);
else
return false;
}
public static boolean validate(String addrress, BitcoinAddressType type) {
final boolean testnet = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet;
return validate(addrress, type, testnet);
}
public static boolean validate(String addrress, byte[] addressTypes) {
if (addrress.length() < 26 || addrress.length() > 35)
return false;
byte[] decoded = decodeBase58To25Bytes(addrress);
if (decoded == null)
return false;
int v = decoded[0] & 0xFF;
if (!testnet) {
if ((v != 0x00) && (v != 0x05)) return false;
} else {
if ((v != 0x6f) && (v != 0xc4)) return false;
boolean nok = true;
for (byte b : addressTypes) {
nok = nok && (v != (b & 0xFF));
}
if (nok) return false;
byte[] hash1 = sha256(Arrays.copyOfRange(decoded, 0, 21));
byte[] hash2 = sha256(hash1);
@ -95,18 +115,20 @@ public class BitcoinAddressValidator {
private static final String DATA_CHARS = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
public static boolean validateBech32Segwit(String bech32, boolean testnet) {
public static boolean validateBech32Segwit(String bech32, BitcoinAddressType type, 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.startsWith(type.getBech32Prefix(testnet))) 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;
final int hrpLength = type.getBech32Prefix(testnet).length();
if ((bech32.length() < (12 + hrpLength)) || (bech32.length() > (72 + hrpLength)))
return false;
int mod = (bech32.length() - hrpLength) % 8;
if ((mod == 6) || (mod == 1) || (mod == 3)) return false;
int sep = -1;
final byte[] bytes = bech32.getBytes(StandardCharsets.US_ASCII);
@ -117,7 +139,7 @@ public class BitcoinAddressValidator {
if (bytes[i] == 49) sep = i; // 49 := '1' in ASCII
}
if (sep != 2) return false; // bech32 always has len(hrp)==2
if (sep != hrpLength) return false;
if (sep > bytes.length - 7) {
return false; // min 6 bytes data
}
@ -158,12 +180,12 @@ public class BitcoinAddressValidator {
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);
for (byte b : hrp) {
expanded[i++] = (byte) (b >> 5);
}
expanded[i++] = 0;
for (int j = 0; j < hrp.length; j++) {
expanded[i++] = (byte) (hrp[j] & 0x1f);
for (byte b : hrp) {
expanded[i++] = (byte) (b & 0x1f);
}
return expanded;
}
@ -195,4 +217,4 @@ public class BitcoinAddressValidator {
return true;
}
}
}

View File

@ -0,0 +1,64 @@
/*
* Copyright (c) 2017 m2049r er al.
*
* 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.
*/
package com.m2049r.xmrwallet.util.validator;
// mostly based on https://github.com/ognus/wallet-address-validator/blob/master/src/ethereum_validator.js
import com.theromus.sha.Keccak;
import com.theromus.sha.Parameters;
import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;
public class EthAddressValidator {
static private final Pattern ETH_ADDRESS = Pattern.compile("^0x[0-9a-fA-F]{40}$");
static private final Pattern ETH_ALLLOWER = Pattern.compile("^0x[0-9a-f]{40}$");
static private final Pattern ETH_ALLUPPER = Pattern.compile("^0x[0-9A-F]{40}$");
public static boolean validate(String address) {
// Check if it has the basic requirements of an address
if (!ETH_ADDRESS.matcher(address).matches())
return false;
// If it's all small caps or all all caps, return true
if (ETH_ALLLOWER.matcher(address).matches() || ETH_ALLUPPER.matcher(address).matches()) {
return true;
}
// Otherwise check each case
return validateChecksum(address);
}
private static boolean validateChecksum(String address) {
// Check each case
address = address.substring(2); // strip 0x
Keccak keccak = new Keccak();
final byte[] addressHash = keccak.getHash(
address.toLowerCase().getBytes(StandardCharsets.US_ASCII),
Parameters.KECCAK_256);
for (int i = 0; i < 40; i++) {
boolean upper = (addressHash[i / 2] & ((i % 2) == 0 ? 128 : 8)) != 0;
char c = address.charAt(i);
if (Character.isAlphabetic(c)) {
if (Character.isUpperCase(c) && !upper) return false;
if (Character.isLowerCase(c) && upper) return false;
}
}
return true;
}
}

View File

@ -40,6 +40,7 @@ import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi;
import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.ServiceHelper;
import java.util.ArrayList;
import java.util.Arrays;
@ -184,6 +185,12 @@ public class ExchangeEditText extends LinearLayout {
private boolean isInitialized = false;
void postInitialize() {
setInitialSpinnerSelections(sCurrencyA, sCurrencyB);
isInitialized = true;
startExchange();
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
@ -212,14 +219,7 @@ public class ExchangeEditText extends LinearLayout {
setCurrencyAdapter(sCurrencyA);
setCurrencyAdapter(sCurrencyB);
post(new Runnable() {
@Override
public void run() {
setInitialSpinnerSelections(sCurrencyA, sCurrencyB);
isInitialized = true;
startExchange();
}
});
post(this::postInitialize);
// make progress circle gray
pbExchange.getIndeterminateDrawable().
@ -296,7 +296,7 @@ public class ExchangeEditText extends LinearLayout {
}
}
private final ExchangeApi exchangeApi = Helper.getExchangeApi();
private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi();
// starts exchange through exchange api
void startExchange() {

View File

@ -25,6 +25,8 @@ import android.os.Looper;
import android.util.AttributeSet;
import android.widget.Spinner;
import androidx.annotation.NonNull;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
@ -46,12 +48,15 @@ public class ExchangeOtherEditText extends ExchangeEditText {
public void setExchangeRate(double rate) {
exchangeRate = rate;
post(new Runnable() {
@Override
public void run() {
startExchange();
}
});
post(this::startExchange);
}
public void setBaseCurrency(@NonNull String symbol) {
if (symbol.equals(baseCurrency)) return;
baseCurrency = symbol;
setCurrencyAdapter(sCurrencyA);
setCurrencyAdapter(sCurrencyB);
post(this::postInitialize);
}
private void setBaseCurrency(Context context, AttributeSet attrs) {
@ -184,12 +189,7 @@ public class ExchangeOtherEditText extends ExchangeEditText {
@Override
public void onError(final Exception e) {
Timber.e(e.getLocalizedMessage());
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
exchangeFailed();
}
});
new Handler(Looper.getMainLooper()).post(() -> exchangeFailed());
}
});
}

View File

@ -44,6 +44,7 @@ import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback;
import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate;
import com.m2049r.xmrwallet.util.ColorHelper;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.ServiceHelper;
import java.util.ArrayList;
import java.util.Arrays;
@ -311,7 +312,7 @@ public class ExchangeView extends LinearLayout {
}
}
private final ExchangeApi exchangeApi = Helper.getExchangeApi();
private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi();
void startExchange() {
showProgress();

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:fillColor="#F60"
android:pathData="M127.998,0C57.318,0 0,57.317 0,127.999c0,14.127 2.29,27.716 6.518,40.43H44.8V60.733l83.2,83.2 83.198,-83.2v107.695h38.282c4.231,-12.714 6.521,-26.303 6.521,-40.43C256,57.314 198.681,0 127.998,0" />
<path
android:fillColor="#4C4C4C"
android:pathData="M108.867,163.062l-36.31,-36.311v67.765H18.623c22.47,36.863 63.051,61.48 109.373,61.48s86.907,-24.617 109.374,-61.48h-53.933V126.75l-36.31,36.31 -19.13,19.129 -19.128,-19.128h-0.002z" />
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M127.998,0C57.318,0 0,57.317 0,127.999c0,14.127 2.29,27.716 6.518,40.43H44.8V60.733l83.2,83.2 83.198,-83.2v107.695h38.282c4.231,-12.714 6.521,-26.303 6.521,-40.43C256,57.314 198.681,0 127.998,0" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M108.867,163.062l-36.31,-36.311v67.765H18.623c22.47,36.863 63.051,61.48 109.373,61.48s86.907,-24.617 109.374,-61.48h-53.933V126.75l-36.31,36.31 -19.13,19.129 -19.128,-19.128h-0.002z" />
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="80.52"
android:viewportHeight="80.46">
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M66.07,9.67A40,40 0,0 0,9.69 66.11Z" />>
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M13.92,70.34a40,40 0,0 0,56.45 -56.5Z" />
</vector>

View File

@ -3,46 +3,46 @@
android:height="80dp"
android:viewportWidth="648"
android:viewportHeight="80">
<path
android:pathData="M65.94,9.56A40,40 0,0 0,9.56 66Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M13.79,70.23a40,40 0,0 0,56.45 -56.5Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M144.75,28a9.12,9.12 0,0 0,-1 -4.48A8.81,8.81 0,0 0,141 20.29a14.14,14.14 0,0 0,-4 -1.95,15.61 15.61,0 0,0 -4.84,-0.68 15.34,15.34 0,0 0,-4.24 0.58,11.88 11.88,0 0,0 -3.55,1.66 7.15,7.15 0,0 0,-2.47 2.63,7.26 7.26,0 0,0 -0.88,3.61v0.49a7.11,7.11 0,0 0,0.88 3.7A6.91,6.91 0,0 0,124.53 33,19 19,0 0,0 129,34.82a58.17,58.17 0,0 0,6.31 1.27C140.9,37 145,38.52 147.61,41a12.31,12.31 0,0 1,3.94 9.66v0.87a16,16 0,0 1,-1.18 6.25,13.23 13.23,0 0,1 -3.55,4.87 17,17 0,0 1,-5.72 3.22,24.6 24.6,0 0,1 -8,1.17A26.21,26.21 0,0 1,124 65.54a18,18 0,0 1,-6.6 -4.1,18.51 18.51,0 0,1 -4.05,-6.14A21.41,21.41 0,0 1,112 47.59V45.35h6.41V47.2c0,4.68 1.28,8.1 3.85,10.44s6.11,3.51 10.75,3.51c4,0 7,-0.88 9,-2.63a8.82,8.82 0,0 0,3 -6.93V51.1a7.26,7.26 0,0 0,-3 -6.33q-3.12,-2.21 -10.06,-3.22a38.07,38.07 0,0 1,-7.3 -1.66,17.24 17.24,0 0,1 -5.53,-2.83 13.62,13.62 0,0 1,-3.55 -4.29,13.48 13.48,0 0,1 -1.18,-5.85V26a11.87,11.87 0,0 1,1.28 -5.65,13.37 13.37,0 0,1 3.65,-4.49A16.94,16.94 0,0 1,124.92 13a26.31,26.31 0,0 1,15.19 0.29,21.17 21.17,0 0,1 6,3.41 14.69,14.69 0,0 1,5 11.12V31h-6.41V28Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M161.91,12.68h33.93v5.85H182.13V59.59h13.71v5.85H161.91V59.59h13.71v-41H161.91Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M207.78,12.68h17.56q9.91,0 14.5,4.68c3,3.12 4.53,8.1 4.53,14.92L244.37,45.84c0,6.82 -1.48,11.8 -4.53,14.92s-7.89,4.68 -14.5,4.68L207.78,65.44L207.78,59.49h4.54L212.32,18.63h-4.54ZM224.45,59.68a22.74,22.74 0,0 0,6.11 -0.69,9.73 9.73,0 0,0 4.24,-2.34 9.43,9.43 0,0 0,2.47 -4.39,26.62 26.62,0 0,0 0.79,-6.82L238.06,32.77a26.2,26.2 0,0 0,-0.79 -6.83,10 10,0 0,0 -2.47,-4.38 9.73,9.73 0,0 0,-4.24 -2.34,22.26 22.26,0 0,0 -6.11,-0.69h-5.62L218.83,59.59h5.62Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M256.21,12.68h32.35v5.85H262.62V36.09h25.55v5.85H262.62V59.59h26.43v5.85H256.21Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M331.67,28a9.12,9.12 0,0 0,-1 -4.48,8.81 8.81,0 0,0 -2.76,-3.22 14.2,14.2 0,0 0,-4.05 -1.95,15.55 15.55,0 0,0 -4.83,-0.68 15.34,15.34 0,0 0,-4.24 0.58,11.77 11.77,0 0,0 -3.55,1.66 7.07,7.07 0,0 0,-2.47 2.63,7.26 7.26,0 0,0 -0.89,3.61v0.49a7.11,7.11 0,0 0,0.89 3.7A6.91,6.91 0,0 0,311.45 33a19,19 0,0 0,4.44 1.85,58.17 58.17,0 0,0 6.31,1.27c5.62,0.87 9.76,2.43 12.33,4.87a12.31,12.31 0,0 1,3.94 9.66v0.87a16,16 0,0 1,-1.18 6.25,13.23 13.23,0 0,1 -3.55,4.87A17,17 0,0 1,328 65.83,24.64 24.64,0 0,1 320,67 26.21,26.21 0,0 1,311 65.54a18.09,18.09 0,0 1,-6.61 -4.1,18.63 18.63,0 0,1 -4,-6.14 21.41,21.41 0,0 1,-1.38 -7.71V45.35h6.41V47.2c0,4.68 1.28,8.1 3.85,10.44s6.11,3.51 10.75,3.51c3.94,0 7,-0.88 9,-2.63A8.8,8.8 0,0 0,332 51.59V51.1a7.24,7.24 0,0 0,-3.06 -6.33q-3.11,-2.21 -10.06,-3.22a38,38 0,0 1,-7.29 -1.66A17.24,17.24 0,0 1,306 37.06a13.62,13.62 0,0 1,-3.55 -4.29,13.48 13.48,0 0,1 -1.18,-5.85V26a11.87,11.87 0,0 1,1.28 -5.65,13.37 13.37,0 0,1 3.65,-4.49A16.94,16.94 0,0 1,311.84 13a26.31,26.31 0,0 1,15.19 0.29,21.17 21.17,0 0,1 6,3.41 14.69,14.69 0,0 1,5 11.12V31h-6.41Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M348,12.68h6.41V36.09h22.79V12.68h6.41V65.54h-6.41V42H354.45V65.63H348Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M395.68,12.68h33.93v5.85H415.9V59.59h13.71v5.85H395.68V59.59h13.71v-41H395.68Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M443.23,12.68h32.84v5.85H449.64V36.09h25.94v5.85H449.64v23.6h-6.41V12.68Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M487.32,12.68H524.9v5.85H509.32v47H502.9V18.63H487.32V12.68Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M537.33,61.34a4.74,4.74 0,0 1,1.58 -3.7,5 5,0 0,1 3.74,-1.56A5.36,5.36 0,0 1,548 61.34a4.76,4.76 0,0 1,-1.58 3.71,5 5,0 0,1 -3.75,1.56 4.86,4.86 0,0 1,-3.74 -1.56A4.76,4.76 0,0 1,537.33 61.34Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M595.82,52.47H572.94l-3.85,13.16h-6.91l16.08,-52.95h12l16.17,52.86h-6.9ZM583.89,15.41l-9.28,31.11H594l-9.27,-31.11Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:pathData="M614.07,12.68H648v5.85H634.29V59.59H648v5.85H614.07V59.59h13.71v-41H614.07Z"
android:fillColor="@color/monerujoPrimary"/>
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M65.94,9.56A40,40 0,0 0,9.56 66Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M13.79,70.23a40,40 0,0 0,56.45 -56.5Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M144.75,28a9.12,9.12 0,0 0,-1 -4.48A8.81,8.81 0,0 0,141 20.29a14.14,14.14 0,0 0,-4 -1.95,15.61 15.61,0 0,0 -4.84,-0.68 15.34,15.34 0,0 0,-4.24 0.58,11.88 11.88,0 0,0 -3.55,1.66 7.15,7.15 0,0 0,-2.47 2.63,7.26 7.26,0 0,0 -0.88,3.61v0.49a7.11,7.11 0,0 0,0.88 3.7A6.91,6.91 0,0 0,124.53 33,19 19,0 0,0 129,34.82a58.17,58.17 0,0 0,6.31 1.27C140.9,37 145,38.52 147.61,41a12.31,12.31 0,0 1,3.94 9.66v0.87a16,16 0,0 1,-1.18 6.25,13.23 13.23,0 0,1 -3.55,4.87 17,17 0,0 1,-5.72 3.22,24.6 24.6,0 0,1 -8,1.17A26.21,26.21 0,0 1,124 65.54a18,18 0,0 1,-6.6 -4.1,18.51 18.51,0 0,1 -4.05,-6.14A21.41,21.41 0,0 1,112 47.59V45.35h6.41V47.2c0,4.68 1.28,8.1 3.85,10.44s6.11,3.51 10.75,3.51c4,0 7,-0.88 9,-2.63a8.82,8.82 0,0 0,3 -6.93V51.1a7.26,7.26 0,0 0,-3 -6.33q-3.12,-2.21 -10.06,-3.22a38.07,38.07 0,0 1,-7.3 -1.66,17.24 17.24,0 0,1 -5.53,-2.83 13.62,13.62 0,0 1,-3.55 -4.29,13.48 13.48,0 0,1 -1.18,-5.85V26a11.87,11.87 0,0 1,1.28 -5.65,13.37 13.37,0 0,1 3.65,-4.49A16.94,16.94 0,0 1,124.92 13a26.31,26.31 0,0 1,15.19 0.29,21.17 21.17,0 0,1 6,3.41 14.69,14.69 0,0 1,5 11.12V31h-6.41V28Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M161.91,12.68h33.93v5.85H182.13V59.59h13.71v5.85H161.91V59.59h13.71v-41H161.91Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M207.78,12.68h17.56q9.91,0 14.5,4.68c3,3.12 4.53,8.1 4.53,14.92L244.37,45.84c0,6.82 -1.48,11.8 -4.53,14.92s-7.89,4.68 -14.5,4.68L207.78,65.44L207.78,59.49h4.54L212.32,18.63h-4.54ZM224.45,59.68a22.74,22.74 0,0 0,6.11 -0.69,9.73 9.73,0 0,0 4.24,-2.34 9.43,9.43 0,0 0,2.47 -4.39,26.62 26.62,0 0,0 0.79,-6.82L238.06,32.77a26.2,26.2 0,0 0,-0.79 -6.83,10 10,0 0,0 -2.47,-4.38 9.73,9.73 0,0 0,-4.24 -2.34,22.26 22.26,0 0,0 -6.11,-0.69h-5.62L218.83,59.59h5.62Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M256.21,12.68h32.35v5.85H262.62V36.09h25.55v5.85H262.62V59.59h26.43v5.85H256.21Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M331.67,28a9.12,9.12 0,0 0,-1 -4.48,8.81 8.81,0 0,0 -2.76,-3.22 14.2,14.2 0,0 0,-4.05 -1.95,15.55 15.55,0 0,0 -4.83,-0.68 15.34,15.34 0,0 0,-4.24 0.58,11.77 11.77,0 0,0 -3.55,1.66 7.07,7.07 0,0 0,-2.47 2.63,7.26 7.26,0 0,0 -0.89,3.61v0.49a7.11,7.11 0,0 0,0.89 3.7A6.91,6.91 0,0 0,311.45 33a19,19 0,0 0,4.44 1.85,58.17 58.17,0 0,0 6.31,1.27c5.62,0.87 9.76,2.43 12.33,4.87a12.31,12.31 0,0 1,3.94 9.66v0.87a16,16 0,0 1,-1.18 6.25,13.23 13.23,0 0,1 -3.55,4.87A17,17 0,0 1,328 65.83,24.64 24.64,0 0,1 320,67 26.21,26.21 0,0 1,311 65.54a18.09,18.09 0,0 1,-6.61 -4.1,18.63 18.63,0 0,1 -4,-6.14 21.41,21.41 0,0 1,-1.38 -7.71V45.35h6.41V47.2c0,4.68 1.28,8.1 3.85,10.44s6.11,3.51 10.75,3.51c3.94,0 7,-0.88 9,-2.63A8.8,8.8 0,0 0,332 51.59V51.1a7.24,7.24 0,0 0,-3.06 -6.33q-3.11,-2.21 -10.06,-3.22a38,38 0,0 1,-7.29 -1.66A17.24,17.24 0,0 1,306 37.06a13.62,13.62 0,0 1,-3.55 -4.29,13.48 13.48,0 0,1 -1.18,-5.85V26a11.87,11.87 0,0 1,1.28 -5.65,13.37 13.37,0 0,1 3.65,-4.49A16.94,16.94 0,0 1,311.84 13a26.31,26.31 0,0 1,15.19 0.29,21.17 21.17,0 0,1 6,3.41 14.69,14.69 0,0 1,5 11.12V31h-6.41Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M348,12.68h6.41V36.09h22.79V12.68h6.41V65.54h-6.41V42H354.45V65.63H348Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M395.68,12.68h33.93v5.85H415.9V59.59h13.71v5.85H395.68V59.59h13.71v-41H395.68Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M443.23,12.68h32.84v5.85H449.64V36.09h25.94v5.85H449.64v23.6h-6.41V12.68Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M487.32,12.68H524.9v5.85H509.32v47H502.9V18.63H487.32V12.68Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M537.33,61.34a4.74,4.74 0,0 1,1.58 -3.7,5 5,0 0,1 3.74,-1.56A5.36,5.36 0,0 1,548 61.34a4.76,4.76 0,0 1,-1.58 3.71,5 5,0 0,1 -3.75,1.56 4.86,4.86 0,0 1,-3.74 -1.56A4.76,4.76 0,0 1,537.33 61.34Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M595.82,52.47H572.94l-3.85,13.16h-6.91l16.08,-52.95h12l16.17,52.86h-6.9ZM583.89,15.41l-9.28,31.11H594l-9.27,-31.11Z" />
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M614.07,12.68H648v5.85H634.29V59.59H648v5.85H614.07V59.59h13.71v-41H614.07Z" />
</vector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="#F7931A"
android:fillType="evenOdd"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillColor="#FFF"
android:fillType="nonZero"
android:pathData="M23.189,14.02c0.314,-2.096 -1.283,-3.223 -3.465,-3.975l0.708,-2.84 -1.728,-0.43 -0.69,2.765c-0.454,-0.114 -0.92,-0.22 -1.385,-0.326l0.695,-2.783L15.596,6l-0.708,2.839c-0.376,-0.086 -0.746,-0.17 -1.104,-0.26l0.002,-0.009 -2.384,-0.595 -0.46,1.846s1.283,0.294 1.256,0.312c0.7,0.175 0.826,0.638 0.805,1.006l-0.806,3.235c0.048,0.012 0.11,0.03 0.18,0.057l-0.183,-0.045 -1.13,4.532c-0.086,0.212 -0.303,0.531 -0.793,0.41 0.018,0.025 -1.256,-0.313 -1.256,-0.313l-0.858,1.978 2.25,0.561c0.418,0.105 0.828,0.215 1.231,0.318l-0.715,2.872 1.727,0.43 0.708,-2.84c0.472,0.127 0.93,0.245 1.378,0.357l-0.706,2.828 1.728,0.43 0.715,-2.866c2.948,0.558 5.164,0.333 6.097,-2.333 0.752,-2.146 -0.037,-3.385 -1.588,-4.192 1.13,-0.26 1.98,-1.003 2.207,-2.538zM19.239,19.558c-0.533,2.147 -4.148,0.986 -5.32,0.695l0.95,-3.805c1.172,0.293 4.929,0.872 4.37,3.11zM19.774,13.989c-0.487,1.953 -3.495,0.96 -4.47,0.717l0.86,-3.45c0.975,0.243 4.118,0.696 3.61,2.733z" />
</vector>

View File

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="@color/monerujoPrimary"
android:fillType="evenOdd"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillColor="@color/monerujoBackground"
android:fillType="nonZero"
android:pathData="M23.189,14.02c0.314,-2.096 -1.283,-3.223 -3.465,-3.975l0.708,-2.84 -1.728,-0.43 -0.69,2.765c-0.454,-0.114 -0.92,-0.22 -1.385,-0.326l0.695,-2.783L15.596,6l-0.708,2.839c-0.376,-0.086 -0.746,-0.17 -1.104,-0.26l0.002,-0.009 -2.384,-0.595 -0.46,1.846s1.283,0.294 1.256,0.312c0.7,0.175 0.826,0.638 0.805,1.006l-0.806,3.235c0.048,0.012 0.11,0.03 0.18,0.057l-0.183,-0.045 -1.13,4.532c-0.086,0.212 -0.303,0.531 -0.793,0.41 0.018,0.025 -1.256,-0.313 -1.256,-0.313l-0.858,1.978 2.25,0.561c0.418,0.105 0.828,0.215 1.231,0.318l-0.715,2.872 1.727,0.43 0.708,-2.84c0.472,0.127 0.93,0.245 1.378,0.357l-0.706,2.828 1.728,0.43 0.715,-2.866c2.948,0.558 5.164,0.333 6.097,-2.333 0.752,-2.146 -0.037,-3.385 -1.588,-4.192 1.13,-0.26 1.98,-1.003 2.207,-2.538zM19.239,19.558c-0.533,2.147 -4.148,0.986 -5.32,0.695l0.95,-3.805c1.172,0.293 4.929,0.872 4.37,3.11zM19.774,13.989c-0.487,1.953 -3.495,0.96 -4.47,0.717l0.86,-3.45c0.975,0.243 4.118,0.696 3.61,2.733z" />
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="#008CE7"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillColor="#FFF"
android:pathData="M19.086,8.004H11.81l-0.602,3.367 6.562,0.01c3.231,0 4.19,1.173 4.159,3.12 -0.014,0.998 -0.449,2.686 -0.633,3.23 -0.497,1.46 -1.521,3.122 -5.359,3.117l-6.378,-0.004 -0.602,3.371h7.257c2.559,0 3.649,-0.299 4.8,-0.83 2.554,-1.178 4.075,-3.701 4.686,-6.994 0.906,-4.9 -0.224,-8.387 -6.615,-8.387z" />
<path
android:fillColor="#FFF"
android:pathData="M15.807,15.798c0.237,-0.985 0.312,-1.38 0.312,-1.38H8.673c-1.904,0 -2.176,1.24 -2.357,1.99 -0.237,0.981 -0.312,1.381 -0.312,1.381h7.447c1.903,0 2.175,-1.24 2.356,-1.991z" />
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="@color/monerujoPrimary"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillColor="@color/monerujoBackground"
android:pathData="M19.086,8.004H11.81l-0.602,3.367 6.562,0.01c3.231,0 4.19,1.173 4.159,3.12 -0.014,0.998 -0.449,2.686 -0.633,3.23 -0.497,1.46 -1.521,3.122 -5.359,3.117l-6.378,-0.004 -0.602,3.371h7.257c2.559,0 3.649,-0.299 4.8,-0.83 2.554,-1.178 4.075,-3.701 4.686,-6.994 0.906,-4.9 -0.224,-8.387 -6.615,-8.387z" />
<path
android:fillColor="@color/monerujoBackground"
android:pathData="M15.807,15.798c0.237,-0.985 0.312,-1.38 0.312,-1.38H8.673c-1.904,0 -2.176,1.24 -2.357,1.99 -0.237,0.981 -0.312,1.381 -0.312,1.381h7.447c1.903,0 2.175,-1.24 2.356,-1.991z" />
</vector>

View File

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="#C3A634"
android:fillType="evenOdd"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="M13.248,14.61h4.314v2.286h-4.314v4.818h2.721c1.077,0 1.958,-0.145 2.644,-0.437 0.686,-0.291 1.224,-0.694 1.615,-1.21a4.4,4.4 0,0 0,0.796 -1.815,11.4 11.4,0 0,0 0.21,-2.252 11.4,11.4 0,0 0,-0.21 -2.252,4.396 4.396,0 0,0 -0.796,-1.815c-0.391,-0.516 -0.93,-0.919 -1.615,-1.21 -0.686,-0.292 -1.567,-0.437 -2.644,-0.437h-2.721v4.325zM10.482,16.896L9,16.896v-2.285h1.482L10.482,8h6.549c1.21,0 2.257,0.21 3.142,0.627 0.885,0.419 1.607,0.99 2.168,1.715 0.56,0.724 0.977,1.572 1.25,2.543 0.273,0.971 0.409,2.01 0.409,3.115a11.47,11.47 0,0 1,-0.41 3.115c-0.272,0.97 -0.689,1.819 -1.25,2.543 -0.56,0.725 -1.282,1.296 -2.167,1.715 -0.885,0.418 -1.933,0.627 -3.142,0.627h-6.549v-7.104z" />
</vector>

View File

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="@color/monerujoPrimary"
android:fillType="evenOdd"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillColor="@color/monerujoBackground"
android:fillType="evenOdd"
android:pathData="M13.248,14.61h4.314v2.286h-4.314v4.818h2.721c1.077,0 1.958,-0.145 2.644,-0.437 0.686,-0.291 1.224,-0.694 1.615,-1.21a4.4,4.4 0,0 0,0.796 -1.815,11.4 11.4,0 0,0 0.21,-2.252 11.4,11.4 0,0 0,-0.21 -2.252,4.396 4.396,0 0,0 -0.796,-1.815c-0.391,-0.516 -0.93,-0.919 -1.615,-1.21 -0.686,-0.292 -1.567,-0.437 -2.644,-0.437h-2.721v4.325zM10.482,16.896L9,16.896v-2.285h1.482L10.482,8h6.549c1.21,0 2.257,0.21 3.142,0.627 0.885,0.419 1.607,0.99 2.168,1.715 0.56,0.724 0.977,1.572 1.25,2.543 0.273,0.971 0.409,2.01 0.409,3.115a11.47,11.47 0,0 1,-0.41 3.115c-0.272,0.97 -0.689,1.819 -1.25,2.543 -0.56,0.725 -1.282,1.296 -2.167,1.715 -0.885,0.418 -1.933,0.627 -3.142,0.627h-6.549v-7.104z" />
</vector>

View File

@ -0,0 +1,38 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="#627EEA"
android:fillType="evenOdd"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillAlpha="0.602"
android:fillColor="#FFF"
android:fillType="nonZero"
android:pathData="M16.498,4v8.87l7.497,3.35z" />
<path
android:fillColor="#FFF"
android:fillType="nonZero"
android:pathData="M16.498,4L9,16.22l7.498,-3.35z" />
<path
android:fillAlpha="0.602"
android:fillColor="#FFF"
android:fillType="nonZero"
android:pathData="M16.498,21.968v6.027L24,17.616z" />
<path
android:fillColor="#FFF"
android:fillType="nonZero"
android:pathData="M16.498,27.995v-6.028L9,17.616z" />
<path
android:fillAlpha="0.2"
android:fillColor="#FFF"
android:fillType="nonZero"
android:pathData="M16.498,20.573l7.497,-4.353 -7.497,-3.348z" />
<path
android:fillAlpha="0.602"
android:fillColor="#FFF"
android:fillType="nonZero"
android:pathData="M9,16.22l7.498,4.353v-7.701z" />
</vector>

View File

@ -0,0 +1,38 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="@color/monerujoPrimary"
android:fillType="evenOdd"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillAlpha="0.602"
android:fillColor="@color/monerujoBackground"
android:fillType="nonZero"
android:pathData="M16.498,4v8.87l7.497,3.35z" />
<path
android:fillColor="@color/monerujoBackground"
android:fillType="nonZero"
android:pathData="M16.498,4L9,16.22l7.498,-3.35z" />
<path
android:fillAlpha="0.602"
android:fillColor="@color/monerujoBackground"
android:fillType="nonZero"
android:pathData="M16.498,21.968v6.027L24,17.616z" />
<path
android:fillColor="@color/monerujoBackground"
android:fillType="nonZero"
android:pathData="M16.498,27.995v-6.028L9,17.616z" />
<path
android:fillAlpha="0.2"
android:fillColor="@color/monerujoBackground"
android:fillType="nonZero"
android:pathData="M16.498,20.573l7.497,-4.353 -7.497,-3.348z" />
<path
android:fillAlpha="0.602"
android:fillColor="@color/monerujoBackground"
android:fillType="nonZero"
android:pathData="M9,16.22l7.498,4.353v-7.701z" />
</vector>

View File

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="#315d9e"
android:fillType="evenOdd"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillColor="#FFF"
android:fillType="evenOdd"
android:pathData="M10.427,19.214L9,19.768l0.688,-2.759 1.444,-0.58L13.213,8h5.129l-1.519,6.196 1.41,-0.571 -0.68,2.75 -1.427,0.571 -0.848,3.483H23L22.127,24H9.252z" />
</vector>

View File

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="@color/monerujoPrimary"
android:fillType="evenOdd"
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" />
<path
android:fillColor="@color/monerujoBackground"
android:fillType="evenOdd"
android:pathData="M10.427,19.214L9,19.768l0.688,-2.759 1.444,-0.58L13.213,8h5.129l-1.519,6.196 1.41,-0.571 -0.68,2.75 -1.427,0.571 -0.848,3.483H23L22.127,24H9.252z" />
</vector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -29,14 +29,12 @@
android:orientation="horizontal">
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:id="@+id/etAddress"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_toStartOf="@+id/bPasteAddress"
app:counterEnabled="true"
app:counterMaxLength="95"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
@ -61,57 +59,94 @@
android:src="@drawable/ic_content_paste_24dp" />
</RelativeLayout>
<FrameLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvPaymentIdIntegrated"
style="@style/MoneroText.Info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:layout_margin="8dp"
android:drawablePadding="8dp"
android:gravity="center"
android:text="@string/info_paymentid_integrated"
android:textSize="18sp"
android:visibility="invisible"
app:drawableStartCompat="@drawable/ic_check_gray_24dp" />
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/llXmrTo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal"
android:visibility="invisible">
android:weightSum="6">
<ImageView
<ImageButton
android:id="@+id/ibXMR"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:paddingTop="8dp"
android:src="@drawable/gunther_24dp" />
android:layout_weight="1"
android:background="@null"
android:padding="8dp"
android:src="@drawable/ic_monero" />
<TextView
android:id="@+id/tvXmrTo"
style="@style/MoneroText.Info"
android:layout_width="match_parent"
<ImageButton
android:id="@+id/ibBTC"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:gravity="start|top"
android:singleLine="false"
android:textSize="18sp"
tools:text="@string/info_xmrto" />
android:layout_weight="1"
android:background="@null"
android:padding="8dp"
android:src="@drawable/ic_xmrto_btc_off" />
<ImageButton
android:id="@+id/ibLTC"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null"
android:padding="8dp"
android:src="@drawable/ic_xmrto_ltc_off" />
<ImageButton
android:id="@+id/ibETH"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null"
android:padding="8dp"
android:src="@drawable/ic_xmrto_eth_off" />
<ImageButton
android:id="@+id/ibDASH"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null"
android:padding="8dp"
android:src="@drawable/ic_xmrto_dash_off" />
<ImageButton
android:id="@+id/ibDOGE"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null"
android:padding="8dp"
android:src="@drawable/ic_xmrto_doge_off" />
</LinearLayout>
</FrameLayout>
<TextView
android:id="@+id/tvXmrTo"
style="@style/MoneroText.Info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="16dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="16dp"
android:drawablePadding="8dp"
android:gravity="start"
android:singleLine="false"
android:text="@string/label_send_btc_xmrto_key"
android:textSize="18sp"
android:visibility="invisible"
app:drawableStartCompat="@drawable/gunther_24dp"
tools:text="@string/info_xmrto" />
</LinearLayout>
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:id="@+id/etNotes"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content">

View File

@ -12,7 +12,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
android:layout_marginStart="56dp"
tools:text="@string/send_available_btc" />
<FrameLayout
@ -34,11 +34,11 @@
android:visibility="invisible">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="top"
android:paddingTop="8dp"
android:src="@drawable/ic_xmrto_32dp" />
android:src="@drawable/ic_sideshift_circle" />
<TextView
android:id="@+id/tvXmrToParms"

View File

@ -91,7 +91,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
android:visibility="invisible">
android:visibility="visible">
<TextView
style="@style/MoneroText.Confirm.Label"
@ -101,7 +101,7 @@
android:drawablePadding="8dp"
android:gravity="center_vertical"
android:text="@string/label_send_btc_xmrto_key"
card_view:drawableStartCompat="@drawable/ic_xmrto_32dp" />
card_view:drawableStartCompat="@drawable/ic_sideshift_circle" />
<TextView
android:id="@+id/tvTxXmrToKey"
@ -127,6 +127,7 @@
android:text="@string/label_send_btc_xmrto_info" />
<TextView
android:id="@+id/tvTxBtcAddressLabel"
style="@style/MoneroText.Confirm.Label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -19,10 +19,10 @@
<ImageView
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_gravity="top"
android:layout_gravity="center_vertical"
android:layout_marginEnd="24dp"
android:padding="6dp"
android:src="@drawable/ic_check_circle_xmr" />
android:src="@drawable/ic_monero" />
<LinearLayout
android:layout_width="match_parent"
@ -38,7 +38,7 @@
<TextView
android:id="@+id/tvTxAmount"
style="@style/MoneroText.Balance.Orange"
style="@style/MoneroText.Balance.Orange.Smaller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
@ -108,7 +108,7 @@
<com.google.android.material.card.MaterialCardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginTop="24dp"
android:layout_marginBottom="16dp"
card_view:contentPadding="8dp">
@ -128,6 +128,13 @@
android:layout_height="wrap_content"
android:layout_centerInParent="true">
<ImageView
android:id="@+id/ivXmrToIcon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"
android:src="@drawable/ic_xmrto_btc" />
<ProgressBar
android:id="@+id/pbXmrto"
android:layout_width="match_parent"
@ -141,7 +148,7 @@
android:id="@+id/ivXmrToStatus"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:layout_gravity="bottom|right"
android:src="@drawable/ic_pending_orange_24dp"
android:visibility="visible" />
@ -151,15 +158,6 @@
android:layout_height="72dp"
android:layout_gravity="center"
android:visibility="invisible" />
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="top|start"
android:layout_marginStart="10dp"
android:layout_marginTop="0dp"
android:src="@drawable/ic_xmrto_whitestroke_24px" />
</FrameLayout>
<TextView
@ -206,9 +204,7 @@
android:layout_height="wrap_content"
android:background="?android:attr/colorBackground"
android:drawablePadding="8dp"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="8dp"
android:paddingBottom="8dp"
android:textColor="?attr/colorPrimary"
card_view:drawableEndCompat="@drawable/ic_content_copy_24dp"
@ -219,7 +215,7 @@
style="@style/MoneroText.Medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_gravity="start"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:drawablePadding="8dp"

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -20,10 +19,10 @@
<ImageView
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_gravity="top"
android:layout_gravity="center_vertical"
android:layout_marginEnd="24dp"
android:padding="6dp"
android:src="@drawable/ic_check_circle" />
android:src="@drawable/ic_monero" />
<LinearLayout
android:layout_width="match_parent"
@ -39,7 +38,7 @@
<TextView
android:id="@+id/tvTxAmount"
style="@style/MoneroText.Balance.Orange"
style="@style/MoneroText.Balance.Orange.Smaller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"

View File

@ -91,7 +91,7 @@
android:layout_gravity="center_vertical"
android:gravity="end"
android:padding="8dp"
android:text="@string/tx_amount_btc" />
android:text="@string/tx_amount" />
<TextView
android:id="@+id/tvTxAmountBtc"
@ -113,7 +113,7 @@
android:layout_gravity="top"
android:gravity="end"
android:padding="8dp"
android:text="@string/tx_destination_btc" />
android:text="@string/tx_destination" />
<TextView
android:id="@+id/tvDestinationBtc"
@ -148,7 +148,7 @@
android:layout_height="wrap_content"
android:background="?android:attr/colorBackground"
android:drawablePadding="16dp"
android:paddingStart="24dp"
android:paddingStart="8dp"
android:paddingTop="8dp"
android:paddingEnd="8dp"
android:paddingBottom="8dp"

View File

@ -24,7 +24,7 @@
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center"
android:src="@drawable/ic_xmrto_32dp"
android:src="@drawable/ic_xmrto_btc"
android:visibility="visible" />
<LinearLayout

View File

@ -35,29 +35,26 @@
<string name="info_ledger_enabled">Ledger habilitat, premi aquí per més informació.</string>
<string name="info_xmrto"><![CDATA[
<b>Heu introduït una adreça de Bitcoin.</b><br/>
<i>Està a punt d\'enviar XMR i el destinatari rebrà BTC a través del servei <b>SideShift.ai</b> service.</i>
<b>Heu introduït una adreça %1$s.</b><br/>
<i>Està a punt d\'enviar XMR i el destinatari rebrà %1$s a través del servei <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">Ordre SideShift.ai</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Confirmació Pendent</string>
<string name="info_send_xmrto_unpaid">Pagament Pendent</string>
<string name="info_send_xmrto_error">Error de SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Enviats!</string>
<string name="info_send_xmrto_sent">%1$s Enviats!</string>
<string name="info_send_xmrto_query">Consultant &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>You can send %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> està oferint una tasa de canvi de <b>%3$s BTC</b> <u>en aquest moment</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Quantitats fins a <b>%1$s BTC</b> seran enviats <u>a l\'instant</u>!</i>
<b>You can send %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> està oferint una tasa de canvi de <b>%3$s %4$s/XMR</b> <u>en aquest moment</u></i>.
]]></string>
<string name="send_available_btc">Balanç: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Balanç: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; ID de pagment integrat</string>
<string name="info_prepare_tx">Preparant la seva transacció</string>
@ -75,13 +72,13 @@
<string name="text_noretry_monero">Vatua l\'olla! Sembla ser que estem encallats!</string>
<string name="text_noretry">Ups, sembla que SideShift.ai no està disponible ara mateix!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Canvi: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Canvi: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Visita SideShift.ai per suport i seguiment</string>
<string name="label_send_btc_xmrto_key_lb">Clau secreta\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">Clau secreta SideShift.ai</string>
<string name="label_send_btc_address">Adreça BTC de destí</string>
<string name="label_send_btc_address">Adreça %1$s de destí</string>
<string name="label_send_btc_amount">Quantitat</string>
<string name="label_send_txid">ID de transacció</string>
@ -251,11 +248,9 @@
<string name="tx_id">ID de transacció</string>
<string name="tx_key">Clau de transacció</string>
<string name="tx_destination">Destí</string>
<string name="tx_destination_btc">Destí\n(BTC)</string>
<string name="tx_paymentId">ID de pagament</string>
<string name="tx_blockheight">Bloc</string>
<string name="tx_amount">Quantitat</string>
<string name="tx_amount_btc">Quantitat\n(BTC)</string>
<string name="tx_fee">Comissió</string>
<string name="tx_transfers">Transferències</string>
<string name="tx_notes">Notes</string>
@ -354,11 +349,6 @@
<string name="send_address_hint">Receptor</string>
<string name="xmrto_error_001">SideShift.ai fora de línia - intenti-ho més tard</string>
<string name="xmrto_error_004">Quantitat de BTC fora dels límits</string>
<string name="xmrto_error_010">URL de pagament no vàlida o obsoleta</string>
<string name="xmrto_error_012">Massa peticions</string>
<string name="street_sweep_amount">TOT!</string>
<string name="menu_ledger_seed">Convertir la llavor del Ledger</string>
@ -381,8 +371,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -406,4 +396,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,30 +35,26 @@
<string name="info_ledger_enabled">Ledger aktiviert Tippe für mehr Infos.</string>
<string name="info_xmrto"><![CDATA[
<b>Du hast eine BTC-Adresse eingegeben.</b><br/>
<i>Du wirst XMR versenden und der Empfänger durch den <b>SideShift.ai</b> Service BTC erhalten.</i>
<b>Du hast eine %1$s-Adresse eingegeben.</b><br/>
<i>Du wirst XMR versenden und der Empfänger durch den <b>SideShift.ai</b> Service %1$s erhalten.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai-Auftrag</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Bestätigung ausstehend</string>
<string name="info_send_xmrto_unpaid">Bezahlung ausstehend</string>
<string name="info_send_xmrto_error">SideShift.ai-Fehler (%1$s)</string>
<string name="info_send_xmrto_sent">BTC gesendet!</string>
<string name="info_send_xmrto_sent">%1$s gesendet!</string>
<string name="info_send_xmrto_query">Frage ab &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Du kannst %1$s &#8212; %2$s BTC senden</b>.<br/>
<i><b>SideShift.ai</b> gibt dir <u>aktuell</u> einen Wechselkurs von <b>%3$s BTC</b></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Beträge bis zu <b>%1$s BTC</b> werden <u>sofort</u> versendet!</i>
<b>Du kannst %1$s &#8212; %2$s %4$s senden</b>.<br/>
<i><b>SideShift.ai</b> gibt dir <u>aktuell</u> einen Wechselkurs von <b>%3$s %4$s/XMR</b></i>.
]]></string>
<string name="send_available_btc">Guthaben: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Guthaben: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Zahlungs-ID integriert</string>
<string name="info_prepare_tx">Bereite deine Transaktion vor</string>
@ -76,13 +72,13 @@
<string name="text_noretry_monero">Jetzt hängen wir hier fest!</string>
<string name="text_noretry">Oh oh SideShift.ai scheint im Moment nicht verfügbar zu sein!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Kurs: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Kurs: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Besuche SideShift.ai für Support &amp; Nachverfolgung</string>
<string name="label_send_btc_xmrto_key_lb">Geheimer Schlüssel\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai Geheimer Schlüssel</string>
<string name="label_send_btc_address">BTC-Zieladresse</string>
<string name="label_send_btc_address">%1$s-Zieladresse</string>
<string name="label_send_btc_amount">Betrag</string>
<string name="label_send_txid">Transaktions-ID</string>
@ -246,11 +242,9 @@
<string name="tx_id">Transaktions-ID</string>
<string name="tx_key">Transaktionsschlüssel</string>
<string name="tx_destination">Ziel</string>
<string name="tx_destination_btc">Ziel\n(BTC)</string>
<string name="tx_paymentId">Zahlungs-ID</string>
<string name="tx_blockheight">Block</string>
<string name="tx_amount">Betrag</string>
<string name="tx_amount_btc">Betrag\n(BTC)</string>
<string name="tx_fee">Gebühr</string>
<string name="tx_transfers">Transfers</string>
<string name="tx_notes">Notizen</string>
@ -357,11 +351,6 @@
<string name="send_address_hint">Empfänger</string>
<string name="xmrto_error_001">SideShift.ai nicht erreichbar versuche es später nochmal</string>
<string name="xmrto_error_004">BTC-Betrag außerhalb des gültigen Bereiches</string>
<string name="xmrto_error_010">Ungültige oder veraltete Zahlungs-URL</string>
<string name="xmrto_error_012">Zu viele Anfragen</string>
<string name="street_sweep_amount">ALLES!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Konvertiere Ledger-Seed</string>
@ -384,8 +373,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -409,4 +398,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -34,29 +34,26 @@
<string name="info_ledger_enabled">Ledger ενεργοποιήθηκε, πάτα για περισσότερες πληροφορείες.</string>
<string name="info_xmrto"><![CDATA[
<b>Έβαλες μια διεύθυνση bitcoin.</b><br/>
<i>Θα στείλεις XMR και ο παραλήπτης θα πάρει BTC μέσο της υπηρεσίας <b>SideShift.ai</b>.</i>
<b>Έβαλες μια διεύθυνση %1$s.</b><br/>
<i>Θα στείλεις XMR και ο παραλήπτης θα πάρει %1$s μέσο της υπηρεσίας <b>SideShift.ai</b>.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">Εντολή SideShift.ai</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Επιβεβαίωση Εκκρεμεί</string>
<string name="info_send_xmrto_unpaid">Πληρωμή σε εκκρεμότητα</string>
<string name="info_send_xmrto_error">SideShift.ai Σφάλμα (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Αποστάλθηκαν!</string>
<string name="info_send_xmrto_sent">%1$s Αποστάλθηκαν!</string>
<string name="info_send_xmrto_query">Αίτηση &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Μπορείς να στείλεις %1$s &#8212; %2$s BTC</b>.<br/>
<i>Το <b>SideShift.ai</b> σου δίνει ισοτιμία ανταλλαγής <b>%3$s BTC</b> <u>αυτή τη στιγμή</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Ποσά μέχρι <b>%1$s BTC</b> θα σταλούν <u>άμεσα</u>!</i>
<b>Μπορείς να στείλεις %1$s &#8212; %2$s %4$s</b>.<br/>
<i>Το <b>SideShift.ai</b> σου δίνει ισοτιμία ανταλλαγής <b>%3$s %4$s/XMR</b> <u>αυτή τη στιγμή</u></i>.
]]></string>
<string name="send_available_btc">Σύνολο: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Σύνολο: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; ID πληρωμής ενσωματωμένο</string>
<string name="info_prepare_tx">Προετοιμασία της συναλλαγής σου</string>
@ -74,13 +71,13 @@
<string name="text_noretry_monero">Τώρα έχουμε κολλήσει εδώ!</string>
<string name="text_noretry">Ωχ,το SideShift.ai φαίνεται να μην ειναι προσωρινά διαθέσιμο!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Επίσκεψη στο SideShift.ai για υποστήριξη &amp; με εντοπισμό συναλλαγής</string>
<string name="label_send_btc_xmrto_key_lb">Μυστικό Κλειδί\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai Μυστικό Κλειδί</string>
<string name="label_send_btc_address">BTC Διεύθυνση Παραλήπτη</string>
<string name="label_send_btc_address">%1$s Διεύθυνση Παραλήπτη</string>
<string name="label_send_btc_amount">Ποσό</string>
<string name="label_send_txid">ID Συναλλαγής</string>
@ -220,11 +217,9 @@
<string name="tx_id">ID Συναλλαγής(TX ID)</string>
<string name="tx_key">Κλειδί συναλλαγής(TX Key)</string>
<string name="tx_destination">Προορισμός</string>
<string name="tx_destination_btc">Προορισμός\n(BTC)</string>
<string name="tx_paymentId">ID Πληρωμής(Payment ID)</string>
<string name="tx_blockheight">Μπλοκ</string>
<string name="tx_amount">Ποσό</string>
<string name="tx_amount_btc">Ποσό\n(BTC)</string>
<string name="tx_fee">Κόμιστρο</string>
<string name="tx_transfers">Συναλλαγές</string>
<string name="tx_notes">Σημειώσεις</string>
@ -356,11 +351,6 @@
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">SideShift.ai 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="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -383,8 +373,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -408,4 +398,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,29 +35,26 @@
<string name="info_ledger_enabled">Ledger permesita, frapetu por detaloj.</string>
<string name="info_xmrto"><![CDATA[
<b>Vi entajpis Bitmono-adreson.</b><br/>
<i>Vi sendos XMR-on, kaj per la<b>SideShift.ai</b>-servo, la ricevanto havos BTC-on.</i>
<b>Vi entajpis %1$s-adreson.</b><br/>
<i>Vi sendos XMR-on, kaj per la<b>SideShift.ai</b>-servo, la ricevanto havos %1$s-on.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">mendo al SideShift.ai</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Konfirmo okazonta</string>
<string name="info_send_xmrto_unpaid">Pago okazonta</string>
<string name="info_send_xmrto_error">SideShift.ai eraro (%1$s)</string>
<string name="info_send_xmrto_sent">BTC sendiĝis!</string>
<string name="info_send_xmrto_sent">%1$s sendiĝis!</string>
<string name="info_send_xmrto_query">Informpetante &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Vi povas sendi %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> proponas al vi tiun kurzon: <b>%3$s BTC</b> <u>nun</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Kvantoj ĝis <b>%1$s BTC</b> sendiĝos <u>senatende</u>!</i>
<b>Vi povas sendi %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> proponas al vi tiun kurzon: <b>%3$s %4$s/XMR</b> <u>nun</u></i>.
]]></string>
<string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Paga-ID integriĝis</string>
<string name="info_prepare_tx">Preparante vian transakcion</string>
@ -75,13 +72,13 @@
<string name="text_noretry_monero">Ni blokiĝis ĉi tie!</string>
<string name="text_noretry">Uh-oh, ŝajne SideShift.ai ne disponas momente!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(kurzo: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(kurzo: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Vizitu SideShift.ai por helpo kaj sekvado</string>
<string name="label_send_btc_xmrto_key_lb">Sekreta ŝlosilo\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai sekreta ŝlosilo</string>
<string name="label_send_btc_address">Ricevanta BTC-adreso</string>
<string name="label_send_btc_address">Ricevanta %1$s-adreso</string>
<string name="label_send_btc_amount">Kvanto</string>
<string name="label_send_txid">Transakcia ID</string>
@ -251,11 +248,9 @@
<string name="tx_id">TX ID</string>
<string name="tx_key">TX Ŝlosilo</string>
<string name="tx_destination">Destino</string>
<string name="tx_destination_btc">Destino\n(BTC)</string>
<string name="tx_paymentId">Paga-ID</string>
<string name="tx_blockheight">Bloko</string>
<string name="tx_amount">Kvanto</string>
<string name="tx_amount_btc">Kvanto\n(BTC)</string>
<string name="tx_fee">Kosto</string>
<string name="tx_transfers">Transigoj</string>
<string name="tx_notes">Notoj</string>
@ -356,11 +351,6 @@
<string name="send_address_hint">Ricevanto</string>
<string name="xmrto_error_001">SideShift.ai ne enretas - provu pli poste</string>
<string name="xmrto_error_004">BTC-kvanto tro grandas</string>
<string name="xmrto_error_010">La paga URL malvalidas aŭ ne ĝisdatiĝis</string>
<string name="xmrto_error_012">Tro da mendoj</string>
<string name="street_sweep_amount">ĈIO!</string>
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -383,8 +373,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -408,4 +398,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -218,23 +218,20 @@
<string name="fab_restore_key">Restaurar monedero con claves privadas</string>
<string name="fab_restore_seed">Restaurar monedero con semilla de 25 palabras</string>
<string name="info_xmrto"><![CDATA[
<b>Ingresaste una dirección Bitcoin</b><br/>
<i>Vas a enviar XMR y el destinatario recibirá BTC usando el servicio <b>SideShift.ai</b>.</i>
<b>Ingresaste una dirección %1$s</b><br/>
<i>Vas a enviar XMR y el destinatario recibirá %1$s usando el servicio <b>SideShift.ai</b>.</i>
]]></string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Confirmación pendiente</string>
<string name="info_send_xmrto_unpaid">Pago pendiente</string>
<string name="info_send_xmrto_error">Error de SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Enviados!</string>
<string name="info_send_xmrto_sent">%1$s Enviados!</string>
<string name="info_send_xmrto_query">Consultando &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Puedes enviar %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> está ofreciendo una tasa de cambio de <b>%3$s BTC</b> <u>en este momento</u></i>.
<b>Puedes enviar %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> está ofreciendo una tasa de cambio de <b>%3$s %4$s/XMR</b> <u>en este momento</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Montos hasta <b>%1$s BTC</b> serán enviados <u>en el momento</u>!</i>
]]></string>
<string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string>
<string name="label_send_progress_xmrto_create">Creando orden SideShift.ai</string>
<string name="label_send_progress_xmrto_query">Consultando orden SideShift.ai</string>
<string name="label_send_progress_create_tx">Preparando transacción Monero</string>
@ -244,12 +241,12 @@
<string name="text_retry">Toca para reintentar</string>
<string name="text_noretry_monero">Parece que estamos atascados!</string>
<string name="text_noretry">Oh-oh, parece que SideShift.ai no está disponible ahora!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Cambio: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Cambio: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Visita https://sideshift.ai para soporte y rastreo</string>
<string name="label_send_btc_xmrto_key_lb">Clave secreta\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">Clave secreta SideShift.ai</string>
<string name="label_send_btc_address">Dirección BTC destino</string>
<string name="label_send_btc_address">Dirección %1$s destino</string>
<string name="label_send_btc_amount">Monto</string>
<string name="send_xmrto_timeout">Oye, esperaste demasiado!</string>
<string name="label_copy_xmrtokey">Clave</string>
@ -261,8 +258,6 @@
<string name="send_total_btc_label">Total (XMR)</string>
<string name="send_amount">%1$s XMR</string>
<string name="send_fee">+%1$s Comisión</string>
<string name="tx_destination_btc">Destino\n(BTC)</string>
<string name="tx_amount_btc">Monto\n(BTC)</string>
<string name="about_whoami">Soy monerujo</string>
<string name="info_send_xmrto_success_order_label">Orden SideShift.ai</string>
@ -347,11 +342,6 @@
<!-- 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">SideShift.ai 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="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -374,8 +364,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -399,4 +389,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,29 +35,26 @@
<string name="info_ledger_enabled">Ledger\'i tugi sisse lülitatud, puuduta lisainfo saamiseks.</string>
<string name="info_xmrto"><![CDATA[
<b>Sa sisestasid Bitcoini aadressi.</b><br/>
<i>See tähendab, et sa saadad Monerosid ning kohale jõuavad Bitcoinid kasutades SideShift.ai teenust.</i>
<b>Sa sisestasid %1$s aadressi.</b><br/>
<i>See tähendab, et sa saadad Monerosid ning kohale jõuavad %1$s kasutades SideShift.ai teenust.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai tellimus</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Ootan kinnitust</string>
<string name="info_send_xmrto_unpaid">Ootan makset</string>
<string name="info_send_xmrto_error">SideShift.ai viga (%1$s)</string>
<string name="info_send_xmrto_sent">BTC saadetud!</string>
<string name="info_send_xmrto_sent">%1$s saadetud!</string>
<string name="info_send_xmrto_query">Küsin &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Sa saad saata %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> annab <u>hetkel</u> vahetuskursiks <b>%3$s BTC</b></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Kuni <b>%1$s BTC</b> saadetakse <u>viivitamatult</u>!</i>
<b>Sa saad saata %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> annab <u>hetkel</u> vahetuskursiks <b>%3$s %4$s/XMR</b></i>.
]]></string>
<string name="send_available_btc">Kontojääk: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Kontojääk: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Makse ID integreeritud</string>
<string name="info_prepare_tx">Valmistan ülekannet ette</string>
@ -75,13 +72,13 @@
<string name="text_noretry_monero">Nüüd jõudsime küll tupikusse!</string>
<string name="text_noretry">Oh ei, SideShift.ai ei ole hetkel saadaval!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Kurss: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Kurss: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Külasta SideShift.ai lisainfo saamiseks &amp; jälgin</string>
<string name="label_send_btc_xmrto_key_lb">Privaatvõti\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai privaatvõti</string>
<string name="label_send_btc_address">Sihtkoha Bitcoini aadress</string>
<string name="label_send_btc_address">Sihtkoha %1$s aadress</string>
<string name="label_send_btc_amount">Kogus</string>
<string name="label_send_txid">Ülekande ID</string>
@ -246,11 +243,9 @@
<string name="tx_id">Ülekande ID</string>
<string name="tx_key">Ülekande võti</string>
<string name="tx_destination">Sihtkoht</string>
<string name="tx_destination_btc">Sihtkoht\n(BTC)</string>
<string name="tx_paymentId">Makse ID</string>
<string name="tx_blockheight">Plokk</string>
<string name="tx_amount">Kogus</string>
<string name="tx_amount_btc">Kogus\n(BTC)</string>
<string name="tx_fee">Teenustasu</string>
<string name="tx_transfers">Ülekanded</string>
<string name="tx_notes">Kommentaarid</string>
@ -354,11 +349,6 @@
<!-- 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">SideShift.ai 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="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -381,8 +371,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -406,4 +396,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,30 +35,27 @@
<string name="info_ledger_enabled">Ledger activé, tapez pour plus d\'infos.</string>
<string name="info_xmrto"><![CDATA[
<b>Vous avez entré une adresse Bitcoin.</b><br/>
<i>Vous envoyez des XMR et le destinataire recevra des BTC via le service <b>SideShift.ai</b>.</i>
<b>Vous avez entré une adresse %1$s.</b><br/>
<i>Vous envoyez des XMR et le destinataire recevra des %1$s via le service <b>SideShift.ai</b>.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">Ordres SideShift.ai</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">En Attente de Confirmation</string>
<string name="info_send_xmrto_unpaid">En Attente de Paiement</string>
<string name="info_send_xmrto_error">Erreur SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Envoyé !</string>
<string name="info_send_xmrto_sent">%1$s Envoyé !</string>
<string name="info_send_xmrto_query">Interrogation &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Vous pouvez envoyer %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> vous donne un taux de change de <b>%3$s BTC</b> <u>actuellement</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Les montant n\'excédant pas <b>%1$s BTC</b> seront envoyés <u>immédiatement</u>!</i>
<b>Vous pouvez envoyer %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> vous donne un taux de change de <b>%3$s %4$s/XMR</b> <u>actuellement</u></i>.
]]></string>
<string name="send_available_btc">Solde : %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Solde : %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; ID de Paiement intégré</string>
<string name="info_prepare_tx">Préparation de votre transaction</string>
@ -76,13 +73,13 @@
<string name="text_noretry_monero">Maintenant on est coincé ici !</string>
<string name="text_noretry">Oh-oh, SideShift.ai n\'a pas l\'air disponible pour le moment !</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Taux : %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Taux : %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Visitez SideShift.ai pour l\'assistance &amp; le suivi</string>
<string name="label_send_btc_xmrto_key_lb">Clef Secrète\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">Clef Secrète SideShift.ai</string>
<string name="label_send_btc_address">Adresse BTC Destination</string>
<string name="label_send_btc_address">Adresse %1$s Destination</string>
<string name="label_send_btc_amount">Montant</string>
<string name="label_send_txid">ID de Transaction</string>
@ -248,11 +245,9 @@
<string name="tx_id">ID TX</string>
<string name="tx_key">Clef TX</string>
<string name="tx_destination">Destination</string>
<string name="tx_destination_btc">Destination\n(BTC)</string>
<string name="tx_paymentId">ID de Paiement</string>
<string name="tx_blockheight">Bloc</string>
<string name="tx_amount">Montant</string>
<string name="tx_amount_btc">Montant\n(BTC)</string>
<string name="tx_fee">Frais</string>
<string name="tx_transfers">Transferts</string>
<string name="tx_notes">Notes</string>
@ -360,11 +355,6 @@
<!-- 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">SideShift.ai hors ligne - réessayer ultérieurement</string>
<string name="xmrto_error_004">Montant BTC hors limites</string>
<string name="xmrto_error_010">URL de Paiement invalide ou périmée</string>
<string name="xmrto_error_012">Trop de requêtes</string>
<string name="street_sweep_amount">TOTALITÉ!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Convertir mnémonique Ledger</string>
@ -387,8 +377,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -412,4 +402,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,29 +35,26 @@
<string name="info_ledger_enabled">Ledger engedélyezve, koppints ide a részletekért</string>
<string name="info_xmrto"><![CDATA[
<b>Bitcoin-címet adtál meg.</b><br/>
<i>XMR-t fogsz küldeni, a fogadó pedig BTC-t fog kapni az <b>SideShift.ai</b> szolgáltatásán keresztül.</i>
<b>%1$s-címet adtál meg.</b><br/>
<i>XMR-t fogsz küldeni, a fogadó pedig %1$s-t fog kapni az <b>SideShift.ai</b> szolgáltatásán keresztül.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai megrendelés</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Megerősítés folyamatban</string>
<string name="info_send_xmrto_unpaid">Kifizetés folyamatban</string>
<string name="info_send_xmrto_error">SideShift.ai-hiba (%1$s)</string>
<string name="info_send_xmrto_sent">BTC elküldve!</string>
<string name="info_send_xmrto_sent">%1$s elküldve!</string>
<string name="info_send_xmrto_query">Lekérdezés&#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Elküldhetsz: %1$s &#8212; %2$s BTC</b>.<br/>
<i>Az <b>SideShift.ai</b> <u>aktuális</u> árfolyama: <b>%3$s BTC</b></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>A legfeljebb <b>%1$s BTC</b> nagyságú összegek <u>azonnal</u> elküldésre kerülnek!</i>
<b>Elküldhetsz: %1$s &#8212; %2$s %4$s</b>.<br/>
<i>Az <b>SideShift.ai</b> <u>aktuális</u> árfolyama: <b>%3$s %4$s/XMR</b></i>.
]]></string>
<string name="send_available_btc">Egyenleg: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Egyenleg: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Fizetési azonosító integrálva</string>
<string name="info_prepare_tx">Tranzakció előkészítése</string>
@ -75,13 +72,13 @@
<string name="text_noretry_monero">Itt most elakadtunk!</string>
<string name="text_noretry">Ajjaj! Úgy néz ki, az SideShift.ai most nem elérhető!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Arány: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Arány: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Segítségért és nyomonkövetésért látogass el az SideShift.ai weboldalra</string>
<string name="label_send_btc_xmrto_key_lb">Titkos kulcs\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai titkos kulcs</string>
<string name="label_send_btc_address">Kedvezményezett BTC-címe</string>
<string name="label_send_btc_address">Kedvezményezett %1$s-címe</string>
<string name="label_send_btc_amount">Mennyiség</string>
<string name="label_send_txid">Tranzakcióazonosító</string>
@ -245,11 +242,9 @@
<string name="tx_id">Tranzakcióazonosító</string>
<string name="tx_key">Tranzkaciós kulcs</string>
<string name="tx_destination">Cél</string>
<string name="tx_destination_btc">Cél\n(BTC)</string>
<string name="tx_paymentId">Fizetési azonosító</string>
<string name="tx_blockheight">Blokk</string>
<string name="tx_amount">Mennyiség</string>
<string name="tx_amount_btc">Mennyiség\n(BTC)</string>
<string name="tx_fee">Díj</string>
<string name="tx_transfers">Transzferek</string>
<string name="tx_notes">Közlemény</string>
@ -358,11 +353,6 @@
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">SideShift.ai 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="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -385,8 +375,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -410,4 +400,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,30 +35,27 @@
<string name="info_ledger_enabled">Ledger abilitato, tocca per maggiori informazioni.</string>
<string name="info_xmrto"><![CDATA[
<b>Hai inserito un indirizzo Bitcoin.</b><br/>
<i>Invierai XMR e il destinatario riceverà BTC tramite il servizio <b>SideShift.ai</b>.</i>
<b>Hai inserito un indirizzo %1$s.</b><br/>
<i>Invierai XMR e il destinatario riceverà %1$s tramite il servizio <b>SideShift.ai</b>.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">Ordine SideShift.ai</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">In attesa di conferma</string>
<string name="info_send_xmrto_unpaid">In attesa del pagamento</string>
<string name="info_send_xmrto_error">Errore SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Inviati!</string>
<string name="info_send_xmrto_sent">%1$s Inviati!</string>
<string name="info_send_xmrto_query">Richiedendo &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Puoi inviare %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> ti sta <u>attualmente</u> concedendo un tasso di cambio di <b>%3$s BTC</b></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Ammontare fino a <b>%1$s BTC</b> inviati <u>istantaneamente</u>!</i>
<b>Puoi inviare %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> ti sta <u>attualmente</u> concedendo un tasso di cambio di <b>%3$s %4$s/XMR</b></i>.
]]></string>
<string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; ID pagamento integrato</string>
<string name="info_prepare_tx">Preparando la tua transazione</string>
@ -76,13 +73,13 @@
<string name="text_noretry_monero">Ora siamo bloccati qui!!</string>
<string name="text_noretry">Oh Oh, SideShift.ai sembra non essere disponibile in questo momento!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Tasso: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Tasso: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Visita SideShift.ai per supporto e tracciamento</string>
<string name="label_send_btc_xmrto_key_lb">Chiave segreta\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">Chiave segreta SideShift.ai</string>
<string name="label_send_btc_address">Indirizzo BTC di destinazione</string>
<string name="label_send_btc_address">Indirizzo %1$s di destinazione</string>
<string name="label_send_btc_amount">Ammontare</string>
<string name="label_send_txid">ID Transazione</string>
@ -247,11 +244,9 @@
<string name="tx_id">ID TX</string>
<string name="tx_key">Chiave TX</string>
<string name="tx_destination">Destinazione</string>
<string name="tx_destination_btc">Destinazione\n(BTC)</string>
<string name="tx_paymentId">ID Pagamento</string>
<string name="tx_blockheight">Blocco</string>
<string name="tx_amount">Ammontare</string>
<string name="tx_amount_btc">Ammontare\n(BTC)</string>
<string name="tx_fee">Commissione</string>
<string name="tx_transfers">Trasferimenti</string>
<string name="tx_notes">Note</string>
@ -359,11 +354,6 @@
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Ricevente</string>
<string name="xmrto_error_001">SideShift.ai è offline - prova più tardi</string>
<string name="xmrto_error_004">Ammontare in BTC fuori dai limiti</string>
<string name="xmrto_error_010">URL di pagamento obsoleto o invalido</string>
<string name="xmrto_error_012">Troppe richieste</string>
<string name="street_sweep_amount">TUTTO!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Converti seed Ledger</string>
@ -386,8 +376,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -411,4 +401,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,29 +35,26 @@
<string name="info_ledger_enabled">レッジャーは有効化されています。詳細はタップしてください。</string>
<string name="info_xmrto"><![CDATA[
<b>あなたが入力したのはビットコインのアドレスです。</b><br/>
<i>あなたはXMRを送金し、受け手は SideShift.ai のサービスを利用してBTCを受取ります。</i>
<b>あなたが入力したのは%1$sのアドレスです。</b><br/>
<i>あなたはXMRを送金し、受け手は SideShift.ai のサービスを利用して%1$sを受取ります。</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai の注文</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">承認を待っています</string>
<string name="info_send_xmrto_unpaid">支払いを待っています</string>
<string name="info_send_xmrto_error">SideShift.ai のエラー (%1$s)</string>
<string name="info_send_xmrto_sent">BTCが送金されました!</string>
<string name="info_send_xmrto_sent">%1$sが送金されました!</string>
<string name="info_send_xmrto_query">問い合わせ中 &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>%1$s から %2$s BTC を送金することができます。</b><br/>
<i><b>SideShift.ai</b> での交換レートは<u>現在</u><b>%3$s BTC</b>です。</i>
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i><b>%1$s BTC</b> までの数量は <u>即時に</u>送金可能です!</i>
<b>%1$s から %2$s %4$s を送金することができます。</b><br/>
<i><b>SideShift.ai</b> での交換レートは<u>現在</u><b>%3$s %4$s/XMR</b>です。</i>
]]></string>
<string name="send_available_btc">残高: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">残高: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; ペイメントID組み込み済み</string>
<string name="info_prepare_tx">取引を準備しています</string>
@ -75,13 +72,13 @@
<string name="text_noretry_monero">私達はここで立ち往生のようです!</string>
<string name="text_noretry">あーあ、 SideShift.ai は現在利用不能のようです!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(レート: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(レート: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">サポートと追跡については SideShift.ai をご覧ください</string>
<string name="label_send_btc_xmrto_key_lb">シークレットキー\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai のシークレットキー</string>
<string name="label_send_btc_address">支払先の BTC アドレス</string>
<string name="label_send_btc_address">支払先の %1$s アドレス</string>
<string name="label_send_btc_amount">数量</string>
<string name="label_send_txid">取引ID</string>
@ -251,11 +248,9 @@
<string name="tx_id">取引ID</string>
<string name="tx_key">取引キー</string>
<string name="tx_destination">送金先</string>
<string name="tx_destination_btc">送金先\n(BTC)</string>
<string name="tx_paymentId">ペイメントID</string>
<string name="tx_blockheight">ブロック</string>
<string name="tx_amount">数量</string>
<string name="tx_amount_btc">数量\n(BTC)</string>
<string name="tx_fee">手数料</string>
<string name="tx_transfers">送金</string>
<string name="tx_notes">メモ</string>
@ -359,11 +354,6 @@
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">受け取り手</string>
<string name="xmrto_error_001">SideShift.aiはオフラインです。もう一度お試しください</string>
<string name="xmrto_error_004">BTCの金額は範囲外</string>
<string name="xmrto_error_010">ペイメントURLは不正古いです</string>
<string name="xmrto_error_012">リクエストは多すぎます</string>
<string name="street_sweep_amount">残高合計!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Ledgerシードを転換</string>
@ -386,8 +376,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -411,4 +401,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,28 +35,25 @@
<string name="info_ledger_enabled">Ledger tilgjengelig, trykk for mer info.</string>
<string name="info_xmrto"><![CDATA[
<b>Du skrev inn en Bitcoin addresse.</b><br/>
<i>Du vil sende XMR og mottakeren vil få BTC gjennom <b>SideShift.ai</b> tjenesten.</i>
<b>Du skrev inn en %1$s addresse.</b><br/>
<i>Du vil sende XMR og mottakeren vil få %1$s gjennom <b>SideShift.ai</b> tjenesten.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai Ordre</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Bekreftelse venter</string>
<string name="info_send_xmrto_unpaid">Betaling venter</string>
<string name="info_send_xmrto_error">SideShift.ai error (%1$s)</string>
<string name="info_send_xmrto_sent">BTC sendt!</string>
<string name="info_send_xmrto_sent">%1$s sendt!</string>
<string name="info_send_xmrto_query">Spør &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Du kan sende %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> gir deg en vekslingskurs på <b>%3$s BTC</b> <u>akkurat nå</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Mengder opp til <b>%1$s BTC</b> vil bli sendt <u>umiddelbart</u>!</i>
<b>Du kan sende %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> gir deg en vekslingskurs på <b>%3$s %4$s/XMR</b> <u>akkurat nå</u></i>.
]]></string>
<string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Betalings ID integrert</string>
<string name="info_prepare_tx">Forbereder din transaksjon</string>
@ -74,13 +71,13 @@
<string name="text_noretry_monero">Nå sitter vi fast her!</string>
<string name="text_noretry">Ops, det ser ikke ut til at SideShift.ai er tilgjengelig for øyeblikket!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Besøk SideShift.ai for støtte og sporing</string>
<string name="label_send_btc_xmrto_key_lb">Hemmelig nøkkel\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai Hemmelig nøkkel</string>
<string name="label_send_btc_address">BTC destinasjonsadresse</string>
<string name="label_send_btc_address">%1$s destinasjonsadresse</string>
<string name="label_send_btc_amount">Mengde</string>
<string name="label_send_txid">Transaksjons-ID</string>
@ -245,11 +242,9 @@
<string name="tx_id">TX ID</string>
<string name="tx_key">TX-nøkkel</string>
<string name="tx_destination">Destinasjon</string>
<string name="tx_destination_btc">Destinasjon\n(BTC)</string>
<string name="tx_paymentId">Betalings-ID</string>
<string name="tx_blockheight">Blokk</string>
<string name="tx_amount">Mengde</string>
<string name="tx_amount_btc">Mengde\n(BTC)</string>
<string name="tx_fee">Avgift</string>
<string name="tx_transfers">Overføringer</string>
<string name="tx_notes">Notater</string>
@ -356,11 +351,6 @@
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">SideShift.ai 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="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -383,8 +373,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -408,4 +398,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,29 +35,26 @@
<string name="info_ledger_enabled">Ledger ingeschakeld. Tik voor meer info.</string>
<string name="info_xmrto"><![CDATA[
<b>Je hebt een Bitcoin-adres ingevoerd.</b><br/>
<i>Je verzendt XMR en de ontvanger krijgt BTC via <b>SideShift.ai</b>.</i>
<b>Je hebt een %1$s-adres ingevoerd.</b><br/>
<i>Je verzendt XMR en de ontvanger krijgt %1$s via <b>SideShift.ai</b>.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai-opdracht</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Wacht op bevestiging</string>
<string name="info_send_xmrto_unpaid">Wacht op betaling</string>
<string name="info_send_xmrto_error">Fout bij SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC verzonden!</string>
<string name="info_send_xmrto_sent">%1$s verzonden!</string>
<string name="info_send_xmrto_query">Aanvragen…</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Je kunt %1$s &#8212; %2$s BTC verzenden</b>.<br/>
<i><b>SideShift.ai</b> biedt <u>nu</u> een wisselkoers van <b>%3$s BTC</b> aan</i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Bedragen tot <b>%1$s BTC</b> worden <u>meteen</u> verzonden!</i>
<b>Je kunt %1$s &#8212; %2$s %4$s verzenden</b>.<br/>
<i><b>SideShift.ai</b> biedt <u>nu</u> een wisselkoers van <b>%3$s %4$s/XMR</b> aan</i>.
]]></string>
<string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Betalings-ID geïntegreerd</string>
<string name="info_prepare_tx">Transactie wordt voorbereid</string>
@ -75,13 +72,13 @@
<string name="text_noretry_monero">Nu zitten we vast…</string>
<string name="text_noretry">Oeps, SideShift.ai is op dit moment niet beschikbaar.</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Koers: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Koers: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Ga naar SideShift.ai voor hulp en traceren</string>
<string name="label_send_btc_xmrto_key_lb">Geheime sleutel\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">Geheime sleutel SideShift.ai</string>
<string name="label_send_btc_address">BTC-doeladres</string>
<string name="label_send_btc_address">%1$s-doeladres</string>
<string name="label_send_btc_amount">Bedrag</string>
<string name="label_send_txid">Transactie-ID</string>
@ -242,11 +239,9 @@
<string name="tx_id">Transactie-ID</string>
<string name="tx_key">Transactiesleutel</string>
<string name="tx_destination">Bestemming</string>
<string name="tx_destination_btc">Bestemming\nBTC</string>
<string name="tx_paymentId">Betalings-ID</string>
<string name="tx_blockheight">Blok</string>
<string name="tx_amount">Bedrag</string>
<string name="tx_amount_btc">Bedrag\nBTC</string>
<string name="tx_fee">Vergoeding</string>
<string name="tx_transfers">Betalingen</string>
<string name="tx_notes">Opmerkingen</string>
@ -356,11 +351,6 @@
<!-- 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">SideShift.ai 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="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -383,8 +373,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -408,4 +398,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,29 +35,26 @@
<string name="info_ledger_enabled">Ledger ativada, toque para mais informações.</string>
<string name="info_xmrto"><![CDATA[
<b>Você colocou um endereço Bitcoin.</b><br/>
<i>Você enviará XMR e o destinatário receberá BTC via o serviço <b>SideShift.ai</b></i>
<b>Você colocou um endereço %1$s.</b><br/>
<i>Você enviará XMR e o destinatário receberá %1$s via o serviço <b>SideShift.ai</b></i>
]]></string>
<string name="info_send_xmrto_success_order_label">Ordem no SideShift.ai</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Confirmação Pendente</string>
<string name="info_send_xmrto_unpaid">Pagamento Pendente</string>
<string name="info_send_xmrto_error">Erro SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Enviado!</string>
<string name="info_send_xmrto_sent">%1$s Enviado!</string>
<string name="info_send_xmrto_query">Consultando &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Você pode enviar %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> enviou a cotação de <b>%3$s BTC</b> <u>neste momento</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Quantias até <b>%1$s BTC</b> serão enviadas <u>instantaneamente</u>!</i>
<b>Você pode enviar %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> enviou a cotação de <b>%3$s %4$s/XMR</b> <u>neste momento</u></i>.
]]></string>
<string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; ID do pagamento integrado</string>
<string name="info_prepare_tx">Preparando sua transação</string>
@ -75,13 +72,13 @@
<string name="text_noretry_monero">Opa, estamos travados aqui!</string>
<string name="text_noretry">Hm, parece que o SideShift.ai não está disponível no momento</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Cotação: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Cotação: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Visite o SideShift.ai para suporte &amp; rastreio da ordem</string>
<string name="label_send_btc_xmrto_key_lb">Chave secreta\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">Chave secreta SideShift.ai</string>
<string name="label_send_btc_address">Endereço BTC de destino</string>
<string name="label_send_btc_address">Endereço %1$s de destino</string>
<string name="label_send_btc_amount">Valor</string>
<string name="label_send_txid">ID da Transação</string>
@ -244,11 +241,9 @@
<string name="tx_id">ID TX</string>
<string name="tx_key">Chave TX</string>
<string name="tx_destination">Destino</string>
<string name="tx_destination_btc">Destino\n(BTC)</string>
<string name="tx_paymentId">ID do Pagamento</string>
<string name="tx_blockheight">Bloco</string>
<string name="tx_amount">Valor</string>
<string name="tx_amount_btc">Valor\n(BTC)</string>
<string name="tx_fee">Taxa</string>
<string name="tx_transfers">Transferências</string>
<string name="tx_notes">Notas</string>
@ -348,11 +343,6 @@
<string name="send_address_hint">Destinatário</string>
<string name="xmrto_error_001">SideShift.ai offline - tente novamente mais tarde</string>
<string name="xmrto_error_004">Valor BTC fora dos limites</string>
<string name="xmrto_error_010">URL de pagamento inválido</string>
<string name="xmrto_error_012">Solicitações em excesso</string>
<string name="street_sweep_amount">TUDO!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Converter semente da Ledger</string>
@ -375,8 +365,8 @@
<string name="onboarding_welcome_information">Esse aplicativo permite que você crie e use carteiras Monero. Você poderá guardar seus queridos moneroj aqui.</string>
<string name="onboarding_seed_title">Mantenha sua semente em segurança</string>
<string name="onboarding_seed_information">A semente dá acesso total a qualquer pessoa que a tenha. Se você perdê-la, nós não conseguiremos lhe ajudar a recuperá-la e você perderá seus amados moneroj.</string>
<string name="onboarding_xmrto_title">Enviar Bitcoin</string>
<string name="onboarding_xmrto_information">A Monerujo possui o SideShift.ai integrado. Basta colar ou escaner um endereço Bitcoin e você estará enviando BTC, mas gastando em XMR.</string>
<string name="onboarding_xmrto_title">Enviar Crypto</string>
<string name="onboarding_xmrto_information">A Monerujo possui o SideShift.ai integrado. Basta colar ou escaner um endereço BTC, LTC, ETH, DASH ou DOGE e você estará enviando cripto, mas gastando em XMR.</string>
<string name="onboarding_nodes_title">"Nós", do seu jeito</string>
<string name="onboarding_nodes_information">Os nós conectam você à rede Monero. Escolha entre nós públicos ou seja completamente "cypherpunk" e utilize seu próprio nó.</string>
<string name="onboarding_fpsend_title">Enviar usando a digital</string>
@ -400,4 +390,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,29 +35,26 @@
<string name="info_ledger_enabled">Ledger activa, toca para mais informação.</string>
<string name="info_xmrto"><![CDATA[
<b>Introduziu um endereço Bitcoin.</b><br/>
<i>Vai enviar em XMR e o destinatário vai receber BTC através do serviço <b>SideShift.ai</b></i>
<b>Introduziu um endereço %1$s.</b><br/>
<i>Vai enviar em XMR e o destinatário vai receber %1$s através do serviço <b>SideShift.ai</b></i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai Order</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Confirmação Pendente</string>
<string name="info_send_xmrto_unpaid">Pagamento Pendente</string>
<string name="info_send_xmrto_error">Erro SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Enviadas!</string>
<string name="info_send_xmrto_sent">%1$s Enviadas!</string>
<string name="info_send_xmrto_query">A comunicar &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Pode enviar %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> está com uma taxa de conversão de <b>%3$s BTC</b> <u>neste momento</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Quantidades até <b>%1$s BTC</b> serão enviadas <u>instantaneament</u>!</i>
<b>Pode enviar %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> está com uma taxa de conversão de <b>%3$s %4$s/XMR</b> <u>neste momento</u></i>.
]]></string>
<string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; ID do pagamento integrado</string>
<string name="info_prepare_tx">A preparar a transacção</string>
@ -75,13 +72,13 @@
<string name="text_noretry_monero">Agora estamos emperrados aqui!</string>
<string name="text_noretry">Ups, SideShift.ai não parece estar disponível neste momento!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Rácio: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Rácio: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Vai a SideShift.ai para suporte &amp; seguimento</string>
<string name="label_send_btc_xmrto_key_lb">Chave secreta\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai Chave secreta</string>
<string name="label_send_btc_address">Endereço BTC de destino</string>
<string name="label_send_btc_address">Endereço %1$s de destino</string>
<string name="label_send_btc_amount">Quantidade</string>
<string name="label_send_txid">ID da Transacção</string>
@ -244,11 +241,9 @@
<string name="tx_id">ID TX</string>
<string name="tx_key">Chave TX</string>
<string name="tx_destination">Destino</string>
<string name="tx_destination_btc">Destino\n(BTC)</string>
<string name="tx_paymentId">ID Pagamento</string>
<string name="tx_blockheight">Bloco</string>
<string name="tx_amount">Quantidade</string>
<string name="tx_amount_btc">Quantidade\n(BTC)</string>
<string name="tx_fee">Taxa</string>
<string name="tx_transfers">Transferências</string>
<string name="tx_notes">Notas</string>
@ -360,11 +355,6 @@
<string name="send_address_hint">Receptor</string>
<string name="xmrto_error_001">SideShift.ai offline - tenta mais tarde</string>
<string name="xmrto_error_004">Montante de BTC fora dos limites</string>
<string name="xmrto_error_010">URL de pagamento invalido ou fora de prazo</string>
<string name="xmrto_error_012">Demasiadas solicitações</string>
<string name="street_sweep_amount">A TOTALIDADE!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Converter semente do Ledger</string>
@ -387,8 +377,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -412,4 +402,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -34,29 +34,26 @@
<string name="info_ledger_enabled">Ledger activată, apasă pentru mai multe informații.</string>
<string name="info_xmrto"><![CDATA[
<b>Ai introdus o adresă de Bitcoin.</b><br/>
<i>Vei trimite XMR și destinatarul va primi BTC folosind serviciul <b>SideShift.ai</b>.</i>
<b>Ai introdus o adresă de %1$s.</b><br/>
<i>Vei trimite XMR și destinatarul va primi %1$s folosind serviciul <b>SideShift.ai</b>.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">Ordin SideShift.ai</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Confirmare în așteptare</string>
<string name="info_send_xmrto_unpaid">Plată în așteptare</string>
<string name="info_send_xmrto_error">Eroare SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC trimis!</string>
<string name="info_send_xmrto_sent">%1$s trimis!</string>
<string name="info_send_xmrto_query">Interogare &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Poți trimite %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> îți oferă un curs de <b>%3$s BTC</b> <u>în acest moment</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Sume până la <b>%1$s BTC</b> vor fi trimise <u>instantaneu</u>!</i>
<b>Poți trimite %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> îți oferă un curs de <b>%3$s %4$s/XMR</b> <u>în acest moment</u></i>.
]]></string>
<string name="send_available_btc">Balanță: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Balanță: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Payment ID integrat</string>
<string name="info_prepare_tx">Se pregătește tranzacția</string>
@ -74,13 +71,13 @@
<string name="text_noretry_monero">Pff.. ne-am blocat cum!</string>
<string name="text_noretry">Oh, serviciul SideShift.ai este momentan indisponibil!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Rată: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Rată: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Vizitează SideShift.ai pentru suport &amp; interogare</string>
<string name="label_send_btc_xmrto_key_lb">Cheia secretă \nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">Cheia secretă SideShift.ai </string>
<string name="label_send_btc_address">Destinație adresă BTC</string>
<string name="label_send_btc_address">Destinație adresă %1$s</string>
<string name="label_send_btc_amount">Sumă</string>
<string name="label_send_txid">ID Tranzacție </string>
@ -220,11 +217,9 @@
<string name="tx_id">ID Tranzacție</string>
<string name="tx_key">Cheie tranzacție</string>
<string name="tx_destination">Destinație</string>
<string name="tx_destination_btc">Destinație\n(BTC)</string>
<string name="tx_paymentId">Payment ID</string>
<string name="tx_blockheight">Monobloc</string>
<string name="tx_amount">Sumă</string>
<string name="tx_amount_btc">Sumă\n(BTC)</string>
<string name="tx_fee">Comision</string>
<string name="tx_transfers">Transferuri</string>
<string name="tx_notes">Notițe</string>
@ -356,11 +351,6 @@
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">SideShift.ai 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="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -383,8 +373,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -408,4 +398,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,30 +35,27 @@
<string name="info_ledger_enabled">Доступен Ledger, нажмите для доп. информации</string>
<string name="info_xmrto"><![CDATA[
<b>Вы ввели Bitcoin адрес.</b><br/>
<i>Отправляйте XMR, получатель получит BTC, используя сервис SideShift.ai</i>
<b>Вы ввели %1$s адрес.</b><br/>
<i>Отправляйте XMR, получатель получит %1$s, используя сервис SideShift.ai</i>
]]></string>
<string name="info_send_xmrto_success_order_label">Заказ SideShift.ai</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Ожидание подтверждения</string>
<string name="info_send_xmrto_unpaid">Ожидание платежа</string>
<string name="info_send_xmrto_error">Ошибка SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC успешно отправлены!</string>
<string name="info_send_xmrto_sent">%1$s успешно отправлены!</string>
<string name="info_send_xmrto_query">Запрос &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Вы можете отправить %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> устанавливает курс обмена <b>%3$s BTC</b> <u>в данный момент</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Сумма до <b>%1$s BTC</b> будет отправлена <u>немедленно</u>!</i>
<b>Вы можете отправить %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> устанавливает курс обмена <b>%3$s %4$s/XMR</b> <u>в данный момент</u></i>.
]]></string>
<string name="send_available_btc">Баланс: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Баланс: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Интегрированный ID платежа</string>
<string name="info_prepare_tx">Подготовка транзакции</string>
@ -76,13 +73,13 @@
<string name="text_noretry_monero">Теперь мы застряли здесь!</string>
<string name="text_noretry">Ой-ой! Кажется SideShift.ai недоступен в данный момент!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Курс: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Курс: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Посетите SideShift.ai для получения помощи &amp;</string>
<string name="label_send_btc_xmrto_key_lb">Секретный ключ\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai секретный ключ</string>
<string name="label_send_btc_address">Адрес получателя BTC</string>
<string name="label_send_btc_address">Адрес получателя %1$s</string>
<string name="label_send_btc_amount">Сумма</string>
<string name="label_send_txid">ID транзакции</string>
@ -246,11 +243,9 @@
<string name="tx_id">TX ID</string>
<string name="tx_key">Ключ TX</string>
<string name="tx_destination">Адресат</string>
<string name="tx_destination_btc">Адресат\n(BTC)</string>
<string name="tx_paymentId">ID платежа</string>
<string name="tx_blockheight">Блок</string>
<string name="tx_amount">Сумма</string>
<string name="tx_amount_btc">Сумма\n(BTC)</string>
<string name="tx_fee">Комиссия</string>
<string name="tx_transfers">Переводы</string>
<string name="tx_notes">Заметки</string>
@ -360,11 +355,6 @@
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Получатель</string>
<string name="xmrto_error_001">SideShift.ai недоступен - повторите попытку позже</string>
<string name="xmrto_error_004">Сумма BTC выходит за доступные пределы</string>
<string name="xmrto_error_010">Неверный или устаревший платежный URL</string>
<string name="xmrto_error_012">Превышен лимит запросов</string>
<string name="street_sweep_amount">ВСЕ!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Преобразовать фразу Ledger</string>
@ -387,8 +377,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -412,4 +402,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,30 +35,27 @@
<string name="info_ledger_enabled">Ledger aktivovaný, klepni pre viac info.</string>
<string name="info_xmrto"><![CDATA[
<b>Vložil si Bitcoin adresu.</b><br/>
<i>Pošleš XMR a adresát dostane BTC cez službu <b>SideShift.ai</b>.</i>
<b>Vložil si %1$s adresu.</b><br/>
<i>Pošleš XMR a adresát dostane %1$s cez službu <b>SideShift.ai</b>.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai Objednávka</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Čaká na Potvrdenie</string>
<string name="info_send_xmrto_unpaid">Čakajúca Platba</string>
<string name="info_send_xmrto_error">SideShift.ai Chyba (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Odoslané!</string>
<string name="info_send_xmrto_sent">%1$s Odoslané!</string>
<string name="info_send_xmrto_query">Zisťujem &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Môžeš poslať %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> ti dáva výmenný kurz of <b>%3$s BTC</b> <u>práve teraz</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>čiastka do <b>%1$s BTC</b> bude odoslaná <u>okamžite</u>!</i>
<b>Môžeš poslať %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> ti dáva výmenný kurz of <b>%3$s %4$s/XMR</b> <u>práve teraz</u></i>.
]]></string>
<string name="send_available_btc">Zostatok: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Zostatok: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Payment ID integrované</string>
<string name="info_prepare_tx">Pripravujem transakciu</string>
@ -76,13 +73,13 @@
<string name="text_noretry_monero">Uviazli sme tu!</string>
<string name="text_noretry">Myslím, že služba SideShift.ai nie je momentálne dostupná!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Kurz: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Kurz: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Navštív SideShift.ai pre podporu &amp; tracking</string>
<string name="label_send_btc_xmrto_key_lb">Tajný kľúč\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai Tajný kľúč</string>
<string name="label_send_btc_address">Cieľová BTC Adresa</string>
<string name="label_send_btc_address">Cieľová %1$s Adresa</string>
<string name="label_send_btc_amount">Čiastka</string>
<string name="label_send_txid">ID Transakcie</string>
@ -243,11 +240,9 @@
<string name="tx_id">TX ID</string>
<string name="tx_key">Kľúč Transakcie</string>
<string name="tx_destination">Cieľ</string>
<string name="tx_destination_btc">Cieľová (BTC)</string>
<string name="tx_paymentId">ID Platby</string>
<string name="tx_blockheight">Blok</string>
<string name="tx_amount">Suma</string>
<string name="tx_amount_btc">Čiastka\n(BTC)</string>
<string name="tx_fee">poplatok</string>
<string name="tx_transfers">Poslaných</string>
<string name="tx_notes">Poznámky</string>
@ -357,11 +352,6 @@
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Príjemca</string>
<string name="xmrto_error_001">SideShift.ai je offline - skús neskôr</string>
<string name="xmrto_error_004">Množstvo BTC je mimo rámca</string>
<string name="xmrto_error_010">Neplatná alebo stará URL platby</string>
<string name="xmrto_error_012">Príliš veľa požiadaviek</string>
<string name="street_sweep_amount">VŠETKO!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Konvertuj Ledger Seed</string>
@ -384,8 +374,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -409,4 +399,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,29 +35,26 @@
<string name="info_ledger_enabled">Knjiga računa omogućena, tapni za više info.</string>
<string name="info_xmrto"><![CDATA[
<b>Ubacio/la si Bitkoin adresu.</b><br/>
<i>You&apos;će poslati XMR a primalac će dobiti BTC koristeći <b>SideShift.ai</b> servis.</i>
<b>Ubacio/la si %1$s adresu.</b><br/>
<i>You&apos;će poslati XMR a primalac će dobiti %1$s koristeći <b>SideShift.ai</b> servis.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai Nalog</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Potvrda u toku</string>
<string name="info_send_xmrto_unpaid">Plaćanje u toku</string>
<string name="info_send_xmrto_error">SideShift.ai Greška (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Poslato!</string>
<string name="info_send_xmrto_sent">%1$s Poslato!</string>
<string name="info_send_xmrto_query">Ispitivanje &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Možeš poslati %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> daje ti devizni kurs od <b>%3$s BTC</b> <u>trenutno</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Sume do <b>%1$s BTC</b> biće poslate <u>instantly</u>!</i>
<b>Možeš poslati %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> daje ti devizni kurs od <b>%3$s %4$s/XMR</b> <u>trenutno</u></i>.
]]></string>
<string name="send_available_btc">Stanje: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Stanje: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; ID plaćanja integrisan</string>
<string name="info_prepare_tx">Priprema tvoje transakcije</string>
@ -75,13 +72,13 @@
<string name="text_noretry_monero">Sada se zaglavismo!</string>
<string name="text_noretry">Uh, SideShift.ai izgleda da sad nije dostupan!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Poseti SideShift.ai za bekap &amp; praćenje</string>
<string name="label_send_btc_xmrto_key_lb">Tajna šifra\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai Tajna šifra</string>
<string name="label_send_btc_address">Odredište BTC adrese</string>
<string name="label_send_btc_address">Odredište %1$s adrese</string>
<string name="label_send_btc_amount">Suma</string>
<string name="label_send_txid">ID transakcije</string>
@ -252,11 +249,9 @@
<string name="tx_id">TX ID</string>
<string name="tx_key">TX šifra</string>
<string name="tx_destination">Odredište</string>
<string name="tx_destination_btc">Odredište\n(BTC)</string>
<string name="tx_paymentId">ID plaćanja</string>
<string name="tx_blockheight">Blok</string>
<string name="tx_amount">Suma</string>
<string name="tx_amount_btc">Suma\n(BTC)</string>
<string name="tx_fee">Naknada</string>
<string name="tx_transfers">Transferi</string>
<string name="tx_notes">Čvorovi</string>
@ -355,11 +350,6 @@
<string name="send_address_hint">Primalac</string>
<string name="xmrto_error_001">SideShift.ai van mreže - pokušajte kasnije ponovo</string>
<string name="xmrto_error_004">BTC iznos izvan granica</string>
<string name="xmrto_error_010">Nevalidan ili neažuriran URL plaćanja</string>
<string name="xmrto_error_012">Previše zahteva</string>
<string name="street_sweep_amount">SVE!</string>
<string name="menu_ledger_seed">Pretvori seme iz knjige računa</string>
@ -382,8 +372,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -407,4 +397,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -34,22 +34,27 @@
<string name="info_xmrto_enabled">BTC-betalning aktiverad, tryck för mer info.</string>
<string name="info_ledger_enabled">Ledger aktiverat, tryck för mer info.</string>
<string name="info_xmrto"><![CDATA[<b>Du har angivit en Bitcoin-adress.</b><br/> <i>Du kommer att skicka XMR och mottagaren får BTC via tjänsten <b>SideShift.ai</b>.</i>]]></string>
<string name="info_xmrto"><![CDATA[
<b>Du har angivit en %1$s-adress.</b><br/>
<i>Du kommer att skicka XMR och mottagaren får %1$s via tjänsten <b>SideShift.ai</b>.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai-beställning</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Väntar på bekräftelse</string>
<string name="info_send_xmrto_unpaid">Väntar på betalning</string>
<string name="info_send_xmrto_error">SideShift.ai-fel (%1$s)</string>
<string name="info_send_xmrto_sent">BTC skickades!</string>
<string name="info_send_xmrto_sent">%1$s skickades!</string>
<string name="info_send_xmrto_query">Frågar …</string>
<string name="info_send_xmrto_parms"><![CDATA[<b>Du kan skicka %1$s &#8212; %2$s BTC</b>.<br/> <i><b>SideShift.ai</b> ger dig <u>just nu</u> en växelkurs på <b>%3$s BTC</b></i>.]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[<i>Belopp upp till <b>%1$s BTC</b> skickas <u>omedelbart</u>!</i>]]></string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Du kan skicka %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> ger dig <u>just nu</u> en växelkurs på <b>%3$s %4$s/XMR</b></i>.
]]></string>
<string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Betalnings-ID integrerat</string>
<string name="info_prepare_tx">Förbereder din transaktion</string>
@ -67,13 +72,13 @@
<string name="text_noretry_monero">Nu har vi kört fast!</string>
<string name="text_noretry">Åh nej, SideShift.ai verkar inte vara tillgänglig just nu!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Kurs: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Kurs: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Besök SideShift.ai för support &amp; spårning</string>
<string name="label_send_btc_xmrto_key_lb">Hemlig nyckel\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai hemlig nyckel</string>
<string name="label_send_btc_address">Måladress för BTC</string>
<string name="label_send_btc_address">Måladress för %1$s</string>
<string name="label_send_btc_amount">Belopp</string>
<string name="label_send_txid">Transaktions-ID</string>
@ -225,11 +230,9 @@
<string name="tx_id">TX-ID</string>
<string name="tx_key">TX-nyckel</string>
<string name="tx_destination">Mål</string>
<string name="tx_destination_btc">Mål\n(BTC)</string>
<string name="tx_paymentId">Betalnings-ID</string>
<string name="tx_blockheight">Block</string>
<string name="tx_amount">Belopp</string>
<string name="tx_amount_btc">Belopp\n(BTC)</string>
<string name="tx_fee">Avgift</string>
<string name="tx_transfers">Överföringar</string>
<string name="tx_notes">Anteckningar</string>
@ -340,11 +343,6 @@
<!-- 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">SideShift.ai 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="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -367,8 +365,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -392,4 +390,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,30 +35,27 @@
<string name="info_ledger_enabled">Доступний Ledger, натисніть для доп. інформації</string>
<string name="info_xmrto"><![CDATA[
<b>Ви ввели Bitcoin адресу.</b><br/>
<i>Надсилайте XMR, одержувач отримає BTC, використовуючи сервіс SideShift.ai</i>
<b>Ви ввели %1$s адресу.</b><br/>
<i>Надсилайте XMR, одержувач отримає %1$s, використовуючи сервіс SideShift.ai</i>
]]></string>
<string name="info_send_xmrto_success_order_label">Заявка SideShift.ai</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Очікування підтвердження</string>
<string name="info_send_xmrto_unpaid">Очікування платежу</string>
<string name="info_send_xmrto_error">Помилка SideShift.ai (%1$s)</string>
<string name="info_send_xmrto_sent">BTC успішно відправлені!</string>
<string name="info_send_xmrto_sent">%1$s успішно відправлені!</string>
<string name="info_send_xmrto_query">Запит &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>Ви можете відправити %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> встановлює курс обміну <b>%3$s BTC</b> <u>в даний момент</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Сума до <b>%1$s BTC</b> буде відправлена <u>негайно</u>!</i>
<b>Ви можете відправити %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> встановлює курс обміну <b>%3$s %4$s/XMR</b> <u>в даний момент</u></i>.
]]></string>
<string name="send_available_btc">Баланс: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Баланс: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Інтегрований ID платежу</string>
<string name="info_prepare_tx">Підготовка транзакції</string>
@ -76,13 +73,13 @@
<string name="text_noretry_monero">Тепер ми застрягли тут!</string>
<string name="text_noretry">Ой ой! Здається SideShift.ai недоступний в даний момент!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Курс: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Курс: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Відвідайте SideShift.ai для отримання допомоги &amp;</string>
<string name="label_send_btc_xmrto_key_lb">Секретний ключ\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai секретний ключ</string>
<string name="label_send_btc_address">Адреса отримувача BTC</string>
<string name="label_send_btc_address">Адреса отримувача %1$s</string>
<string name="label_send_btc_amount">Сума</string>
<string name="label_send_txid">ID транзакції</string>
@ -246,11 +243,9 @@
<string name="tx_id">TX ID</string>
<string name="tx_key">Ключ TX</string>
<string name="tx_destination">Адресат</string>
<string name="tx_destination_btc">Адресат\n(BTC)</string>
<string name="tx_paymentId">ID платежу</string>
<string name="tx_blockheight">Блок</string>
<string name="tx_amount">Сума</string>
<string name="tx_amount_btc">Сума\n(BTC)</string>
<string name="tx_fee">Комісія</string>
<string name="tx_transfers">Перекази</string>
<string name="tx_notes">Замітки</string>
@ -360,11 +355,6 @@
<!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" -->
<string name="send_address_hint">Отримувач</string>
<string name="xmrto_error_001">SideShift.ai недоступний - спробуйте пізніше</string>
<string name="xmrto_error_004">Сума BTC виходить за допустимі ліміти</string>
<string name="xmrto_error_010">Невірний або застарілий платіжний URL</string>
<string name="xmrto_error_012">Перевищено кількість запитів</string>
<string name="street_sweep_amount">ВСЕ!</string> <!-- as in: "everything in the account" = "all the money" -->
<string name="menu_ledger_seed">Конвертувати фразу Ledger</string>
@ -387,8 +377,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -412,4 +402,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -27,24 +27,21 @@
<string name="info_xmrto_enabled">已支持比特币支付,点此了解更多</string>
<string name="info_ledger_enabled">已支持Ledger硬件钱包点此了解更多</string>
<string name="info_xmrto"><![CDATA[
<b>您输入了一个比特币地址</b><br/>
<i>您发送的门罗币将通过<b>SideShift.ai</b>服务,转换为比特币发送给对方。</i>
]]></string>
<b>您输入了一个%1$s地址</b><br/>
<i>您发送的门罗币将通过<b>SideShift.ai</b>服务,转换为%1$s发送给对方。</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai订单</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">等待确认中</string>
<string name="info_send_xmrto_unpaid">等待支付中</string>
<string name="info_send_xmrto_error">SideShift.ai错误(%1$s)</string>
<string name="info_send_xmrto_sent">成功发送比特币</string>
<string name="info_send_xmrto_sent">成功发送%1$s</string>
<string name="info_send_xmrto_query">查询中&#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>您可以发送%1$s &#8212; %2$s BTC</b>.<br/>
<i><u>此刻</u><b>SideShift.ai</b>的汇率是<b>%3$s BTC</b> </i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>至多<b>%1$s BTC</b>将会<u>即刻</u>发送!</i>
]]></string>
<string name="send_available_btc">余额: %2$s BTC (%1$s XMR)</string>
<b>您可以发送%1$s &#8212; %2$s %4$s</b>.<br/>
<i><u>此刻</u><b>SideShift.ai</b>的汇率是<b>%3$s %4$s/XMR</b> </i>.
]]></string>
<string name="send_available_btc">余额: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; 支付ID已集成</string>
<string name="info_prepare_tx">正在为您的交易做准备工作</string>
<string name="label_send_progress_xmrto_create">创建SideShift.ai订单</string>
@ -56,12 +53,12 @@
<string name="text_retry">再次尝试</string>
<string name="text_noretry_monero">我们遇到了困难!</string>
<string name="text_noretry">抱歉, SideShift.ai服务现在似乎不可用</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">访问SideShift.ai以获得更多支持</string>
<string name="label_send_btc_xmrto_key_lb">密钥\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai密钥</string>
<string name="label_send_btc_address">比特币收款地址</string>
<string name="label_send_btc_address">%1$s收款地址</string>
<string name="label_send_btc_amount">金额</string>
<string name="label_send_txid">交易ID</string>
<string name="label_send_address">收款地址</string>
@ -196,11 +193,9 @@
<string name="tx_id">交易ID</string>
<string name="tx_key">交易密钥</string>
<string name="tx_destination">目标地址</string>
<string name="tx_destination_btc">目标地址\n(BTC)</string>
<string name="tx_paymentId">支付ID</string>
<string name="tx_blockheight">区块</string>
<string name="tx_amount">金额</string>
<string name="tx_amount_btc">金额\n(BTC)</string>
<string name="tx_fee">手续费</string>
<string name="tx_transfers">转账</string>
<string name="tx_notes">备注</string>
@ -281,10 +276,6 @@
<string name="node_nobookmark">已自动将最佳%1$d节点加入书签</string>
<string name="label_test">测试</string><!--note: as in "Test a network connection"-->
<string name="send_address_hint">收款人</string>
<string name="xmrto_error_001">SideShift.ai离线-请稍后重试</string>
<string name="xmrto_error_004">比特币金额超出限制</string>
<string name="xmrto_error_010">无效或过期的支付URL</string>
<string name="xmrto_error_012">当前请求数过多</string>
<string name="street_sweep_amount">全部资产!</string>
<string name="menu_ledger_seed">转换Ledger种子密语</string>
<string name="prompt_ledger_seed">Ledger种子密语</string>
@ -306,8 +297,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -331,4 +322,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -35,30 +35,27 @@
<string name="info_ledger_enabled">Ledger 已啟用,點選了解更多</string>
<string name="info_xmrto"><![CDATA[
<b>你輸入了 Bitcoin 地址</b><br/>
<i>你將會發送 XMR 而收款方將會收到 BTC (由 <b>SideShift.ai</b> 提供轉換)</i>
<b>你輸入了 %1$s 地址</b><br/>
<i>你將會發送 XMR 而收款方將會收到 %1$s (由 <b>SideShift.ai</b> 提供轉換)</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai 訂單</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">等待確認中</string>
<string name="info_send_xmrto_unpaid">等待付款中</string>
<string name="info_send_xmrto_error">SideShift.ai 發生錯誤 (%1$s)</string>
<string name="info_send_xmrto_sent">BTC 已發送!</string>
<string name="info_send_xmrto_sent">%1$s 已發送!</string>
<string name="info_send_xmrto_query">查詢中 &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>你可發送 %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> 提供的<u>即時</u>匯率為 <b>%3$s BTC</b></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>金額少於 <b>%1$s BTC</b> ,將會<u>馬上</u>發送!</i>
<b>你可發送 %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> 提供的<u>即時</u>匯率為 <b>%3$s %4$s/XMR</b></i>.
]]></string>
<string name="send_available_btc">餘額:%2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">餘額:%2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; 已加入付款 ID</string>
<string name="info_prepare_tx">正在準備你的交易</string>
@ -76,13 +73,13 @@
<string name="text_noretry_monero">我們卡住了!</string>
<string name="text_noretry">不好SideShift.ai 現在似乎無法提供服務!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(匯率:%1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(匯率:%1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">參訪 SideShift.ai 以獲得支援及追蹤交易</string>
<string name="label_send_btc_xmrto_key_lb">私鑰\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai 私鑰</string>
<string name="label_send_btc_address">目的地 BTC 地址</string>
<string name="label_send_btc_address">目的地 %1$s 地址</string>
<string name="label_send_btc_amount">金額</string>
<string name="label_send_txid">交易 ID</string>
@ -244,11 +241,9 @@
<string name="tx_id">交易 ID (TXID)</string>
<string name="tx_key">交易金鑰 (TX Key)</string>
<string name="tx_destination">收款地址</string>
<string name="tx_destination_btc">收款地址\n(BTC)</string>
<string name="tx_paymentId">付款 ID</string>
<string name="tx_blockheight">區塊</string>
<string name="tx_amount">金額</string>
<string name="tx_amount_btc">金額\n(BTC)</string>
<string name="tx_fee">手續費</string>
<string name="tx_transfers">轉帳</string>
<string name="tx_notes">附註</string>
@ -355,11 +350,6 @@
<string name="send_address_hint">收款者</string>
<string name="xmrto_error_001">SideShift.ai 無法使用 - 請稍候再試</string>
<string name="xmrto_error_004">BTC 金額超出限制</string>
<string name="xmrto_error_010">無效或過期的付款網址</string>
<string name="xmrto_error_012">請求過於頻繁</string>
<string name="street_sweep_amount">全部!</string>
<string name="menu_ledger_seed">轉換 Ledger 種子碼</string>
@ -382,8 +372,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -407,4 +397,18 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
</resources>

View File

@ -32,33 +32,30 @@
<string name="label_receive_info_gen_qr_code">Touch for QR Code</string>
<string name="info_xmrto_enabled">BTC payment enabled, tap for more info.</string>
<string name="info_xmrto_enabled">Non-XMR payments enabled, tap for more info.</string>
<string name="info_ledger_enabled">Ledger enabled, tap for more info.</string>
<string name="info_xmrto"><![CDATA[
<b>You entered a Bitcoin address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get BTC using the <b>SideShift.ai</b> service.</i>
<b>You entered a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %1$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_send_xmrto_success_order_label">SideShift.ai Order</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_success_btc">%1$s %2$s</string>
<string name="info_send_xmrto_paid">Confirmation Pending</string>
<string name="info_send_xmrto_unpaid">Payment Pending</string>
<string name="info_send_xmrto_error">SideShift.ai Error (%1$s)</string>
<string name="info_send_xmrto_sent">BTC Sent!</string>
<string name="info_send_xmrto_sent">%1$s Sent!</string>
<string name="info_send_xmrto_query">Querying &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>You can send %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>SideShift.ai</b> is giving you an exchange rate of <b>%3$s BTC</b> <u>right now</u></i>.
]]></string>
<string name="info_send_xmrto_zeroconf"><![CDATA[
<i>Amounts up to <b>%1$s BTC</b> will be sent <u>instantly</u>!</i>
<b>You can send %1$s &#8212; %2$s %4$s</b>.<br/>
<i><b>SideShift.ai</b> is giving you an exchange rate of <b>%3$s %4$s/XMR</b> <u>right now</u></i>.
]]></string>
<string name="send_available_btc">Balance: %2$s BTC (%1$s XMR)</string>
<string name="send_available_btc">Balance: %2$s %3$s (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; Payment ID integrated</string>
<string name="info_prepare_tx">Preparing your transaction</string>
@ -76,13 +73,13 @@
<string name="text_noretry_monero">Now we\'re stuck here!</string>
<string name="text_noretry">Uh-oh, SideShift.ai does not seem be available right now!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string>
<string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string>
<string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string>
<string name="label_send_btc_xmrto_info">Visit SideShift.ai for support &amp; tracking</string>
<string name="label_send_btc_xmrto_key_lb">Secret Key\nSideShift.ai</string>
<string name="label_send_btc_xmrto_key">SideShift.ai Secret Key</string>
<string name="label_send_btc_address">Destination BTC Address</string>
<string name="label_send_btc_address">Destination %1$s Address</string>
<string name="label_send_btc_amount">Amount</string>
<string name="label_send_txid">Transaction ID</string>
@ -256,11 +253,9 @@
<string name="tx_id">TX ID</string>
<string name="tx_key">TX Key</string>
<string name="tx_destination">Destination</string>
<string name="tx_destination_btc">Destination\n(BTC)</string>
<string name="tx_paymentId">Payment ID</string>
<string name="tx_blockheight">Block</string>
<string name="tx_amount">Amount</string>
<string name="tx_amount_btc">Amount\n(BTC)</string>
<string name="tx_fee">Fee</string>
<string name="tx_transfers">Transfers</string>
<string name="tx_notes">Notes</string>
@ -403,13 +398,6 @@
<string name="send_address_hint">Receiver</string>
<string name="xmrto_error_001">SideShift.ai 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">SideShift.ai Service Error</string>
<string name="street_sweep_amount">EVERYTHING!</string>
<string name="menu_ledger_seed">Convert Ledger Seed</string>
@ -434,8 +422,8 @@
<string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string>
<string name="onboarding_seed_title">Keep your seed safe</string>
<string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string>
<string name="onboarding_xmrto_title">Send Bitcoin</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string>
<string name="onboarding_xmrto_title">Send Crypto</string>
<string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string>
<string name="onboarding_nodes_title">Nodes, your way</string>
<string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string>
<string name="onboarding_fpsend_title">Send with fingerprint</string>
@ -459,4 +447,28 @@
<string name="shift_noquote">Cannot get quote</string>
<string name="shift_checkamount">Check amount and try again</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>Ambiguous address.</b><br/>
<i>Please select the type above.</i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>Please enter or scan a %1$s address.</b><br/>
<i>You&apos;ll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>Please enter or scan a Monero address.</b>
]]></string>
<!-- order must be the same as in com.m2049r.xmrwallet.data.Crypto-->
<string-array name="cryptos" translatable="false">
<item>Monero</item>
<item>Bitcoin</item>
<item>Dash</item>
<item>Dogecoin</item>
<item>Ethereum</item>
<item>Litecoin</item>
</string-array>
</resources>

View File

@ -95,6 +95,11 @@
<!--item name="android:textColor">@color/gradientOrange</item-->
</style>
<style name="MoneroText.Balance.Orange.Smaller">
<item name="android:textSize">24sp</item>
</style>
<style name="MoneroText.Unconfirmed">
<item name="android:textSize">14sp</item>
<!--item name="android:textColor">@color/moneroGray</item-->

View File

@ -1,92 +0,0 @@
/*
* Copyright (c) 2017 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.
*/
package com.m2049r.xmrwallet.util;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class BitcoinAddressValidatorTest {
@Test
public void validateBTC_shouldValidate() {
assertTrue(BitcoinAddressValidator.validate("2NBMEXXS4v8ubajzfQUjYvh2ptLkxzH8uTC", true));
assertTrue(BitcoinAddressValidator.validate("2N9fzq66uZYQXp7uqrPBH6jKBhjrgTzpGCy", true));
assertTrue(BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", false));
assertTrue(BitcoinAddressValidator.validate("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", false));
assertTrue(BitcoinAddressValidator.validate("3R2MPpTNQLCNs13qnHz89Rm82jQ27bAwft", false));
assertTrue(BitcoinAddressValidator.validate("34QjytsE8GVRbUBvYNheftqJ5CHfDHvQRD", false));
assertTrue(BitcoinAddressValidator.validate("3GsAUrD4dnCqtaTTUzzsQWoymHNkEFrgGF", false));
assertTrue(BitcoinAddressValidator.validate("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU", false));
assertTrue(BitcoinAddressValidator.validate("mjn127C5wRQCULksMYMFHLp9UTdQuCfbZ9", true));
}
@Test
public void validateBTC_shouldNotValidate() {
assertTrue(BitcoinAddressValidator.validate("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU", false));
assertTrue(BitcoinAddressValidator.validate("mjn127C5wRQCULksMYMFHLp9UTdQuCfbZ9", true));
assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62j", true));
assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62X", true));
assertTrue(!BitcoinAddressValidator.validate("1ANNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", true));
assertTrue(!BitcoinAddressValidator.validate("1A Na15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", true));
assertTrue(!BitcoinAddressValidator.validate("BZbvjr", true));
assertTrue(!BitcoinAddressValidator.validate("i55j", true));
assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62!", true));
assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62iz", false));
assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62izz", false));
assertTrue(!BitcoinAddressValidator.validate("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nJ9", false));
assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I", false));
assertTrue(!BitcoinAddressValidator.validate("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU ", false));
assertTrue(!BitcoinAddressValidator.validate(" 3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU ", false));
}
@Test
public void validSegwit() {
// see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki
assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4", false));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", true));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3", false));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", true));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", false));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", true));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx", false));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("BC1SW50QA3JX3S", false));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj", false));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", true));
assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1q76awjp3nmklgnf0yyu0qncsekktf4e3qj248t4", false)); // electrum blog
}
@Test
public void invalidSegwit() {
// see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki
assertFalse(BitcoinAddressValidator.validateBech32Segwit("tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty", true)); // Invalid human-readable part
assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", true)); // Invalid checksum
assertFalse(BitcoinAddressValidator.validateBech32Segwit("BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2", true)); // Invalid witness version
assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc1rw5uspcuh", true)); // Invalid program length
assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90", true)); // Invalid program length
assertFalse(BitcoinAddressValidator.validateBech32Segwit("BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P", true)); // Invalid program length for witness version 0 (per BIP141)
assertFalse(BitcoinAddressValidator.validateBech32Segwit("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7", true)); // Mixed case
assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du", true)); // zero padding of more than 4 bits
assertFalse(BitcoinAddressValidator.validateBech32Segwit("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv", true)); // Non-zero padding in 8-to-5 conversion
assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc1gmk9yu", true)); // Empty data section
}
}

View File

@ -39,7 +39,7 @@ public class OpenAliasHelperTest {
public void asset() {
Map<String, String> attrs = OpenAliasHelper.parse(MONERUJO);
assertNotNull(attrs);
assertTrue(BarcodeData.OA_XMR_ASSET.equals(attrs.get(OpenAliasHelper.OA1_ASSET)));
assertTrue("xmr".equals(attrs.get(OpenAliasHelper.OA1_ASSET)));
}
@Test

View File

@ -0,0 +1,139 @@
/*
* Copyright (c) 2017 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.
*/
package com.m2049r.xmrwallet.util.validator;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class BitcoinAddressValidatorTest {
@Test
public void validateBTC_shouldValidate() {
assertTrue(BitcoinAddressValidator.validateBTC("2NBMEXXS4v8ubajzfQUjYvh2ptLkxzH8uTC", true));
assertTrue(BitcoinAddressValidator.validateBTC("2N9fzq66uZYQXp7uqrPBH6jKBhjrgTzpGCy", true));
assertTrue(BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", false));
assertTrue(BitcoinAddressValidator.validateBTC("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", false));
assertTrue(BitcoinAddressValidator.validateBTC("3R2MPpTNQLCNs13qnHz89Rm82jQ27bAwft", false));
assertTrue(BitcoinAddressValidator.validateBTC("34QjytsE8GVRbUBvYNheftqJ5CHfDHvQRD", false));
assertTrue(BitcoinAddressValidator.validateBTC("3GsAUrD4dnCqtaTTUzzsQWoymHNkEFrgGF", false));
assertTrue(BitcoinAddressValidator.validateBTC("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU", false));
assertTrue(BitcoinAddressValidator.validateBTC("mjn127C5wRQCULksMYMFHLp9UTdQuCfbZ9", true));
}
@Test
public void validateBTC_shouldNotValidate() {
assertTrue(BitcoinAddressValidator.validateBTC("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU", false));
assertTrue(BitcoinAddressValidator.validateBTC("mjn127C5wRQCULksMYMFHLp9UTdQuCfbZ9", true));
assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62j", true));
assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62X", true));
assertTrue(!BitcoinAddressValidator.validateBTC("1ANNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", true));
assertTrue(!BitcoinAddressValidator.validateBTC("1A Na15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", true));
assertTrue(!BitcoinAddressValidator.validateBTC("BZbvjr", true));
assertTrue(!BitcoinAddressValidator.validateBTC("i55j", true));
assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62!", true));
assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62iz", false));
assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62izz", false));
assertTrue(!BitcoinAddressValidator.validateBTC("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nJ9", false));
assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I", false));
assertTrue(!BitcoinAddressValidator.validateBTC("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU ", false));
assertTrue(!BitcoinAddressValidator.validateBTC(" 3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU ", false));
}
@Test
public void validSegwit() {
// see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki
assertTrue(BitcoinAddressValidator.validateBTC("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4", false));
assertTrue(BitcoinAddressValidator.validateBTC("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", true));
assertTrue(BitcoinAddressValidator.validateBTC("bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3", false));
assertTrue(BitcoinAddressValidator.validateBTC("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", true));
assertTrue(BitcoinAddressValidator.validateBTC("BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", false));
assertTrue(BitcoinAddressValidator.validateBTC("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", true));
assertTrue(BitcoinAddressValidator.validateBTC("bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx", false));
assertTrue(BitcoinAddressValidator.validateBTC("BC1SW50QA3JX3S", false));
assertTrue(BitcoinAddressValidator.validateBTC("bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj", false));
assertTrue(BitcoinAddressValidator.validateBTC("tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", true));
assertTrue(BitcoinAddressValidator.validateBTC("bc1q76awjp3nmklgnf0yyu0qncsekktf4e3qj248t4", false)); // electrum blog
}
@Test
public void invalidSegwit() {
// see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki
assertFalse(BitcoinAddressValidator.validateBTC("tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty", true)); // Invalid human-readable part
assertFalse(BitcoinAddressValidator.validateBTC("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", true)); // Invalid checksum
assertFalse(BitcoinAddressValidator.validateBTC("BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2", true)); // Invalid witness version
assertFalse(BitcoinAddressValidator.validateBTC("bc1rw5uspcuh", true)); // Invalid program length
assertFalse(BitcoinAddressValidator.validateBTC("bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90", true)); // Invalid program length
assertFalse(BitcoinAddressValidator.validateBTC("BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P", true)); // Invalid program length for witness version 0 (per BIP141)
assertFalse(BitcoinAddressValidator.validateBTC("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7", true)); // Mixed case
assertFalse(BitcoinAddressValidator.validateBTC("bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du", true)); // zero padding of more than 4 bits
assertFalse(BitcoinAddressValidator.validateBTC("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv", true)); // Non-zero padding in 8-to-5 conversion
assertFalse(BitcoinAddressValidator.validateBTC("bc1gmk9yu", true)); // Empty data section
}
@Test
public void validateLTC_shouldValidate() {
assertTrue(BitcoinAddressValidator.validate("ltc1qmgne2vzyk9c9zk7mak6u5gy02h242f5498pnsd", BitcoinAddressType.LTC, false));
assertTrue(BitcoinAddressValidator.validate("M9pTFxP6MPTZT61EeNJcmenqR5G8gD3m9a", BitcoinAddressType.LTC, false));
assertTrue(BitcoinAddressValidator.validate("LfiJ12PCWSFrRxoPiemiSXLUkT74oXWMv6", BitcoinAddressType.LTC, false));
assertTrue(BitcoinAddressValidator.validate("ltc1qwg8d8240h8y8mcrn7j56mz9896y24rzdevf978", BitcoinAddressType.LTC, false));
assertTrue(BitcoinAddressValidator.validate("ltc1qmqhg2ynwzdxphrw786xwkv5sl62xkwljpmas0y", BitcoinAddressType.LTC, false));
assertTrue(BitcoinAddressValidator.validate("ltc1qz67ddnsl92r6skfrxyk2u4dv7qdy9zxpepn0vm", BitcoinAddressType.LTC, false));
assertTrue(BitcoinAddressValidator.validate("ltc1qffjjuwfgylx685s00yfjk9l0mx4jsp7xvwwvqr", BitcoinAddressType.LTC, false));
assertTrue(BitcoinAddressValidator.validate("LZNhSpMWsczM4VWm7poPVCLHf1iwmXynAn", BitcoinAddressType.LTC, false));
assertTrue(BitcoinAddressValidator.validate("MFAECqt8RD3t4CeGLhteCCHAaK9KzNqvec", BitcoinAddressType.LTC, false));
}
@Test
public void validateLTC_shouldNotValidate() {
assertFalse(BitcoinAddressValidator.validate("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4", BitcoinAddressType.LTC, false));
assertFalse(BitcoinAddressValidator.validate("2N9fzq66uZYQXp7uqrPBH6jKBhjrgTzpGCy", BitcoinAddressType.LTC, false));
}
@Test
public void validateDASH_shouldValidate() {
assertTrue(BitcoinAddressValidator.validate("XoSxpd5VYNQvKbXbEaDKt6P1aZANzAkXrJ", BitcoinAddressType.DASH, false));
assertTrue(BitcoinAddressValidator.validate("Xgxd38qtwqEJDLJK1gSyzLWVtgTV26foGK", BitcoinAddressType.DASH, false));
assertTrue(BitcoinAddressValidator.validate("XkfCmxuMwU8DSeUpEMqfmjz4QWyhebwPCD", BitcoinAddressType.DASH, false));
}
@Test
public void validateDASH_shouldNotValidate() {
assertFalse(BitcoinAddressValidator.validate("XkfCmxuMwU8DSeUpEMqfmjz4QWyhebwPCd", BitcoinAddressType.DASH, false));
assertFalse(BitcoinAddressValidator.validate("2N9fzq66uZYQXp7uqrPBH6jKBhjrgTzpGCy", BitcoinAddressType.DASH, false));
}
@Test
public void validateDOGE_shouldValidate() {
assertTrue(BitcoinAddressValidator.validate("DPpJVPpvPNP6i6tMj4rTycAGh8wReTqaSU", BitcoinAddressType.DOGE, false));
assertTrue(BitcoinAddressValidator.validate("DPS6iZj7roHquvwRYXNBua9QtKPzigUUhM", BitcoinAddressType.DOGE, false));
assertTrue(BitcoinAddressValidator.validate("DFs6qrdCp4K4evv6jU5R3y2WjaWQbXzGsX", BitcoinAddressType.DOGE, false));
}
@Test
public void validateDOGE_shouldNotValidate() {
assertFalse(BitcoinAddressValidator.validate("Xgxd38qtwqEJDLJK1gSyzLWVtgTV26foGK", BitcoinAddressType.DOGE, false));
assertFalse(BitcoinAddressValidator.validate("M9pTFxP6MPTZT61EeNJcmenqR5G8gD3m9a", BitcoinAddressType.DOGE, false));
}
}

View File

@ -0,0 +1,46 @@
/*
* Copyright (c) 2017 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.
*/
package com.m2049r.xmrwallet.util.validator;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class EthAddressValidatorTest {
@Test
public void validateETH_shouldValidate() {
assertTrue(EthAddressValidator.validate("0x52d1d0de32322ec51c923b3d4d6c5ffcfcfa01a4"));
assertTrue(EthAddressValidator.validate("0x74c287ad5328daca276c6a1c1f149415b12c148d"));
assertTrue(EthAddressValidator.validate("0x12ae66cdc592e10b60f9097a7b0d3c59fce29876"));
assertTrue(EthAddressValidator.validate("0x12AE66CDc592e10B60f9097a7b0D3C59fce29876"));
assertTrue(EthAddressValidator.validate("0x541071beFDD2e68deaFb4889c8fdf005Bfdf2fb7"));
}
@Test
public void validateETH_shouldNotValidate() {
assertFalse(EthAddressValidator.validate("0x12AE66CDc592e10B60f9097a7b0d3C59fce29876"));
assertFalse(EthAddressValidator.validate("052d1d0de32322ec51c923b3d4d6c5ffcfcfa01a4"));
assertFalse(EthAddressValidator.validate("x74c287ad5328daca276c6a1c1f149415b12c148d"));
assertFalse(EthAddressValidator.validate("12ae66cdc592e10b60f9097a7b0d3c59fce29876"));
assertFalse(EthAddressValidator.validate("0x12ae66cdc592e10b60f9097a7b0d3c59fce2987"));
assertFalse(EthAddressValidator.validate("0x12ae66cdc592e10b60f9097a7b0d3c59fce2987 "));
assertFalse(EthAddressValidator.validate(" x12ae66cdc592e10b60f9097a7b0d3c59fce2987 "));
}
}