diff --git a/app/build.gradle b/app/build.gradle index 8291bb3c..3eb159bc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { compileSdk 35 minSdkVersion 21 targetSdkVersion 35 - versionCode 4008 - versionName "4.0.8 'Sidekick'" + versionCode 4102 + versionName "4.1.2 'Exolix'" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { @@ -58,7 +58,7 @@ android { applicationIdSuffix ".debug" } applicationVariants.all { variant -> - variant.buildConfigField "String", "ID_A", "\"" + getId("ID_A") + "\"" + variant.buildConfigField "String", "ID_F", "\"" + getId("ID_F") + "\"" } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java index 36adc779..7560f3fe 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java @@ -99,7 +99,7 @@ public class GenerateReviewFragment extends Fragment { private String walletPath; private String walletName; - private OnBackPressedCallback backPressedCallback = new OnBackPressedCallback(false) { + private final OnBackPressedCallback backPressedCallback = new OnBackPressedCallback(false) { @Override public void handleOnBackPressed() { // nothing @@ -164,6 +164,7 @@ public class GenerateReviewFragment extends Fragment { }); Bundle args = getArguments(); + assert args != null; type = args.getString(REQUEST_TYPE); walletPath = args.getString(REQUEST_PATH); localPassword = args.getString(REQUEST_PASSWORD); diff --git a/app/src/main/java/com/m2049r/xmrwallet/LockFragment.java b/app/src/main/java/com/m2049r/xmrwallet/LockFragment.java index 03ddb2f4..087c6868 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LockFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LockFragment.java @@ -22,13 +22,14 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import timber.log.Timber; public class LockFragment extends Fragment { @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Timber.d("onCreateView"); final FrameLayout frame = new FrameLayout(requireContext()); frame.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java index 9cb03a2c..e0151d22 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java @@ -619,6 +619,7 @@ public class LoginActivity extends BaseActivity try { GenerateReviewFragment detailsFragment = (GenerateReviewFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container); + assert detailsFragment != null; AlertDialog dialog = detailsFragment.createChangePasswordDialog(); if (dialog != null) { Helper.showKeyboard(dialog); @@ -896,6 +897,7 @@ public class LoginActivity extends BaseActivity try { GenerateFragment genFragment = (GenerateFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container); + assert genFragment != null; genFragment.walletGenerateError(); } catch (ClassCastException ex) { Timber.e("walletGenerateError() but not in GenerateFragment"); @@ -1366,7 +1368,7 @@ public class LoginActivity extends BaseActivity private void registerDetachReceiver() { detachReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { + if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) { unregisterDetachReceiver(); final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); Timber.i("Ledger detached!"); @@ -1409,6 +1411,7 @@ public class LoginActivity extends BaseActivity Timber.d("onDeviceConnected: %s", connectedDeviceName); try { SidekickConnectFragment f = (SidekickConnectFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container); + assert f != null; f.allowClick(); } catch (ClassCastException ex) { // ignore it diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java index abc0e685..2cf497f5 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java @@ -152,7 +152,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter showNetwork(); } - private OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) { + private final OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) { @Override public void handleOnBackPressed() { animateFAB(); @@ -283,7 +283,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter } // remove information of non-existent wallet - Set removedWallets = getActivity() + Set removedWallets = requireActivity() .getSharedPreferences(KeyStoreHelper.SecurityConstants.WALLET_PASS_PREFS_NAME, Context.MODE_PRIVATE) .getAll().keySet(); for (WalletManager.WalletInfo s : walletList) { @@ -445,7 +445,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter } private void setSubtext(String status) { - final Context ctx = getContext(); + final Context ctx = requireContext(); final Spanned text = Html.fromHtml(ctx.getString(R.string.status, Integer.toHexString(ThemeHelper.getThemedColor(ctx, R.attr.positiveColor) & 0xFFFFFF), Integer.toHexString(ThemeHelper.getThemedColor(ctx, android.R.attr.colorBackground) & 0xFFFFFF), diff --git a/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java b/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java index e6e6272c..0ed1afa2 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java @@ -32,6 +32,7 @@ import android.widget.TextView; import android.widget.Toast; import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; @@ -68,7 +69,7 @@ public class NodeFragment extends Fragment static private int NODES_TO_FIND = 10; - static private NumberFormat FORMATTER = NumberFormat.getInstance(); + static private final NumberFormat FORMATTER = NumberFormat.getInstance(); private SwipeRefreshLayout pullToRefresh; private TextView tvPull; @@ -104,7 +105,7 @@ public class NodeFragment extends Fragment } @Override - public void onAttach(Context context) { + public void onAttach(@NonNull Context context) { super.onAttach(context); if (context instanceof Listener) { this.activityCallback = (Listener) context; @@ -146,7 +147,7 @@ public class NodeFragment extends Fragment } } - private OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) { + private final OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) { @Override public void handleOnBackPressed() { Toast.makeText(requireActivity(), getString(R.string.node_refresh_wait), Toast.LENGTH_LONG).show(); @@ -210,7 +211,7 @@ public class NodeFragment extends Fragment } @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.node_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @@ -454,7 +455,7 @@ public class NodeFragment extends Fragment private void closeDialog() { if (editDialog == null) throw new IllegalStateException(); - Helper.hideKeyboardAlways(getActivity()); + Helper.hideKeyboardAlways(requireActivity()); editDialog.dismiss(); editDialog = null; NodeFragment.this.editDialog = null; diff --git a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java index 071404d5..7cbee64b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java @@ -32,12 +32,10 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.EditText; -import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; @@ -84,8 +82,6 @@ public class ReceiveFragment extends Fragment { private ImageView ivQrCode; private ImageView ivQrCodeFull; private EditText etDummy; - private ImageButton bCopyAddress; - private MenuItem shareItem; private Wallet wallet = null; private boolean isMyWallet = false; @@ -116,11 +112,10 @@ public class ReceiveFragment extends Fragment { tvQrCode = view.findViewById(R.id.tvQrCode); ivQrCodeFull = view.findViewById(R.id.qrCodeFull); etDummy = view.findViewById(R.id.etDummy); - bCopyAddress = view.findViewById(R.id.bCopyAddress); etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); - bCopyAddress.setOnClickListener(v -> copyAddress()); + view.findViewById(R.id.bCopyAddress).setOnClickListener(v -> copyAddress()); evAmount.setOnNewAmountListener(xmr -> { Timber.d("new amount = %s", xmr); @@ -211,8 +206,7 @@ public class ReceiveFragment extends Fragment { inflater.inflate(R.menu.receive_menu, menu); super.onCreateOptionsMenu(menu, inflater); - shareItem = menu.findItem(R.id.menu_item_share); - shareItem.setOnMenuItemClickListener(item -> { + menu.findItem(R.id.menu_item_share).setOnMenuItemClickListener(item -> { if (shareRequested) return true; shareRequested = true; if (!qrValid) { @@ -238,7 +232,7 @@ public class ReceiveFragment extends Fragment { private boolean saveQrCode() { if (!qrValid) throw new IllegalStateException("trying to save null qr code!"); - File cachePath = new File(getActivity().getCacheDir(), "images"); + File cachePath = new File(requireActivity().getCacheDir(), "images"); if (!cachePath.exists()) if (!cachePath.mkdirs()) throw new IllegalStateException("cannot create images folder"); File png = new File(cachePath, "QR.png"); @@ -452,7 +446,7 @@ public class ReceiveFragment extends Fragment { .withEndAction(resetSize).start(); } subaddress = newSubaddress; - final Context context = getContext(); + final Context context = requireContext(); Spanned label = Html.fromHtml(context.getString(R.string.receive_subaddress, Integer.toHexString(ThemeHelper.getThemedColor(context, R.attr.positiveColor) & 0xFFFFFF), Integer.toHexString(ThemeHelper.getThemedColor(context, android.R.attr.colorBackground) & 0xFFFFFF), diff --git a/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java index 097d75df..471e0442 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java @@ -24,6 +24,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import com.google.zxing.BarcodeFormat; @@ -43,7 +44,7 @@ public class ScannerFragment extends Fragment implements ZXingScannerView.Result private ZXingScannerView mScannerView; @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Timber.d("onCreateView"); mScannerView = new ZXingScannerView(getActivity()); return mScannerView; @@ -85,7 +86,7 @@ public class ScannerFragment extends Fragment implements ZXingScannerView.Result } @Override - public void onAttach(Context context) { + public void onAttach(@NonNull Context context) { super.onAttach(context); if (context instanceof OnScannedListener) { this.onScannedListener = (OnScannedListener) context; diff --git a/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java index 6a4bb5ad..3d38f9c7 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; +import androidx.annotation.NonNull; import androidx.annotation.StyleRes; import androidx.preference.ListPreference; import androidx.preference.PreferenceFragmentCompat; @@ -60,7 +61,7 @@ public class SettingsFragment extends PreferenceFragmentCompat private SettingsFragment.Listener activity; @Override - public void onAttach(Context context) { + public void onAttach(@NonNull Context context) { super.onAttach(context); if (context instanceof SettingsFragment.Listener) { activity = (SettingsFragment.Listener) context; diff --git a/app/src/main/java/com/m2049r/xmrwallet/SidekickConnectFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SidekickConnectFragment.java index 1cbbd0fc..c27d4d60 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/SidekickConnectFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/SidekickConnectFragment.java @@ -20,6 +20,7 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; @@ -29,6 +30,7 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -73,6 +75,8 @@ public class SidekickConnectFragment extends Fragment @Override public void onPause() { Timber.d("onPause()"); + if (ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) + throw new IllegalStateException("Bluetooth permission not granted"); if (bluetoothAdapter.isDiscovering()) { bluetoothAdapter.cancelDiscovery(); } @@ -112,6 +116,8 @@ public class SidekickConnectFragment extends Fragment private void populateList() { List items = new ArrayList<>(); + if (ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) + throw new IllegalStateException("Bluetooth permission not granted"); for (BluetoothDevice device : bluetoothAdapter.getBondedDevices()) { final int deviceCLass = device.getBluetoothClass().getDeviceClass(); switch (deviceCLass) { @@ -152,6 +158,8 @@ public class SidekickConnectFragment extends Fragment // Make sure we're not doing discovery anymore if (bluetoothAdapter != null) { + if (ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) + throw new IllegalStateException("Bluetooth permission not granted"); bluetoothAdapter.cancelDiscovery(); } } @@ -159,6 +167,8 @@ public class SidekickConnectFragment extends Fragment @Override public void onInteraction(final View view, final BluetoothInfo item) { Timber.d("onInteraction %s", item); + if (ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) + throw new IllegalStateException("Bluetooth permission not granted"); bluetoothAdapter.cancelDiscovery(); final BluetoothFragment btFragment = (BluetoothFragment) getChildFragmentManager().findFragmentById(R.id.bt_fragment); diff --git a/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java index b921280a..ed8ab8a2 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java @@ -226,7 +226,7 @@ public class SubaddressFragment extends Fragment implements SubaddressInfoAdapte // Callbacks from SubaddressInfoAdapter @Override - public void onInteraction(final View view, final Subaddress subaddress) { + public void onInteraction(final View view, @NonNull final Subaddress subaddress) { if (managerMode) activityCallback.showSubaddress(view, subaddress.getAddressIndex()); else diff --git a/app/src/main/java/com/m2049r/xmrwallet/SubaddressInfoFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SubaddressInfoFragment.java index 1691671d..6de515ed 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/SubaddressInfoFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/SubaddressInfoFragment.java @@ -52,7 +52,6 @@ public class SubaddressInfoFragment extends Fragment private Subaddress subaddress; private TextInputLayout etName; - private TextView tvAddress; private TextView tvTxLabel; @Override @@ -61,7 +60,6 @@ public class SubaddressInfoFragment extends Fragment View view = inflater.inflate(R.layout.fragment_subaddressinfo, container, false); etName = view.findViewById(R.id.etName); - tvAddress = view.findViewById(R.id.tvAddress); tvTxLabel = view.findViewById(R.id.tvTxLabel); final RecyclerView list = view.findViewById(R.id.list); @@ -71,11 +69,13 @@ public class SubaddressInfoFragment extends Fragment final Wallet wallet = activityCallback.getWallet(); Bundle b = getArguments(); + assert b != null; final int subaddressIndex = b.getInt("subaddressIndex"); subaddress = wallet.getSubaddressObject(subaddressIndex); etName.getEditText().setText(subaddress.getDisplayLabel()); - tvAddress.setText(getContext().getString(R.string.subbaddress_info_subtitle, + final TextView tvAddress = view.findViewById(R.id.tvAddress); + tvAddress.setText(requireContext().getString(R.string.subbaddress_info_subtitle, subaddress.getAddressIndex(), subaddress.getAddress())); etName.getEditText().setOnFocusChangeListener((v, hasFocus) -> { diff --git a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java index e0ec08bf..062fb6d8 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java @@ -20,7 +20,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Paint; -import android.net.Uri; import android.os.Bundle; import android.text.Html; import android.text.InputType; @@ -34,6 +33,7 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.transition.Transition; @@ -44,6 +44,8 @@ import com.m2049r.xmrwallet.data.UserNotes; import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.model.Transfer; import com.m2049r.xmrwallet.model.Wallet; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.api.ShiftApi; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.ThemeHelper; import com.m2049r.xmrwallet.widget.Toolbar; @@ -61,6 +63,7 @@ public class TxFragment extends Fragment { static public final String ARG_INFO = "info"; + @SuppressLint("SimpleDateFormat") private final SimpleDateFormat TS_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); public TxFragment() { @@ -106,6 +109,7 @@ public class TxFragment extends Fragment { tvTxAmountBtc = view.findViewById(R.id.tvTxAmountBtc); tvXmrToSupport = view.findViewById(R.id.tvXmrToSupport); tvXmrToKeyLabel = view.findViewById(R.id.tvXmrToKeyLabel); + tvXmrToLogo = view.findViewById(R.id.tvXmrToLogo); tvAccount = view.findViewById(R.id.tvAccount); @@ -127,18 +131,20 @@ public class TxFragment extends Fragment { tvWarning = view.findViewById(R.id.tvWarning); tvTxXmrToKey.setOnClickListener(v -> { - Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString()); + Helper.clipBoardCopy(requireActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString()); Toast.makeText(getActivity(), getString(R.string.message_copy_xmrtokey), Toast.LENGTH_SHORT).show(); }); - info = getArguments().getParcelable(ARG_INFO); + final Bundle args = getArguments(); + assert args != null; + info = args.getParcelable(ARG_INFO); show(); return view; } void shareTxInfo() { if (this.info == null) return; - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(getString(R.string.tx_timestamp)).append(":\n"); sb.append(TS_FORMATTER.format(new Date(info.timestamp * 1000))).append("\n\n"); @@ -216,7 +222,7 @@ public class TxFragment extends Fragment { private void showSubaddressLabel() { final Subaddress subaddress = activityCallback.getWalletSubaddress(info.accountIndex, info.addressIndex); - final Context ctx = getContext(); + final Context ctx = requireContext(); Spanned label = Html.fromHtml(ctx.getString(R.string.tx_account_formatted, info.accountIndex, info.addressIndex, Integer.toHexString(ThemeHelper.getThemedColor(ctx, R.attr.positiveColor) & 0xFFFFFF), @@ -264,16 +270,17 @@ public class TxFragment extends Fragment { tvTxFee.setVisibility(View.GONE); } + final Context ctx = requireContext(); if (info.isFailed) { tvTxAmount.setText(getString(R.string.tx_list_amount_failed, Wallet.getDisplayAmount(info.amount))); tvTxFee.setText(getString(R.string.tx_list_failed_text)); - setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor)); + setTxColour(ThemeHelper.getThemedColor(ctx, R.attr.neutralColor)); } else if (info.isPending) { - setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor)); + setTxColour(ThemeHelper.getThemedColor(ctx, R.attr.neutralColor)); } else if (info.direction == TransactionInfo.Direction.Direction_In) { - setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.positiveColor)); + setTxColour(ThemeHelper.getThemedColor(ctx, R.attr.positiveColor)); } else { - setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.negativeColor)); + setTxColour(ThemeHelper.getThemedColor(ctx, R.attr.negativeColor)); } Set destinations = new HashSet<>(); StringBuilder sb = new StringBuilder(); @@ -328,31 +335,29 @@ public class TxFragment extends Fragment { void showBtcInfo() { if (userNotes.xmrtoKey != null) { cvXmrTo.setVisibility(View.VISIBLE); - String key = userNotes.xmrtoKey; - if ("xmrto".equals(userNotes.xmrtoTag)) { // legacy xmr.to service :( - key = "xmrto-" + key; - } - tvTxXmrToKey.setText(key); + + ShiftService service = ShiftService.findWithTag(userNotes.xmrtoTag); + tvXmrToKeyLabel.setText(getString(R.string.label_send_btc_xmrto_key_lb, service.getLabel())); + if (service.getIconId() == 0) + tvXmrToLogo.setVisibility(View.GONE); + else + tvXmrToLogo.setImageResource(service.getLogoId()); + + tvTxXmrToKey.setText(userNotes.xmrtoKey); + tvDestinationBtc.setText(userNotes.xmrtoDestination); tvTxAmountBtc.setText(userNotes.xmrtoAmount + " " + userNotes.xmrtoCurrency); - switch (userNotes.xmrtoTag) { - case "xmrto": - tvXmrToSupport.setVisibility(View.GONE); - tvXmrToKeyLabel.setVisibility(View.INVISIBLE); - tvXmrToLogo.setImageResource(R.drawable.ic_xmrto_logo); - break; - case "side": // defaults in layout - just add underline - tvXmrToSupport.setPaintFlags(tvXmrToSupport.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); - tvXmrToSupport.setOnClickListener(v -> { - Uri uri = Uri.parse("https://sideshift.ai/orders/" + userNotes.xmrtoKey); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - startActivity(intent); - }); - break; - default: - tvXmrToSupport.setVisibility(View.GONE); - tvXmrToKeyLabel.setVisibility(View.INVISIBLE); - tvXmrToLogo.setVisibility(View.GONE); + + ShiftApi shiftApi = service.getShiftApi(); + if (shiftApi != null) { + tvXmrToSupport.setText(getString(R.string.label_send_btc_xmrto_info, service.getLabel())); + tvXmrToSupport.setPaintFlags(tvXmrToSupport.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); + tvXmrToSupport.setOnClickListener(v -> { + startActivity(new Intent(Intent.ACTION_VIEW, shiftApi.getQueryOrderUri(userNotes.xmrtoKey))); + }); + } else { + tvXmrToSupport.setVisibility(View.GONE); + tvXmrToKeyLabel.setVisibility(View.INVISIBLE); } } else { cvXmrTo.setVisibility(View.GONE); @@ -369,7 +374,7 @@ public class TxFragment extends Fragment { } @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.tx_info_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @@ -397,7 +402,7 @@ public class TxFragment extends Fragment { } @Override - public void onAttach(Context context) { + public void onAttach(@NonNull Context context) { super.onAttach(context); if (context instanceof TxFragment.Listener) { this.activityCallback = (TxFragment.Listener) context; diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java index 365090bf..3e73b8f7 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java @@ -38,7 +38,6 @@ import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AlertDialog; import androidx.core.view.GravityCompat; @@ -348,7 +347,10 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste } Bundle extras = getIntent().getExtras(); - if (extras == null) finish(); // we need extras! + if (extras == null) { + finish(); // we need extras! + return; + } String walletId = extras.getString(REQUEST_ID); requestStreetMode = extras.getBoolean(REQUEST_STREETMODE); @@ -1179,7 +1181,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste } @Override - public void onSubaddressSelected(@Nullable final Subaddress subaddress) { + public void onSubaddressSelected(@NonNull final Subaddress subaddress) { selectedSubaddressIndex = subaddress.getAddressIndex(); getOnBackPressedDispatcher().onBackPressed(); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java index a26cb9a2..2a4421ae 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java @@ -112,7 +112,7 @@ public class WalletFragment extends Fragment flExchange = view.findViewById(R.id.flExchange); ((ProgressBar) view.findViewById(R.id.pbExchange)).getIndeterminateDrawable(). setColorFilter( - ThemeHelper.getThemedColor(getContext(), com.google.android.material.R.attr.colorPrimaryVariant), + ThemeHelper.getThemedColor(requireContext(), com.google.android.material.R.attr.colorPrimaryVariant), android.graphics.PorterDuff.Mode.MULTIPLY); tvProgress = view.findViewById(R.id.tvProgress); diff --git a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java b/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java index 287004df..54fee429 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java +++ b/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java @@ -23,7 +23,6 @@ import android.os.Build; import androidx.annotation.NonNull; -import com.m2049r.xmrwallet.BuildConfig; import com.m2049r.xmrwallet.model.NetworkType; import com.m2049r.xmrwallet.util.LocaleHelper; import com.m2049r.xmrwallet.util.NetCipherHelper; diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java b/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java index 3a5cecb9..b3a47cdf 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java @@ -24,43 +24,38 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import lombok.Getter; import lombok.ToString; import timber.log.Timber; +@Getter @ToString public class BarcodeData { + public enum Security { NORMAL, OA_NO_DNSSEC, OA_DNSSEC } - final public Crypto asset; - final public List ambiguousAssets; - final public String address; - final public String addressName; - final public String amount; - final public String description; - final public Security security; + final private Set possibleAssets = new HashSet<>(); + private String address = null; + private String addressName = null; + private String amount = null; + private String description = null; + private Security security = null; public BarcodeData(List 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; + 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; - } + possibleAssets.addAll(assets); } public BarcodeData(Crypto asset, String address, String description, String amount) { @@ -68,8 +63,7 @@ public class BarcodeData { } public BarcodeData(Crypto asset, String address, String addressName, String description, String amount, Security security) { - this.ambiguousAssets = null; - this.asset = asset; + possibleAssets.add(asset); this.address = address; this.addressName = addressName; this.description = description; @@ -82,7 +76,7 @@ public class BarcodeData { } public String getUriString() { - if (asset != Crypto.XMR) throw new IllegalStateException("We can only do XMR stuff!"); + if (getAsset() != Crypto.XMR) throw new IllegalStateException("We can only do XMR stuff!"); StringBuilder sb = new StringBuilder(); sb.append(Crypto.XMR.getUriScheme()) .append(':') @@ -227,6 +221,20 @@ public class BarcodeData { } public boolean isAmbiguous() { - return ambiguousAssets != null; + return possibleAssets.size() > 1; + } + + public Crypto getAsset() { + if (possibleAssets.size() == 1) { + return possibleAssets.iterator().next(); + } else { + return null; + } + } + + // return true if we still have possible assets + public boolean filter(Set assets) { + possibleAssets.retainAll(assets); + return !possibleAssets.isEmpty(); } } \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java b/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java index e9e66f1d..330e908c 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2024 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.data; import androidx.annotation.NonNull; @@ -5,35 +21,30 @@ 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 java.util.regex.Pattern; 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); - }); + XMR("XMR", "XMR", "XMR", "monero:tx_amount:recipient_name:tx_description", R.id.ibXMR, R.drawable.ic_monero, R.drawable.ic_monero_bw, Pattern.compile("^[48][a-zA-Z|\\d]{94}([a-zA-Z|\\d]{11})?$")), + BTC("BTC", "BTC", "BTC", "bitcoin:amount:label:message", R.id.ibBTC, R.drawable.ic_xmrto_btc, R.drawable.ic_xmrto_btc_off, Pattern.compile("^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^(bc1q)|(bc1p)[0-9A-Za-z]{37,62}$")), + LTC("LTC", "LTC", "LTC", "litecoin:amount:label:message", R.id.ibLTC, R.drawable.ic_xmrto_ltc, R.drawable.ic_xmrto_ltc_off, Pattern.compile("^([LM3])[A-Za-z0-9]{33}$|^(ltc1)[0-9A-Za-z]{39}$")), + ETH("ETH", "ETH", "ETH", "ethereum:amount:label:message", R.id.ibETH, R.drawable.ic_xmrto_eth, R.drawable.ic_xmrto_eth_off, Pattern.compile("^(0x)[0-9A-Fa-f]{40}$")), + USDT("USDT", "TRX", "USDT(TRC20)", "usdt:amount:label:message", R.id.ibUSDT, R.drawable.ic_xmrto_usdt_trc20, R.drawable.ic_xmrto_usdt_trc20_off, Pattern.compile("^T[1-9A-HJ-NP-Za-km-z]{33}$")), + SOLANA("SOL", "SOL", "SOL", "solana:amount:label:message", R.id.ibSOL, R.drawable.ic_xmrto_sol, R.drawable.ic_xmrto_sol_off, Pattern.compile("^[1-9A-HJ-NP-Za-km-z]{32,44}$")); @Getter @NonNull private final String symbol; @Getter - private final boolean casefull; + @NonNull + private final String network; + @Getter + @NonNull + private final String label; @NonNull private final String uriSpec; @Getter @@ -43,7 +54,7 @@ public enum Crypto { @Getter private final int iconDisabledId; @NonNull - private final Validator validator; + private final Pattern regex; @Nullable public static Crypto withScheme(@NonNull String scheme) { @@ -62,10 +73,6 @@ public enum Crypto { return null; } - interface Validator { - boolean validate(String address); - } - // TODO maybe cache these segments String getUriScheme() { return uriSpec.split(":")[0]; @@ -83,7 +90,8 @@ public enum Crypto { return uriSpec.split(":")[3]; } - boolean validate(String address) { - return validator.validate(address); + public boolean validate(String address) { + if (this == XMR) return Wallet.isAddressValid(address); + return regex.matcher(address).find(); } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/CryptoAmount.java b/app/src/main/java/com/m2049r/xmrwallet/data/CryptoAmount.java new file mode 100644 index 00000000..b8686a02 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/data/CryptoAmount.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2024 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.data; + +import lombok.Value; + +@Value +public class CryptoAmount { + Crypto crypto; + double amount; + + public CryptoAmount newWithAmount(double amount) { + return new CryptoAmount(this.crypto, amount); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java b/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java index f9026cb5..39ca2a63 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java @@ -201,8 +201,13 @@ public class NodeInfo extends Node { .port(port) .addPathSegment("json_rpc") .build(); - final String json = "{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"getlastblockheader\"}"; - return new Request(url, json, getUsername(), getPassword()); + + try { + final JSONObject json = new JSONObject("{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"getlastblockheader\"}"); + return new Request(url, json, getUsername(), getPassword()); + } catch (JSONException ex) { + throw new IllegalStateException(ex); + } } private boolean testRpcService(int port) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java b/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java index 8f41839d..fd5ec2e1 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java @@ -20,22 +20,21 @@ import android.os.Parcel; import androidx.annotation.NonNull; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.api.RequestQuote; + import lombok.Getter; import lombok.Setter; +@Setter +@Getter public class TxDataBtc extends TxData { - @Getter - @Setter + private ShiftService shiftService; private String btcSymbol; // the actual non-XMR thing we're sending - @Getter - @Setter private String xmrtoOrderId; // shown in success screen - @Getter - @Setter private String btcAddress; - @Getter - @Setter - private double btcAmount; + private CryptoAmount shiftAmount; // what we want to send + private String xmrtoQueryOrderToken; // used for queryOrder API public TxDataBtc() { super(); @@ -47,7 +46,9 @@ public class TxDataBtc extends TxData { out.writeString(btcSymbol); out.writeString(xmrtoOrderId); out.writeString(btcAddress); - out.writeDouble(btcAmount); + out.writeString(shiftAmount.getCrypto().name()); + out.writeDouble(shiftAmount.getAmount()); + out.writeString(xmrtoQueryOrderToken); } // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods @@ -66,7 +67,8 @@ public class TxDataBtc extends TxData { btcSymbol = in.readString(); xmrtoOrderId = in.readString(); btcAddress = in.readString(); - btcAmount = in.readDouble(); + shiftAmount = new CryptoAmount(Crypto.valueOf(in.readString()), in.readDouble()); + xmrtoQueryOrderToken = in.readString(); } @NonNull @@ -79,19 +81,33 @@ public class TxDataBtc extends TxData { sb.append(btcSymbol); sb.append(",btcAddress:"); sb.append(btcAddress); - sb.append(",btcAmount:"); - sb.append(btcAmount); + sb.append(",amount:"); + sb.append(shiftAmount); + sb.append(",xmrtoQueryOrderToken:"); + sb.append(xmrtoQueryOrderToken); 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()); + return address.equalsIgnoreCase(btcAddress); + } + + public double getBtcAmount() { + return (shiftAmount.getCrypto() == Crypto.XMR) ? 0 : shiftAmount.getAmount(); + } + + public double getXmrAmount() { + return (shiftAmount.getCrypto() == Crypto.XMR) ? shiftAmount.getAmount() : 0; + } + + public boolean validate(RequestQuote quote) { + if (shiftAmount.getCrypto() == Crypto.XMR) { + return (quote.getXmrAmount() == getXmrAmount()); + } else { + return (quote.getBtcAmount() == getBtcAmount()); } } + } diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java b/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java index f5eb14b5..30852aac 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java @@ -16,7 +16,7 @@ package com.m2049r.xmrwallet.data; -import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder; +import com.m2049r.xmrwallet.service.shift.api.CreateOrder; import com.m2049r.xmrwallet.util.Helper; import java.util.regex.Matcher; @@ -61,7 +61,7 @@ public class UserNotes { public void setXmrtoOrder(CreateOrder order) { if (order != null) { - xmrtoTag = order.TAG; + xmrtoTag = order.getTag(); xmrtoKey = order.getOrderId(); xmrtoAmount = Helper.getDisplayAmount(order.getBtcAmount()); xmrtoCurrency = order.getBtcCurrency(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/AboutFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/AboutFragment.java index 5c788d3b..209222d7 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/dialog/AboutFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/dialog/AboutFragment.java @@ -20,10 +20,10 @@ import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.text.Html; -import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -57,13 +57,14 @@ public class AboutFragment extends DialogFragment { AboutFragment.newInstance().show(ft, TAG); } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_about, null); + final View view = getLayoutInflater().inflate(R.layout.fragment_about, null); ((TextView) view.findViewById(R.id.tvHelp)).setText(Html.fromHtml(getLicencesHtml())); ((TextView) view.findViewById(R.id.tvVersion)).setText(getString(R.string.about_version, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE)); - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity()) + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity()) .setView(view) .setNegativeButton(R.string.about_close, new DialogInterface.OnClickListener() { @@ -77,7 +78,7 @@ public class AboutFragment extends DialogFragment { private String getLicencesHtml() { try (BufferedReader reader = new BufferedReader( - new InputStreamReader(getContext().getAssets().open("licenses.html"), StandardCharsets.UTF_8))) { + new InputStreamReader(requireContext().getAssets().open("licenses.html"), StandardCharsets.UTF_8))) { StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/CreditsFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/CreditsFragment.java index d33921e6..cca7dc91 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/dialog/CreditsFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/dialog/CreditsFragment.java @@ -20,10 +20,10 @@ import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.text.Html; -import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -49,13 +49,14 @@ public class CreditsFragment extends DialogFragment { CreditsFragment.newInstance().show(ft, TAG); } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_credits, null); + final View view = getLayoutInflater().inflate(R.layout.fragment_credits, null); ((TextView) view.findViewById(R.id.tvCredits)).setText(Html.fromHtml(getString(R.string.credits_text))); - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity()) + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity()) .setView(view) .setNegativeButton(R.string.about_close, new DialogInterface.OnClickListener() { diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java index 69289372..4c16095b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/dialog/HelpFragment.java @@ -16,13 +16,13 @@ package com.m2049r.xmrwallet.dialog; +import android.annotation.SuppressLint; import android.app.Dialog; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.text.Html; import android.text.Spanned; -import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -65,9 +65,10 @@ public class HelpFragment extends DialogFragment { private Spanned getHtml(String html, double textSize) { final Html.ImageGetter imageGetter = source -> { - final int imageId = getResources().getIdentifier(source.replace("/", ""), "drawable", requireActivity().getPackageName()); + @SuppressLint("DiscouragedApi") final int imageId = getResources().getIdentifier(source.replace("/", ""), "drawable", requireActivity().getPackageName()); // Don't die if we don't find the image - use a heart instead final Drawable drawable = ContextCompat.getDrawable(requireActivity(), imageId > 0 ? imageId : R.drawable.ic_favorite_24dp); + assert drawable != null; final double f = textSize / drawable.getIntrinsicHeight(); drawable.setBounds(0, 0, (int) (f * drawable.getIntrinsicWidth()), (int) textSize); return drawable; @@ -82,7 +83,7 @@ public class HelpFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_help, null); + final View view = getLayoutInflater().inflate(R.layout.fragment_help, null); int helpId = 0; boolean torButton = false; @@ -100,7 +101,7 @@ public class HelpFragment extends DialogFragment { .setView(view); if (torButton) { builder.setNegativeButton(R.string.help_nok, - (dialog, id) -> dialog.dismiss()) + (dialog, id) -> dialog.dismiss()) .setPositiveButton(R.string.help_getorbot, (dialog, id) -> { dialog.dismiss(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/PocketChangeFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/PocketChangeFragment.java index 2d4c55c2..b874ddff 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/dialog/PocketChangeFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/dialog/PocketChangeFragment.java @@ -18,7 +18,6 @@ package com.m2049r.xmrwallet.dialog; import android.app.Dialog; import android.os.Bundle; -import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -66,7 +65,7 @@ public class PocketChangeFragment extends DialogFragment implements Slider.OnCha @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_pocketchange_setting, null); + final View view = getLayoutInflater().inflate(R.layout.fragment_pocketchange_setting, null); boolean enabled = false; int progress = 0; Bundle arguments = getArguments(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/PrivacyFragment.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/PrivacyFragment.java index 6ddb2e44..08b41f9f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/dialog/PrivacyFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/dialog/PrivacyFragment.java @@ -20,10 +20,10 @@ import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.text.Html; -import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -49,13 +49,14 @@ public class PrivacyFragment extends DialogFragment { PrivacyFragment.newInstance().show(ft, TAG); } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_privacy_policy, null); + final View view = getLayoutInflater().inflate(R.layout.fragment_privacy_policy, null); ((TextView) view.findViewById(R.id.tvCredits)).setText(Html.fromHtml(getString(R.string.privacy_policy))); - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity()) + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity()) .setView(view) .setNegativeButton(R.string.about_close, new DialogInterface.OnClickListener() { diff --git a/app/src/main/java/com/m2049r/xmrwallet/dialog/ProgressDialog.java b/app/src/main/java/com/m2049r/xmrwallet/dialog/ProgressDialog.java index a8bb780d..4cc7ab65 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/dialog/ProgressDialog.java +++ b/app/src/main/java/com/m2049r/xmrwallet/dialog/ProgressDialog.java @@ -17,6 +17,7 @@ package com.m2049r.xmrwallet.dialog; * limitations under the License. */ +import android.annotation.SuppressLint; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; @@ -31,6 +32,7 @@ import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.util.Helper; import java.util.Locale; +import java.util.Objects; import timber.log.Timber; @@ -56,7 +58,7 @@ public class ProgressDialog extends AlertDialog { @Override protected void onCreate(Bundle savedInstanceState) { - final View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_ledger_progress, null); + @SuppressLint("InflateParams") final View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_ledger_progress, null); pbCircle = view.findViewById(R.id.pbCircle); tvMessage = view.findViewById(R.id.tvMessage); rlProgressBar = view.findViewById(R.id.rlProgressBar); @@ -78,7 +80,7 @@ public class ProgressDialog extends AlertDialog { super.onCreate(savedInstanceState); if (Helper.preventScreenshot()) { - getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + Objects.requireNonNull(getWindow()).setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/PreShifter.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/PreShifter.java new file mode 100644 index 00000000..7266b37f --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/PreShifter.java @@ -0,0 +1,16 @@ +package com.m2049r.xmrwallet.fragment.send; + +import com.m2049r.xmrwallet.data.CryptoAmount; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderParameters; + +public interface PreShifter { + CryptoAmount getAmount(); + + void onOrderParametersError(final Exception ex); + + void onOrderParametersReceived(final QueryOrderParameters orderParameters); + + boolean isActive(); + + void showProgress(); +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java index 2bfaf289..104df02f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java @@ -44,12 +44,9 @@ 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.service.shift.ShiftService; 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; @@ -64,15 +61,11 @@ public class SendAddressWizardFragment extends SendWizardFragment { public static SendAddressWizardFragment newInstance(Listener listener) { SendAddressWizardFragment instance = new SendAddressWizardFragment(); - instance.setSendListener(listener); + instance.sendListener = listener; return instance; } - Listener sendListener; - - public void setSendListener(Listener listener) { - this.sendListener = listener; - } + private Listener sendListener; public interface Listener { void setBarcodeData(BarcodeData data); @@ -103,13 +96,6 @@ public class SendAddressWizardFragment extends SendWizardFragment { void onScan(); } - private Crypto getCryptoForButton(ImageButton button) { - for (Map.Entry entry : ibCrypto.entrySet()) { - if (entry.getValue() == button) return entry.getKey(); - } - return null; - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -122,7 +108,9 @@ public class SendAddressWizardFragment extends SendWizardFragment { ibCrypto = new HashMap<>(); for (Crypto crypto : Crypto.values()) { final ImageButton button = view.findViewById(crypto.getButtonId()); - if (Helper.ALLOW_SHIFT || (crypto == Crypto.XMR)) { + if ((crypto == Crypto.XMR) + || (Helper.ALLOW_SHIFT && ShiftService.isAssetSupported(crypto))) { + button.setVisibility(View.VISIBLE); ibCrypto.put(crypto, button); button.setOnClickListener(v -> { if (possibleCryptos.contains(crypto)) { @@ -131,9 +119,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { } 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.setText(Html.fromHtml(getString(R.string.info_xmrto_help, crypto.getNetwork(), crypto.getLabel(), ShiftService.DEFAULT.getLabel()))); tvXmrTo.setVisibility(View.VISIBLE); } else { tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_help_xmr))); @@ -143,9 +129,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { } }); } else { - button.setImageResource(crypto.getIconDisabledId()); - button.setImageAlpha(128); - button.setEnabled(false); + button.setVisibility(View.INVISIBLE); } } if (!Helper.ALLOW_SHIFT) { @@ -175,49 +159,26 @@ public class SendAddressWizardFragment extends SendWizardFragment { @Override public void afterTextChanged(Editable editable) { Timber.d("AFTER: %s", editable.toString()); - etAddress.setError(null); + BarcodeData bc = sendListener.getBarcodeData(); + if (bc == null) { + final String address = etAddress.getEditText().getText().toString(); + bc = BarcodeData.fromString(address); + } + sendListener.setBarcodeData(null); // it's used up now 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)); - sendListener.setMode(SendFragment.Mode.XMR); - } else if (isStandardAddress(address)) { - Timber.d("isStandardAddress"); - possibleCryptos.add(Crypto.XMR); - selectedCrypto = Crypto.XMR; - sendListener.setMode(SendFragment.Mode.XMR); - } - if (!Helper.ALLOW_SHIFT) return; - 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 ((bc != null) && (bc.filter(ShiftService.getPossibleAssets()))) { + possibleCryptos.clear(); + possibleCryptos.addAll(bc.getPossibleAssets()); + selectedCrypto = bc.getAsset(); + if (checkAddress()) { + if (bc.getSecurity() == BarcodeData.Security.OA_NO_DNSSEC) + etAddress.setError(getString(R.string.send_address_no_dnssec)); + else if (bc.getSecurity() == BarcodeData.Security.OA_DNSSEC) + etAddress.setError(getString(R.string.send_address_openalias)); } } - if (possibleCryptos.isEmpty()) { - Timber.d("other"); - tvXmrTo.setVisibility(View.INVISIBLE); - sendListener.setMode(SendFragment.Mode.XMR); - } - updateCryptoButtons(address.isEmpty()); + updateCryptoButtons(false); } @Override @@ -231,7 +192,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { final ImageButton bPasteAddress = view.findViewById(R.id.bPasteAddress); bPasteAddress.setOnClickListener(v -> { - final String clip = Helper.getClipBoardText(getActivity()); + final String clip = Helper.getClipBoardText(requireActivity()); if (clip == null) return; // clean it up final String address = clip.replaceAll("( +)|(\\r?\\n?)", ""); @@ -248,16 +209,14 @@ public class SendAddressWizardFragment extends SendWizardFragment { etNotes = view.findViewById(R.id.etNotes); etNotes.getEditText().setRawInputType(InputType.TYPE_CLASS_TEXT); - etNotes.getEditText(). - - 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; - }); + etNotes.getEditText().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()); @@ -271,13 +230,19 @@ public class SendAddressWizardFragment extends SendWizardFragment { private void selectedCrypto(Crypto crypto) { final ImageButton button = ibCrypto.get(crypto); + assert button != null; button.setImageResource(crypto.getIconEnabledId()); button.setImageAlpha(255); button.setEnabled(true); + if (selectedCrypto == Crypto.XMR) + sendListener.setMode(SendFragment.Mode.XMR); + else + sendListener.setMode(SendFragment.Mode.BTC); } private void possibleCrypto(Crypto crypto) { final ImageButton button = ibCrypto.get(crypto); + assert button != null; button.setImageResource(crypto.getIconDisabledId()); button.setImageAlpha(255); button.setEnabled(true); @@ -285,6 +250,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { private void impossibleCrypto(Crypto crypto) { final ImageButton button = ibCrypto.get(crypto); + if (button == null) return; // not all buttons exist for all providers button.setImageResource(crypto.getIconDisabledId()); button.setImageAlpha(128); button.setEnabled(true); @@ -302,7 +268,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { } } if ((selectedCrypto != null) && (selectedCrypto != Crypto.XMR)) { - tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto, selectedCrypto.getSymbol()))); + tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto, selectedCrypto.getNetwork(), selectedCrypto.getLabel(), ShiftService.DEFAULT.getLabel()))); tvXmrTo.setVisibility(View.VISIBLE); } else if ((selectedCrypto == null) && (possibleCryptos.size() > 1)) { tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_ambiguous))); @@ -328,7 +294,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { 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); + Timber.d("Security=%s, %s", barcodeData.getSecurity().toString(), barcodeData.getAddress()); processScannedData(barcodeData); } else { etAddress.setError(getString(R.string.send_address_not_openalias)); @@ -369,18 +335,6 @@ public class SendAddressWizardFragment extends SendWizardFragment { && Wallet.isAddressValid(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() { if (possibleCryptos.size() > 1) { // address ambiguous for (Crypto crypto : Crypto.values()) { @@ -412,10 +366,10 @@ public class SendAddressWizardFragment extends SendWizardFragment { ((TxDataBtc) txData).setBtcAddress(etAddress.getEditText().getText().toString()); ((TxDataBtc) txData).setBtcSymbol(selectedCrypto.getSymbol()); txData.setDestination(null); - ServiceHelper.ASSET = selectedCrypto.getSymbol().toLowerCase(); + ShiftService.ASSET = selectedCrypto; } else { txData.setDestination(etAddress.getEditText().getText().toString()); - ServiceHelper.ASSET = null; + ShiftService.ASSET = null; } txData.setUserNotes(new UserNotes(etNotes.getEditText().getText().toString())); txData.setPriority(PendingTransaction.Priority.Priority_Default); @@ -445,49 +399,33 @@ public class SendAddressWizardFragment extends SendWizardFragment { } public void processScannedData(BarcodeData barcodeData) { + barcodeData.filter(ShiftService.getPossibleAssets()); sendListener.setBarcodeData(barcodeData); if (isResumed()) processScannedData(); } public void processScannedData() { - BarcodeData barcodeData = sendListener.getBarcodeData(); + final BarcodeData barcodeData = sendListener.getBarcodeData(); if (barcodeData != null) { Timber.d("GOT DATA"); - if (!Helper.ALLOW_SHIFT && (barcodeData.asset != Crypto.XMR)) { + if (!Helper.ALLOW_SHIFT && (barcodeData.getAsset() != Crypto.XMR)) { Timber.d("BUT ONLY XMR SUPPORTED"); - barcodeData = null; - sendListener.setBarcodeData(barcodeData); + sendListener.setBarcodeData(null); return; } - 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; - } - if (Helper.ALLOW_SHIFT) - updateCryptoButtons(false); - if (checkAddress()) { - if (barcodeData.security == BarcodeData.Security.OA_NO_DNSSEC) - etAddress.setError(getString(R.string.send_address_no_dnssec)); - else if (barcodeData.security == BarcodeData.Security.OA_DNSSEC) - etAddress.setError(getString(R.string.send_address_openalias)); - } + if (barcodeData.getAddress() != null) { + etAddress.getEditText().setText(barcodeData.getAddress()); } else { etAddress.getEditText().getText().clear(); etAddress.setError(null); } - String scannedNotes = barcodeData.addressName; + String scannedNotes = barcodeData.getAddressName(); if (scannedNotes == null) { - scannedNotes = barcodeData.description; - } else if (barcodeData.description != null) { - scannedNotes = scannedNotes + ": " + barcodeData.description; + scannedNotes = barcodeData.getDescription(); + } else if (barcodeData.getDescription() != null) { + scannedNotes = scannedNotes + ": " + barcodeData.getDescription(); } if (scannedNotes != null) { etNotes.getEditText().setText(scannedNotes); diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java index 2038d3ed..f94a9ed3 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java @@ -23,8 +23,6 @@ import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.TextView; -import com.google.android.material.progressindicator.LinearProgressIndicator; -import com.google.android.material.switchmaterial.SwitchMaterial; import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.data.BarcodeData; import com.m2049r.xmrwallet.data.TxData; @@ -38,17 +36,13 @@ public class SendAmountWizardFragment extends SendWizardFragment { public static SendAmountWizardFragment newInstance(Listener listener) { SendAmountWizardFragment instance = new SendAmountWizardFragment(); - instance.setSendListener(listener); + instance.sendListener = listener; return instance; } - Listener sendListener; + private Listener sendListener; - public void setSendListener(Listener listener) { - this.sendListener = listener; - } - - interface Listener { + public interface Listener { SendFragment.Listener getActivityCallback(); TxData getTxData(); @@ -139,7 +133,7 @@ public class SendAmountWizardFragment extends SendWizardFragment { public void onResumeFragment() { super.onResumeFragment(); Timber.d("onResumeFragment()"); - Helper.showKeyboard(getActivity()); + Helper.showKeyboard(requireActivity()); final long funds = getTotalFunds(); maxFunds = 1.0 * funds / Helper.ONE_XMR; if (!sendListener.getActivityCallback().isStreetMode()) { @@ -150,8 +144,8 @@ public class SendAmountWizardFragment extends SendWizardFragment { getString(R.string.unknown_amount))); } final BarcodeData data = sendListener.popBarcodeData(); - if ((data != null) && (data.amount != null)) { - etAmount.setAmount(data.amount); + if ((data != null) && (data.getAmount() != null)) { + etAmount.setAmount(data.getAmount()); } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java index 72b2e988..cc781106 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java @@ -17,48 +17,49 @@ package com.m2049r.xmrwallet.fragment.send; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.text.Html; import android.text.Spanned; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; + import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.data.BarcodeData; +import com.m2049r.xmrwallet.data.CryptoAmount; +import com.m2049r.xmrwallet.data.TxData; import com.m2049r.xmrwallet.data.TxDataBtc; import com.m2049r.xmrwallet.model.Wallet; -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.sideshift.network.SideShiftApiImpl; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderParameters; +import com.m2049r.xmrwallet.service.shift.process.PreShiftProcess; +import com.m2049r.xmrwallet.util.AmountHelper; import com.m2049r.xmrwallet.util.Helper; -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; - import timber.log.Timber; -public class SendBtcAmountWizardFragment extends SendWizardFragment { +public class SendBtcAmountWizardFragment extends SendWizardFragment implements PreShifter, ExchangeOtherEditText.Listener { public static SendBtcAmountWizardFragment newInstance(SendAmountWizardFragment.Listener listener) { - SendBtcAmountWizardFragment instance = new SendBtcAmountWizardFragment(); - instance.setSendListener(listener); - return instance; + return new SendBtcAmountWizardFragment(listener); } - SendAmountWizardFragment.Listener sendListener; - - public SendBtcAmountWizardFragment setSendListener(SendAmountWizardFragment.Listener listener) { - this.sendListener = listener; - return this; + private SendBtcAmountWizardFragment(@NonNull SendAmountWizardFragment.Listener listener) { + super(); + sendListener = listener; } + private final SendAmountWizardFragment.Listener sendListener; + private TextView tvFunds; private ExchangeOtherEditText etAmount; @@ -72,8 +73,6 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { Timber.d("onCreateView() %s", (String.valueOf(savedInstanceState))); - sendListener = (SendAmountWizardFragment.Listener) getParentFragment(); - View view = inflater.inflate(R.layout.fragment_send_btc_amount, container, false); tvFunds = view.findViewById(R.id.tvFunds); @@ -83,6 +82,8 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { tvXmrToParms = view.findViewById(R.id.tvXmrToParms); + ((ImageView) view.findViewById(R.id.shiftIcon)).setImageResource(service.getIconId()); + etAmount = view.findViewById(R.id.etAmount); etAmount.requestFocus(); @@ -98,32 +99,19 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { if (orderParameters == null) { return false; // this should never happen } - if (sendListener != null) { - TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); - String btcString = etAmount.getNativeAmount(); - if (btcString != null) { - try { - double btc = Double.parseDouble(btcString); - Timber.d("setBtcAmount %f", btc); - txDataBtc.setBtcAmount(btc); - txDataBtc.setAmount(btc / orderParameters.getPrice()); - } catch (NumberFormatException ex) { - Timber.d(ex.getLocalizedMessage()); - txDataBtc.setBtcAmount(0); - } - } else { - txDataBtc.setBtcAmount(0); - } - } + final TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); + txDataBtc.setShiftAmount(etAmount.getPrimaryAmount()); return true; } - double maxBtc = 0; - double minBtc = 0; + private double maxBtc = 0; + private double minBtc = 0; @Override public void onPauseFragment() { + super.onPauseFragment(); llXmrToParms.setVisibility(View.INVISIBLE); + etAmount.setListener(null); } @Override @@ -131,8 +119,8 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { 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!"); + if (!btcSymbol.equalsIgnoreCase(ShiftService.ASSET.getSymbol())) + throw new IllegalStateException("Asset Symbol is wrong (" + btcSymbol + "!=" + ShiftService.ASSET.getSymbol() + ")"); final long funds = getTotalFunds(); if (!sendListener.getActivityCallback().isStreetMode()) { tvFunds.setText(getString(R.string.send_available, @@ -143,48 +131,131 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { getString(R.string.unknown_amount))); } etAmount.setAmount(""); + etAmount.setListener(this); final BarcodeData data = sendListener.popBarcodeData(); if (data != null) { - if (data.amount != null) { - etAmount.setAmount(data.amount); + if (data.getAmount() != null) { + etAmount.setAmount(data.getAmount()); } } etAmount.setBaseCurrency(btcSymbol); - callXmrTo(); + updateShift(); } long getTotalFunds() { return sendListener.getActivityCallback().getTotalFunds(); } + private final ShiftService service = ShiftService.DEFAULT; + private final PreShiftProcess preShiftProcess = service.createPreProcess(this); + private QueryOrderParameters orderParameters = null; - private void processOrderParms(final QueryOrderParameters orderParameters) { + private void reset() { + orderParameters = null; + maxBtc = 0; + minBtc = 0; + etAmount.setExchangeRate(0); + } + + private void updateShift() { + reset(); + getTxData().setShiftService(service); + llXmrToParms.setVisibility(View.INVISIBLE); + preShiftProcess.run(); + } + + private TxDataBtc getTxData() { + final TxData txData = sendListener.getTxData(); + if (txData instanceof TxDataBtc) { + return (TxDataBtc) txData; + } else { + throw new IllegalStateException("TxData not BTC"); + } + } + + private boolean isValid() { + return orderParameters != null; + } + + @Override + public CryptoAmount getAmount() { // of BTC + return etAmount.getPrimaryAmount(); + } + + public double getLowerLimit() { + if (!isValid()) throw new IllegalStateException(); + return orderParameters.getLowerLimit(); + } + + public double getPrice() { + if (!isValid()) throw new IllegalStateException(); + return orderParameters.getPrice(); + } + + public double getUpperLimit() { + if (!isValid()) throw new IllegalStateException(); + return orderParameters.getUpperLimit(); + } + + @Override + public void onOrderParametersError(final Exception ex) { + reset(); + Timber.e(ex); + requireView().post(() -> { + if (ex instanceof ShiftException) { + ShiftException xmrEx = (ShiftException) ex; + ShiftError xmrErr = xmrEx.getError(); + if (xmrErr != null) { + if (xmrErr.isRetryable()) { + evParams.showMessage(xmrErr.getType().toString(), xmrErr.getErrorMsg(), + getString(R.string.text_retry)); + evParams.setOnClickListener(v -> { + evParams.setOnClickListener(null); + updateShift(); + }); + } else { + evParams.showMessage(xmrErr.getType().toString(), xmrErr.getErrorMsg(), + getString(R.string.text_noretry, getTxData().getShiftService().getLabel())); + } + } else { + evParams.showMessage(getString(R.string.label_generic_xmrto_error), + getString(R.string.text_generic_xmrto_error, xmrEx.getCode()), + getString(R.string.text_noretry, getTxData().getShiftService().getLabel())); + } + } else { + evParams.showMessage(getString(R.string.label_generic_xmrto_error), + ex.getLocalizedMessage(), + getString(R.string.text_noretry, getTxData().getShiftService().getLabel())); + } + }); + } + + @Override + public void onOrderParametersReceived(QueryOrderParameters orderParameters) { + final double price = orderParameters.getPrice(); + maxBtc = price * orderParameters.getUpperLimit(); + minBtc = price * orderParameters.getLowerLimit(); this.orderParameters = orderParameters; - getView().post(() -> { - final double price = orderParameters.getPrice(); + requireView().post(() -> { etAmount.setExchangeRate(1 / price); - maxBtc = price * orderParameters.getUpperLimit(); - minBtc = price * orderParameters.getLowerLimit(); Timber.d("minBtc=%f / maxBtc=%f", minBtc, maxBtc); - NumberFormat df = NumberFormat.getInstance(Locale.US); - df.setMaximumFractionDigits(6); - String min = df.format(minBtc); - String max = df.format(maxBtc); - String rate = df.format(price); + final String min = AmountHelper.format_6(minBtc); + final String max = AmountHelper.format_6(maxBtc); + final String rate = AmountHelper.format_6(price); final TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); - Spanned xmrParmText = Html.fromHtml(getString(R.string.info_send_xmrto_parms, - min, max, rate, txDataBtc.getBtcSymbol())); + final Spanned xmrParmText = Html.fromHtml(getString(R.string.info_send_xmrto_parms, + min, max, rate, txDataBtc.getBtcSymbol(), service.getLabel())); tvXmrToParms.setText(xmrParmText); final long funds = getTotalFunds(); - double availableXmr = 1.0 * funds / Helper.ONE_XMR; + final double availableXmr = 1.0 * funds / Helper.ONE_XMR; String availBtcString; String availXmrString; if (!sendListener.getActivityCallback().isStreetMode()) { - availBtcString = df.format(availableXmr * price); - availXmrString = df.format(availableXmr); + availBtcString = AmountHelper.format_6(availableXmr * price); + availXmrString = AmountHelper.format_6(availableXmr); } else { availBtcString = getString(R.string.unknown_amount); availXmrString = availBtcString; @@ -198,66 +269,28 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { }); } - private void processOrderParmsError(final Exception ex) { - etAmount.setExchangeRate(0); - orderParameters = null; - maxBtc = 0; - minBtc = 0; - Timber.e(ex); - getView().post(() -> { - if (ex instanceof ShiftException) { - ShiftException xmrEx = (ShiftException) ex; - ShiftError xmrErr = xmrEx.getError(); - if (xmrErr != null) { - if (xmrErr.isRetryable()) { - evParams.showMessage(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(), - getString(R.string.text_retry)); - evParams.setOnClickListener(v -> { - evParams.setOnClickListener(null); - callXmrTo(); - }); - } else { - evParams.showMessage(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(), - getString(R.string.text_noretry)); - } - } else { - evParams.showMessage(getString(R.string.label_generic_xmrto_error), - getString(R.string.text_generic_xmrto_error, xmrEx.getCode()), - getString(R.string.text_noretry)); - } - } else { - evParams.showMessage(getString(R.string.label_generic_xmrto_error), - ex.getLocalizedMessage(), - getString(R.string.text_noretry)); - } - }); - } + @Override + public boolean isActive() { + return true; + } // TODO Test what happens if we swtich away while querying - private void callXmrTo() { + @Override + public void showProgress() { evParams.showProgress(getString(R.string.label_send_progress_queryparms)); - getXmrToApi().queryOrderParameters(new ShiftCallback() { - @Override - public void onSuccess(final QueryOrderParameters orderParameters) { - processOrderParms(orderParameters); - } - - @Override - public void onError(final Exception e) { - processOrderParmsError(e); - } - }); } - private SideShiftApi xmrToApi = null; + long lastRequest = 0; + final static long EXCHANGE_TIME = 750; //ms + final Handler handler = new Handler(Looper.getMainLooper()); - private SideShiftApi getXmrToApi() { - if (xmrToApi == null) { - synchronized (this) { - if (xmrToApi == null) { - xmrToApi = new SideShiftApiImpl(ServiceHelper.getXmrToBaseUrl()); - } + @Override + public void onExchangeRequested() { + final long now = System.currentTimeMillis(); + lastRequest = now; + handler.postDelayed(() -> { + if (now == lastRequest) { // otherwise we are superseded + updateShift(); } - } - return xmrToApi; + }, EXCHANGE_TIME); } } \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java index 6e45a915..e2cf7230 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java @@ -24,39 +24,36 @@ import android.widget.Button; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; + import com.m2049r.xmrwallet.R; 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.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.sideshift.network.SideShiftApiImpl; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.api.CreateOrder; +import com.m2049r.xmrwallet.service.shift.api.RequestQuote; +import com.m2049r.xmrwallet.service.shift.process.ShiftProcess; +import com.m2049r.xmrwallet.util.AmountHelper; import com.m2049r.xmrwallet.util.Helper; -import com.m2049r.xmrwallet.util.ServiceHelper; import com.m2049r.xmrwallet.widget.SendProgressView; -import java.text.NumberFormat; import java.util.Locale; import timber.log.Timber; -public class SendBtcConfirmWizardFragment extends SendWizardFragment implements SendConfirm { +public class SendBtcConfirmWizardFragment extends SendWizardFragment implements SendConfirm, Shifter { + public static SendBtcConfirmWizardFragment newInstance(SendConfirmWizardFragment.Listener listener) { SendBtcConfirmWizardFragment instance = new SendBtcConfirmWizardFragment(); - instance.setSendListener(listener); + instance.sendListener = listener; return instance; } - SendConfirmWizardFragment.Listener sendListener; - - public void setSendListener(SendConfirmWizardFragment.Listener listener) { - this.sendListener = listener; - } + private SendConfirmWizardFragment.Listener sendListener; private View llStageA; private SendProgressView evStageA; @@ -77,11 +74,12 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements private TextView tvTxChange; private View llPocketChange; + private TextView tvTxXmrToKeyLabel; + private TextView tvTxXmrToInfo; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - Timber.d("onCreateView(%s)", (String.valueOf(savedInstanceState))); View view = inflater.inflate( @@ -93,6 +91,10 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements tvTxBtcRate = view.findViewById(R.id.tvTxBtcRate); tvTxXmrToKey = view.findViewById(R.id.tvTxXmrToKey); + tvTxXmrToKeyLabel = view.findViewById(R.id.tvTxXmrToKeyLabel); + tvTxXmrToInfo = view.findViewById(R.id.tvTxXmrToInfo); + + tvTxFee = view.findViewById(R.id.tvTxFee); tvTxTotal = view.findViewById(R.id.tvTxTotal); tvTxChange = view.findViewById(R.id.tvTxChange); @@ -106,7 +108,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements evStageC = view.findViewById(R.id.evStageC); tvTxXmrToKey.setOnClickListener(v -> { - Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString()); + Helper.clipBoardCopy(requireActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString()); Toast.makeText(getActivity(), getString(R.string.message_copy_xmrtokey), Toast.LENGTH_SHORT).show(); }); @@ -125,68 +127,74 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements return view; } - int inProgress = 0; - final static int STAGE_X = 0; - final static int STAGE_A = 1; - final static int STAGE_B = 2; - final static int STAGE_C = 3; + @NonNull + Shifter.Stage inProgress = Stage.X; - private void showProgress(int stage, String progressText) { - Timber.d("showProgress(%d)", stage); - inProgress = stage; - switch (stage) { - case STAGE_A: - evStageA.showProgress(progressText); - break; - case STAGE_B: - evStageB.showProgress(progressText); - break; - case STAGE_C: - evStageC.showProgress(progressText); - break; - default: - throw new IllegalStateException("unknown stage " + stage); - } + @Override + public void showProgress(@NonNull Shifter.Stage stage) { + Timber.d("showProgress(%s)", stage); + requireView().post(() -> { + switch (stage) { + case A: + evStageA.showProgress(getString(R.string.label_send_progress_xmrto_create)); + break; + case B: + evStageB.showProgress(getString(R.string.label_send_progress_xmrto_query)); + break; + case C: + evStageC.showProgress(getString(R.string.label_send_progress_create_tx)); + break; + default: + throw new IllegalArgumentException("invalid stage " + stage); + } + inProgress = stage; + }); } public void hideProgress() { - Timber.d("hideProgress(%d)", inProgress); + Timber.d("hideProgress(%s)", inProgress); switch (inProgress) { - case STAGE_A: + case A: evStageA.hideProgress(); llStageA.setVisibility(View.VISIBLE); break; - case STAGE_B: + case B: evStageB.hideProgress(); + llStageA.setVisibility(View.VISIBLE); // show Stage A info when B is ready llStageB.setVisibility(View.VISIBLE); break; - case STAGE_C: + case C: evStageC.hideProgress(); llStageC.setVisibility(View.VISIBLE); break; - default: - throw new IllegalStateException("unknown stage " + inProgress); } - inProgress = STAGE_X; + inProgress = Stage.X; } - public void showStageError(String code, String message, String solution) { + private void showErrorMessage(String code, String message, String solution) { switch (inProgress) { - case STAGE_A: + case A: evStageA.showMessage(code, message, solution); break; - case STAGE_B: + case B: evStageB.showMessage(code, message, solution); break; - case STAGE_C: + case C: evStageC.showMessage(code, message, solution); break; default: - throw new IllegalStateException("unknown stage"); + throw new IllegalStateException("invalid stage"); } - inProgress = STAGE_X; + inProgress = Stage.X; } + public void showQuoteError() { + showErrorMessage(ShiftError.Type.SERVICE.toString(), + getString(R.string.shift_noquote), + getString(R.string.shift_checkamount)); + } + + PendingTransaction pendingTransaction = null; void send() { @@ -196,11 +204,8 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements Toast.makeText(getContext(), getString(R.string.send_xmrto_timeout), Toast.LENGTH_SHORT).show(); return; } - sendListener.getTxData().getUserNotes().setXmrtoOrder(xmrtoOrder); // note the transaction in the TX notes - ((TxDataBtc) sendListener.getTxData()).setXmrtoOrderId(xmrtoOrder.getOrderId()); // remember the order id for later - // TODO make method in TxDataBtc to set both of the above in one go sendListener.commitTransaction(); - getActivity().runOnUiThread(() -> pbProgressSend.setVisibility(View.VISIBLE)); + requireActivity().runOnUiThread(() -> pbProgressSend.setVisibility(View.VISIBLE)); } @Override @@ -209,15 +214,18 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements Toast.makeText(getContext(), getString(R.string.status_transaction_failed, error), Toast.LENGTH_LONG).show(); } + private String orderId = null; + @Override // callback from wallet when PendingTransaction created (started by prepareSend() here public void transactionCreated(final String txTag, final PendingTransaction pendingTransaction) { if (isResumed - && (inProgress == STAGE_C) - && (xmrtoOrder != null) - && (xmrtoOrder.getOrderId().equals(txTag))) { + && (inProgress == Stage.C) + && (orderId != null) + && (orderId.equals(txTag))) { this.pendingTransaction = pendingTransaction; - getView().post(() -> { + requireView().post(() -> { + Timber.d("transactionCreated"); hideProgress(); tvTxFee.setText(Wallet.getDisplayAmount(pendingTransaction.getFee())); tvTxTotal.setText(Wallet.getDisplayAmount( @@ -243,29 +251,35 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements if (pendingTransaction != null) { throw new IllegalStateException("pendingTransaction is not null"); } - showStageError(getString(R.string.send_create_tx_error_title), + showErrorMessage(getString(R.string.send_create_tx_error_title), errorText, getString(R.string.text_noretry_monero)); } - @Override - public boolean onValidateFields() { - return true; - } - private boolean isResumed = false; @Override public void onPauseFragment() { isResumed = false; + shiftProcess = null; stopSendTimer(); sendListener.disposeTransaction(); pendingTransaction = null; - inProgress = STAGE_X; + inProgress = Stage.X; + //TODO: maybe reset the progress messages updateSendButton(); super.onPauseFragment(); } + private TxDataBtc getTxData() { + final TxData txData = sendListener.getTxData(); + if (txData instanceof TxDataBtc) { + return (TxDataBtc) txData; + } else { + throw new IllegalStateException("TxData not BTC"); + } + } + @Override public void onResumeFragment() { super.onResumeFragment(); @@ -273,8 +287,9 @@ 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!"); + final String btcSymbol = getTxData().getBtcSymbol(); + if (!btcSymbol.equalsIgnoreCase(ShiftService.ASSET.getSymbol())) + throw new IllegalStateException("Asset Symbol is wrong (" + btcSymbol + "!=" + ShiftService.ASSET.getSymbol() + ")"); Helper.hideKeyboard(getActivity()); llStageA.setVisibility(View.INVISIBLE); evStageA.hideProgress(); @@ -282,9 +297,17 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements evStageB.hideProgress(); llStageC.setVisibility(View.INVISIBLE); evStageC.hideProgress(); + + if (shiftProcess != null) throw new IllegalStateException("shiftProcess not null"); + shiftProcess = getTxData().getShiftService().createProcess(this); + tvTxXmrToKeyLabel.setText(getString(R.string.label_send_btc_xmrto_key, shiftProcess.getService().getLabel())); + tvTxXmrToKeyLabel.setCompoundDrawablesRelativeWithIntrinsicBounds(shiftProcess.getService().getIconId(), 0, 0, 0); + tvTxXmrToInfo.setText(getString(R.string.label_send_btc_xmrto_info, shiftProcess.getService().getLabel())); + isResumed = true; - if ((pendingTransaction == null) && (inProgress == STAGE_X)) { - stageA(); + if ((pendingTransaction == null) && (inProgress == Stage.X)) { + Timber.d("Starting ShiftProcess"); + shiftProcess.run(getTxData()); } // otherwise just sit there blank // TODO: don't sit there blank - can this happen? should we just die? } @@ -310,19 +333,19 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements } int minutes = sendCountdown / 60; int seconds = sendCountdown % 60; - String t = String.format("%d:%02d", minutes, seconds); + String t = String.format(Locale.US, "%d:%02d", minutes, seconds); bSend.setText(getString(R.string.send_send_timed_label, t)); if (sendCountdown > 0) { sendCountdown -= XMRTO_COUNTDOWN_STEP; - getView().postDelayed(this, XMRTO_COUNTDOWN_STEP * 1000); + requireView().postDelayed(this, XMRTO_COUNTDOWN_STEP * 1000); } } }; - getView().post(updateRunnable); + requireView().post(updateRunnable); } void stopSendTimer() { - getView().removeCallbacks(updateRunnable); + requireView().removeCallbacks(updateRunnable); } void updateSendButton() { @@ -344,7 +367,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements } public void fail(String walletName) { - getActivity().runOnUiThread(() -> { + requireActivity().runOnUiThread(() -> { bSend.setEnabled(sendCountdown > 0); // allow to try again }); } @@ -353,211 +376,127 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements // creates a pending transaction and calls us back with transactionCreated() // or createTransactionFailed() - void prepareSend() { + public void prepareSend(CreateOrder order) { if (!isResumed) return; - if ((xmrtoOrder == null)) { - throw new IllegalStateException("xmrtoOrder is null"); + if ((order == null)) { + throw new IllegalStateException("order is null"); } - showProgress(3, getString(R.string.label_send_progress_create_tx)); - final TxData txData = sendListener.getTxData(); - txData.setDestination(xmrtoOrder.getXmrAddress()); - txData.setAmount(xmrtoOrder.getXmrAmount()); - getActivityCallback().onPrepareSend(xmrtoOrder.getOrderId(), txData); + showProgress(Stage.C); + orderId = order.getOrderId(); + final TxDataBtc txData = getTxData(); + txData.setDestination(order.getXmrAddress()); + txData.setAmount(order.getXmrAmount()); + txData.getUserNotes().setXmrtoOrder(order); // note the transaction in the TX notes + txData.setXmrtoOrderId(order.getOrderId()); // remember the order id for later + txData.setXmrtoQueryOrderToken(order.getQueryOrderId()); // remember the order id for later + getActivityCallback().onPrepareSend(order.getOrderId(), txData); } SendFragment.Listener getActivityCallback() { return sendListener.getActivityCallback(); } - private RequestQuote xmrtoQuote = null; + private ShiftProcess shiftProcess; - private void processStageA(final RequestQuote requestQuote) { - Timber.d("processCreateOrder %s", requestQuote.getId()); - TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); - // verify the BTC amount is correct - if (requestQuote.getBtcAmount() != txDataBtc.getBtcAmount()) { - Timber.d("Failed to get quote"); - getView().post(() -> showStageError(ShiftError.Error.SERVICE.toString(), - getString(R.string.shift_noquote), - getString(R.string.shift_checkamount))); - return; // just stop for now - } - xmrtoQuote = requestQuote; - txDataBtc.setAmount(xmrtoQuote.getXmrAmount()); - getView().post(() -> { - // show data from the actual quote as that is what is used to - NumberFormat df = NumberFormat.getInstance(Locale.US); - 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, txDataBtc.getBtcSymbol())); - final String xmrPriceBtc = df.format(xmrtoQuote.getPrice()); - tvTxBtcRate.setText(getString(R.string.text_send_btc_rate, xmrPriceBtc, txDataBtc.getBtcSymbol())); - hideProgress(); - }); - stageB(requestQuote.getId()); + public void showQuote(double btcAmount, double xmrAmount, double price) { + final String symbol = getTxData().getBtcSymbol(); + tvTxBtcAmount.setText(getString(R.string.text_send_btc_amount, + AmountHelper.format(btcAmount), AmountHelper.format(xmrAmount), symbol)); + tvTxBtcRate.setText(getString(R.string.text_send_btc_rate, AmountHelper.format(price), symbol)); } - private void processStageAError(final Exception ex) { + // Shifter + public void onQuoteReceived(RequestQuote quote) { + requireView().post(() -> { + Timber.d("onQuoteReceived"); + showQuote(quote.getBtcAmount(), quote.getXmrAmount(), quote.getPrice()); + hideProgress(); + }); + } + + public void onQuoteError(final Exception ex) { Timber.e("processStageAError %s", ex.getLocalizedMessage()); - getView().post(() -> { + requireView().post(() -> { if (ex instanceof ShiftException) { ShiftException xmrEx = (ShiftException) ex; ShiftError xmrErr = xmrEx.getError(); if (xmrErr != null) { if (xmrErr.isRetryable()) { - showStageError(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(), + showErrorMessage(xmrErr.getType().toString(), xmrErr.getErrorMsg(), getString(R.string.text_retry)); evStageA.setOnClickListener(v -> { evStageA.setOnClickListener(null); - stageA(); + shiftProcess.restart(); }); } else { - showStageError(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(), - getString(R.string.text_noretry)); + showErrorMessage(xmrErr.getType().toString(), xmrErr.getErrorMsg(), + getString(R.string.text_noretry, getTxData().getShiftService().getLabel())); } } else { - showStageError(getString(R.string.label_generic_xmrto_error), + showErrorMessage(getString(R.string.label_generic_xmrto_error), getString(R.string.text_generic_xmrto_error, xmrEx.getCode()), - getString(R.string.text_noretry)); + getString(R.string.text_noretry, getTxData().getShiftService().getLabel())); } } else { evStageA.showMessage(getString(R.string.label_generic_xmrto_error), ex.getLocalizedMessage(), - getString(R.string.text_noretry)); + getString(R.string.text_noretry, getTxData().getShiftService().getLabel())); } }); } - private void stageA() { - if (!isResumed) return; - Timber.d("Request Quote"); - xmrtoQuote = null; - xmrtoOrder = null; - showProgress(1, getString(R.string.label_send_progress_xmrto_create)); - TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); - - ShiftCallback callback = new ShiftCallback() { - @Override - public void onSuccess(RequestQuote requestQuote) { - if (!isResumed) return; - if (xmrtoQuote != null) { - Timber.w("another ongoing request quote request"); - return; - } - processStageA(requestQuote); - } - - @Override - public void onError(Exception ex) { - if (!isResumed) return; - if (xmrtoQuote != null) { - Timber.w("another ongoing request quote request"); - return; - } - processStageAError(ex); - } - }; - - getXmrToApi().requestQuote(txDataBtc.getBtcAmount(), callback); + @Override + public boolean isActive() { + return isResumed; } - private CreateOrder xmrtoOrder = null; - - private void processStageB(final CreateOrder order) { - Timber.d("processCreateOrder %s for %s", order.getOrderId(), order.getQuoteId()); - TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); - // verify amount & destination - if ((order.getBtcAmount() != txDataBtc.getBtcAmount()) - || (!txDataBtc.validateAddress(order.getBtcAddress()))) { - throw new IllegalStateException("Order does not fulfill quote!"); // something is terribly wrong - die - } - xmrtoOrder = order; - getView().post(() -> { + public void onOrderCreated(CreateOrder order) { + requireView().post(() -> { + showQuote(order.getBtcAmount(), order.getXmrAmount(), order.getBtcAmount() / order.getXmrAmount()); tvTxXmrToKey.setText(order.getOrderId()); tvTxBtcAddress.setText(order.getBtcAddress()); - tvTxBtcAddressLabel.setText(getString(R.string.label_send_btc_address, txDataBtc.getBtcSymbol())); + tvTxBtcAddressLabel.setText(getString(R.string.label_send_btc_address, order.getBtcCurrency())); + Timber.d("onOrderCreated"); hideProgress(); Timber.d("Expires @ %s", order.getExpiresAt().toString()); final int timeout = (int) (order.getExpiresAt().getTime() - order.getCreatedAt().getTime()) / 1000 - 60; // -1 minute buffer startSendTimer(timeout); - prepareSend(); + prepareSend(order); }); } - private void processStageBError(final Exception ex) { - Timber.e("processCreateOrderError %s", ex.getLocalizedMessage()); - getView().post(() -> { + public void onOrderError(final Exception ex) { + Timber.e("onOrderError %s", ex.getLocalizedMessage()); + requireView().post(() -> { if (ex instanceof ShiftException) { ShiftException xmrEx = (ShiftException) ex; ShiftError xmrErr = xmrEx.getError(); if (xmrErr != null) { if (xmrErr.isRetryable()) { - showStageError(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(), + showErrorMessage(xmrErr.getType().toString(), xmrErr.getErrorMsg(), getString(R.string.text_retry)); evStageB.setOnClickListener(v -> { evStageB.setOnClickListener(null); - stageB(xmrtoOrder.getOrderId()); + shiftProcess.retryCreateOrder(); }); } else { - showStageError(xmrErr.getErrorType().toString(), xmrErr.getErrorMsg(), - getString(R.string.text_noretry)); + showErrorMessage(xmrErr.getType().toString(), xmrErr.getErrorMsg(), null); } } else { - showStageError(getString(R.string.label_generic_xmrto_error), + showErrorMessage(getString(R.string.label_generic_xmrto_error), getString(R.string.text_generic_xmrto_error, xmrEx.getCode()), - getString(R.string.text_noretry)); + getString(R.string.text_noretry, getTxData().getShiftService().getLabel())); } } else { evStageB.showMessage(getString(R.string.label_generic_xmrto_error), ex.getLocalizedMessage(), - getString(R.string.text_noretry)); + getString(R.string.text_noretry, getTxData().getShiftService().getLabel())); } }); } - private void stageB(final String quoteId) { - Timber.d("createOrder(%s)", quoteId); - if (!isResumed) return; - final String btcAddress = ((TxDataBtc) sendListener.getTxData()).getBtcAddress(); - getView().post(() -> { - xmrtoOrder = null; - showProgress(2, getString(R.string.label_send_progress_xmrto_query)); - getXmrToApi().createOrder(quoteId, btcAddress, new ShiftCallback() { - @Override - public void onSuccess(CreateOrder order) { - if (!isResumed) return; - if (xmrtoQuote == null) return; - if (!order.getQuoteId().equals(xmrtoQuote.getId())) { - Timber.d("Quote ID does not match"); - // ignore (we got a response to a stale request) - return; - } - if (xmrtoOrder != null) - throw new IllegalStateException("xmrtoOrder must be null here!"); - processStageB(order); - } - - @Override - public void onError(Exception ex) { - if (!isResumed) return; - processStageBError(ex); - } - }); - }); - } - - private SideShiftApi xmrToApi = null; - - private SideShiftApi getXmrToApi() { - if (xmrToApi == null) { - synchronized (this) { - if (xmrToApi == null) { - xmrToApi = new SideShiftApiImpl(ServiceHelper.getXmrToBaseUrl()); - } - } - } - return xmrToApi; + @Override + public void invalidateShift() { + orderId = null; } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java index 5c5b4a7b..3e9afd44 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java @@ -18,7 +18,6 @@ package com.m2049r.xmrwallet.fragment.send; import android.content.Intent; import android.graphics.Paint; -import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -32,16 +31,17 @@ 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.TxData; import com.m2049r.xmrwallet.data.TxDataBtc; import com.m2049r.xmrwallet.service.shift.ShiftCallback; import com.m2049r.xmrwallet.service.shift.ShiftException; -import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderStatus; -import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; -import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderStatus; +import com.m2049r.xmrwallet.service.shift.api.ShiftApi; import com.m2049r.xmrwallet.util.Helper; -import com.m2049r.xmrwallet.util.ServiceHelper; import com.m2049r.xmrwallet.util.ThemeHelper; +import java.net.SocketTimeoutException; import java.text.NumberFormat; import java.util.Locale; @@ -51,15 +51,11 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { public static SendBtcSuccessWizardFragment newInstance(SendSuccessWizardFragment.Listener listener) { SendBtcSuccessWizardFragment instance = new SendBtcSuccessWizardFragment(); - instance.setSendListener(listener); + instance.sendListener = listener; return instance; } - SendSuccessWizardFragment.Listener sendListener; - - public void setSendListener(SendSuccessWizardFragment.Listener listener) { - this.sendListener = listener; - } + private SendSuccessWizardFragment.Listener sendListener; ImageButton bCopyTxId; private TextView tvTxId; @@ -80,6 +76,7 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { Bundle savedInstanceState) { Timber.d("onCreateView() %s", (String.valueOf(savedInstanceState))); + final ShiftService shiftService = getTxData().getShiftService(); View view = inflater.inflate( R.layout.fragment_send_btc_success, container, false); @@ -87,7 +84,7 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { bCopyTxId = view.findViewById(R.id.bCopyTxId); bCopyTxId.setEnabled(false); bCopyTxId.setOnClickListener(v -> { - Helper.clipBoardCopy(getActivity(), getString(R.string.label_send_txid), tvTxId.getText().toString()); + Helper.clipBoardCopy(requireActivity(), getString(R.string.label_send_txid), tvTxId.getText().toString()); Toast.makeText(getActivity(), getString(R.string.message_copy_txid), Toast.LENGTH_SHORT).show(); }); @@ -105,23 +102,22 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { pbXmrto = view.findViewById(R.id.pbXmrto); pbXmrto.getIndeterminateDrawable().setColorFilter(0x61000000, android.graphics.PorterDuff.Mode.MULTIPLY); + final TextView tvXmrToLabel = view.findViewById(R.id.tvXmrToLabel); + tvXmrToLabel.setText(getString(R.string.info_send_xmrto_success_order_label, shiftService.getLabel())); + tvTxXmrToKey = view.findViewById(R.id.tvTxXmrToKey); tvTxXmrToKey.setOnClickListener(v -> { - Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString()); + Helper.clipBoardCopy(requireActivity(), getString(R.string.label_copy_xmrtokey), tvTxXmrToKey.getText().toString()); Toast.makeText(getActivity(), getString(R.string.message_copy_xmrtokey), Toast.LENGTH_SHORT).show(); }); tvXmrToSupport = view.findViewById(R.id.tvXmrToSupport); tvXmrToSupport.setPaintFlags(tvXmrToSupport.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); + tvXmrToSupport.setText(getString(R.string.label_send_btc_xmrto_info, shiftService.getLabel())); return view; } - @Override - public boolean onValidateFields() { - return true; - } - private boolean isResumed = false; @Override @@ -130,7 +126,15 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { super.onPauseFragment(); } - TxDataBtc btcData = null; + private TxDataBtc getTxData() { + final TxData txData = sendListener.getTxData(); + if (txData == null) throw new IllegalStateException("TxDataBtc is null"); + if (txData instanceof TxDataBtc) { + return (TxDataBtc) txData; + } else { + throw new IllegalStateException("TxData not BTC"); + } + } @Override public void onResumeFragment() { @@ -139,8 +143,8 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { Helper.hideKeyboard(getActivity()); isResumed = true; - btcData = (TxDataBtc) sendListener.getTxData(); - tvTxAddress.setText(btcData.getDestination()); + final TxDataBtc txData = getTxData(); + tvTxAddress.setText(txData.getDestination()); final PendingTx committedTx = sendListener.getCommittedTx(); if (committedTx != null) { @@ -148,45 +152,41 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { bCopyTxId.setEnabled(true); tvTxAmount.setText(getString(R.string.send_amount, Helper.getDisplayAmount(committedTx.amount))); tvTxFee.setText(getString(R.string.send_fee, Helper.getDisplayAmount(committedTx.fee))); - if (btcData != null) { - 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, 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); - startActivity(intent); - }); - queryOrder(); - } else { - throw new IllegalStateException("btcData is null"); - } + NumberFormat df = NumberFormat.getInstance(Locale.US); + df.setMaximumFractionDigits(12); + String btcAmount = df.format(txData.getBtcAmount()); + tvXmrToAmount.setText(getString(R.string.info_send_xmrto_success_btc, btcAmount, txData.getBtcSymbol())); + //TODO btcData.getBtcAddress(); + tvTxXmrToKey.setText(txData.getXmrtoOrderId()); + final Crypto crypto = Crypto.withSymbol(txData.getBtcSymbol()); + assert crypto != null; + ivXmrToIcon.setImageResource(crypto.getIconEnabledId()); + tvXmrToSupport.setOnClickListener(v -> { + startActivity(new Intent(Intent.ACTION_VIEW, txData.getShiftService().getShiftApi().getQueryOrderUri(txData.getXmrtoOrderId()))); + }); + queryOrder(); } sendListener.enableDone(); } private void processQueryOrder(final QueryOrderStatus status) { - Timber.d("processQueryOrder %s for %s", status.getState().toString(), status.getOrderId()); - if (!btcData.getXmrtoOrderId().equals(status.getOrderId())) + Timber.d("processQueryOrder %s for %s", status.getStatus().toString(), status.getOrderId()); + if (!getTxData().getXmrtoOrderId().equals(status.getOrderId())) throw new IllegalStateException("UUIDs do not match!"); if (isResumed && (getView() != null)) getView().post(() -> { showXmrToStatus(status); if (!status.isTerminal()) { - getView().postDelayed(this::queryOrder, SideShiftApi.QUERY_INTERVAL); + getView().postDelayed(this::queryOrder, ShiftApi.QUERY_INTERVAL); } }); } private void queryOrder() { + final TxDataBtc btcData = getTxData(); Timber.d("queryOrder(%s)", btcData.getXmrtoOrderId()); if (!isResumed) return; - getXmrToApi().queryOrderStatus(btcData.getXmrtoOrderId(), new ShiftCallback() { + btcData.getShiftService().getShiftApi().queryOrderStatus(btcData.getXmrtoQueryOrderToken(), new ShiftCallback() { @Override public void onSuccess(QueryOrderStatus status) { if (!isAdded()) return; @@ -197,45 +197,54 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { public void onError(final Exception ex) { if (!isResumed) return; Timber.w(ex); - getActivity().runOnUiThread(() -> { - if (ex instanceof ShiftException) { - Toast.makeText(getActivity(), ((ShiftException) ex).getError().getErrorMsg(), Toast.LENGTH_LONG).show(); - } else { - Toast.makeText(getActivity(), ex.getLocalizedMessage(), Toast.LENGTH_LONG).show(); - } - }); + if (ex instanceof SocketTimeoutException) { + // try again + if (isResumed && (getView() != null)) + getView().post(() -> { + getView().postDelayed(SendBtcSuccessWizardFragment.this::queryOrder, ShiftApi.QUERY_INTERVAL); + }); + } else { + requireActivity().runOnUiThread(() -> { + if (ex instanceof ShiftException) { + Toast.makeText(getActivity(), ((ShiftException) ex).getErrorMessage(), Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(getActivity(), ex.getLocalizedMessage(), Toast.LENGTH_LONG).show(); + } + }); + } } }); } void showXmrToStatus(final QueryOrderStatus status) { int statusResource = 0; + final TxDataBtc txData = getTxData(); if (status.isError()) { - tvXmrToStatus.setText(getString(R.string.info_send_xmrto_error, status.toString())); + tvXmrToStatus.setText(getString(R.string.info_send_xmrto_error, txData.getShiftService().getLabel(), status.toString())); statusResource = R.drawable.ic_error_red_24dp; pbXmrto.getIndeterminateDrawable().setColorFilter( - ThemeHelper.getThemedColor(getContext(), android.R.attr.colorError), + ThemeHelper.getThemedColor(requireContext(), R.attr.negativeColor), android.graphics.PorterDuff.Mode.MULTIPLY); } else if (status.isSent() || status.isPaid()) { - tvXmrToStatus.setText(getString(R.string.info_send_xmrto_sent, btcData.getBtcSymbol())); + tvXmrToStatus.setText(getString(R.string.info_send_xmrto_sent, txData.getBtcSymbol())); statusResource = R.drawable.ic_success; pbXmrto.getIndeterminateDrawable().setColorFilter( - ThemeHelper.getThemedColor(getContext(), R.attr.positiveColor), + ThemeHelper.getThemedColor(requireContext(), R.attr.positiveColor), android.graphics.PorterDuff.Mode.MULTIPLY); } else if (status.isWaiting()) { tvXmrToStatus.setText(getString(R.string.info_send_xmrto_unpaid)); statusResource = R.drawable.ic_pending; pbXmrto.getIndeterminateDrawable().setColorFilter( - ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor), + ThemeHelper.getThemedColor(requireContext(), R.attr.neutralColor), android.graphics.PorterDuff.Mode.MULTIPLY); } else if (status.isPending()) { tvXmrToStatus.setText(getString(R.string.info_send_xmrto_paid)); statusResource = R.drawable.ic_pending; pbXmrto.getIndeterminateDrawable().setColorFilter( - ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor), + ThemeHelper.getThemedColor(requireContext(), R.attr.neutralColor), android.graphics.PorterDuff.Mode.MULTIPLY); } else { - throw new IllegalStateException("status is broken: " + status.toString()); + throw new IllegalStateException("status is broken: " + status); } ivXmrToStatus.setImageResource(statusResource); if (status.isTerminal()) { @@ -246,17 +255,4 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { ivXmrToStatusBig.setVisibility(View.VISIBLE); } } - - private SideShiftApi xmrToApi = null; - - private SideShiftApi getXmrToApi() { - if (xmrToApi == null) { - synchronized (this) { - if (xmrToApi == null) { - xmrToApi = new SideShiftApiImpl(ServiceHelper.getXmrToBaseUrl()); - } - } - } - return xmrToApi; - } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java index 6fefec7b..6599941e 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java @@ -38,18 +38,13 @@ public class SendConfirmWizardFragment extends SendWizardFragment implements Sen public static SendConfirmWizardFragment newInstance(Listener listener) { SendConfirmWizardFragment instance = new SendConfirmWizardFragment(); - instance.setSendListener(listener); + instance.sendListener = listener; return instance; } - Listener sendListener; + private Listener sendListener; - public SendConfirmWizardFragment setSendListener(Listener listener) { - this.sendListener = listener; - return this; - } - - interface Listener { + public interface Listener { SendFragment.Listener getActivityCallback(); TxData getTxData(); @@ -137,7 +132,7 @@ public class SendConfirmWizardFragment extends SendWizardFragment implements Sen void send() { sendListener.commitTransaction(); - getActivity().runOnUiThread(() -> pbProgressSend.setVisibility(View.VISIBLE)); + requireActivity().runOnUiThread(() -> pbProgressSend.setVisibility(View.VISIBLE)); } @Override @@ -153,7 +148,7 @@ public class SendConfirmWizardFragment extends SendWizardFragment implements Sen } private void showAlert(String title, String message) { - AlertDialog.Builder builder = new MaterialAlertDialogBuilder(getActivity()); + AlertDialog.Builder builder = new MaterialAlertDialogBuilder(requireActivity()); builder.setCancelable(true). setTitle(title). setMessage(message). @@ -235,7 +230,7 @@ public class SendConfirmWizardFragment extends SendWizardFragment implements Sen } public void fail(String walletName) { - getActivity().runOnUiThread(() -> { + requireActivity().runOnUiThread(() -> { bSend.setEnabled(true); // allow to try again }); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java index 877f84d6..1ba82606 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java @@ -56,6 +56,7 @@ import com.m2049r.xmrwallet.widget.Toolbar; import java.lang.ref.WeakReference; +import lombok.Getter; import timber.log.Timber; public class SendFragment extends Fragment @@ -67,6 +68,7 @@ public class SendFragment extends Fragment final static public int MIXIN = 0; + @Getter private Listener activityCallback; public interface Listener { @@ -273,7 +275,7 @@ public class SendFragment extends Fragment return false; } - enum Mode { + public enum Mode { XMR, BTC } @@ -293,7 +295,7 @@ public class SendFragment extends Fragment default: throw new IllegalArgumentException("Mode " + String.valueOf(aMode) + " unknown!"); } - getView().post(() -> pagerAdapter.notifyDataSetChanged()); + requireView().post(() -> pagerAdapter.notifyDataSetChanged()); Timber.d("New Mode = %s", mode.toString()); } } @@ -478,11 +480,6 @@ public class SendFragment extends Fragment bDone.setVisibility(View.VISIBLE); } - public Listener getActivityCallback() { - return activityCallback; - } - - // callbacks from send service public void onTransactionCreated(final String txTag, final PendingTransaction pendingTransaction) { @@ -502,12 +499,9 @@ public class SendFragment extends Fragment activityCallback.onDisposeRequest(); } + @Getter PendingTx pendingTx; - public PendingTx getPendingTx() { - return pendingTx; - } - public void onCreateTransactionFailed(String errorText) { final SendConfirm confirm = getSendConfirm(); if (confirm != null) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSuccessWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSuccessWizardFragment.java index 1d3c73f1..a0eb6f8f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSuccessWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendSuccessWizardFragment.java @@ -36,18 +36,13 @@ public class SendSuccessWizardFragment extends SendWizardFragment { public static SendSuccessWizardFragment newInstance(Listener listener) { SendSuccessWizardFragment instance = new SendSuccessWizardFragment(); - instance.setSendListener(listener); + instance.sendListener = listener; return instance; } - Listener sendListener; + private Listener sendListener; - public SendSuccessWizardFragment setSendListener(Listener listener) { - this.sendListener = listener; - return this; - } - - interface Listener { + public interface Listener { TxData getTxData(); PendingTx getCommittedTx(); @@ -62,7 +57,6 @@ public class SendSuccessWizardFragment extends SendWizardFragment { ImageButton bCopyTxId; private TextView tvTxId; private TextView tvTxAddress; - private TextView tvTxPaymentId; private TextView tvTxAmount; private TextView tvTxFee; @@ -78,13 +72,12 @@ public class SendSuccessWizardFragment extends SendWizardFragment { bCopyTxId = view.findViewById(R.id.bCopyTxId); bCopyTxId.setEnabled(false); bCopyTxId.setOnClickListener(v -> { - Helper.clipBoardCopy(getActivity(), getString(R.string.label_send_txid), tvTxId.getText().toString()); + Helper.clipBoardCopy(requireActivity(), getString(R.string.label_send_txid), tvTxId.getText().toString()); Toast.makeText(getActivity(), getString(R.string.message_copy_txid), Toast.LENGTH_SHORT).show(); }); 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); diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/Shifter.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/Shifter.java new file mode 100644 index 00000000..bccf552e --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/Shifter.java @@ -0,0 +1,26 @@ +package com.m2049r.xmrwallet.fragment.send; + +import com.m2049r.xmrwallet.service.shift.api.CreateOrder; +import com.m2049r.xmrwallet.service.shift.api.RequestQuote; + +public interface Shifter { + void invalidateShift(); + + void onQuoteError(final Exception ex); + + void showQuoteError(); + + void onQuoteReceived(RequestQuote quote); + + void onOrderCreated(CreateOrder order); + + void onOrderError(final Exception ex); + + boolean isActive(); + + void showProgress(Shifter.Stage stage); + + enum Stage { + X, A, B, C + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/BluetoothInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/BluetoothInfoAdapter.java index 687f5eb7..b44962c9 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/layout/BluetoothInfoAdapter.java +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/BluetoothInfoAdapter.java @@ -16,6 +16,7 @@ package com.m2049r.xmrwallet.layout; +import android.annotation.SuppressLint; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -107,6 +108,7 @@ public class BluetoothInfoAdapter extends RecyclerView.Adapter { + @SuppressLint("SimpleDateFormat") private final static SimpleDateFormat DATETIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm"); private final int outboundColour; @@ -156,7 +158,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter { + @SuppressLint("SimpleDateFormat") private final SimpleDateFormat DATETIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm"); public interface OnInteractionListener { @@ -120,7 +122,7 @@ public class WalletInfoAdapter extends RecyclerView.Adapter possibleAssets = new HashSet<>(); + + static { + assert DEFAULT.enabled; + for (ShiftService service : values()) { + if (!service.enabled) continue; + final String[] assets = service.getAssets().split(":"); + for (String anAsset : assets) { + possibleAssets.add(Crypto.withSymbol(anAsset)); + } + } + } + + public static boolean isAssetSupported(@NonNull Crypto crypto) { + return possibleAssets.contains(crypto); + } + + public static boolean isAssetSupported(@NonNull String symbol) { + final Crypto crypto = Crypto.withSymbol(symbol); + if (crypto != null) { + return isAssetSupported(crypto); + } + return false; + } + + public boolean supportsAsset(@NonNull Crypto crypto) { + return assets.contains(crypto.getSymbol()); + } + + public boolean supportsAsset(@NonNull String symbol) { + final Crypto crypto = Crypto.withSymbol(symbol); + if (crypto != null) { + return supportsAsset(crypto); + } + return false; + } + + public ShiftProcess createProcess(Shifter shifter) { + return new Process(this, shifter); + } + + public PreShiftProcess createPreProcess(PreShifter shifter) { + return new PreProcess(this, shifter); + } + + public enum Type { + ONESTEP, TWOSTEP; + } + + public static Crypto ASSET = null; // keep asset to exchange globally +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftType.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftType.java new file mode 100644 index 00000000..a1a0f419 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/ShiftType.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024 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.service.shift; + +public enum ShiftType { + FIXED, FLOAT; +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/CreateOrder.java similarity index 78% rename from app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java rename to app/src/main/java/com/m2049r/xmrwallet/service/shift/api/CreateOrder.java index f738956b..f41d81cd 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/CreateOrder.java @@ -14,12 +14,14 @@ * limitations under the License. */ -package com.m2049r.xmrwallet.service.shift.sideshift.api; +package com.m2049r.xmrwallet.service.shift.api; + +import com.m2049r.xmrwallet.service.shift.ShiftType; import java.util.Date; public interface CreateOrder { - String TAG = "side"; + String getTag(); String getBtcCurrency(); @@ -35,8 +37,11 @@ public interface CreateOrder { String getXmrAddress(); - Date getCreatedAt(); // createdAt + Date getCreatedAt(); - Date getExpiresAt(); // expiresAt + Date getExpiresAt(); + String getQueryOrderId(); + + ShiftType getType(); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderParameters.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/QueryOrderParameters.java similarity index 81% rename from app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderParameters.java rename to app/src/main/java/com/m2049r/xmrwallet/service/shift/api/QueryOrderParameters.java index ebd2d2fe..9119b334 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderParameters.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/QueryOrderParameters.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package com.m2049r.xmrwallet.service.shift.sideshift.api; +package com.m2049r.xmrwallet.service.shift.api; public interface QueryOrderParameters { - double getLowerLimit(); + double getLowerLimit(); // XMR - double getPrice(); + double getPrice(); // BTC/XMR - double getUpperLimit(); + double getUpperLimit(); // XMR } diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/QueryOrderStatus.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/QueryOrderStatus.java new file mode 100644 index 00000000..d80ca36b --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/QueryOrderStatus.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2017-2021 m2049r et 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.service.shift.api; + +import androidx.annotation.Nullable; + +import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class QueryOrderStatus { + final String orderId; + final Status status; + final String btcCurrency; + final double btcAmount; + final String btcAddress; + final double xmrAmount; + final String xmrAddress; + @Nullable + final Date createdAt; + @Nullable + final Date expiresAt; + + public double getPrice() { + return btcAmount / xmrAmount; + } + + public boolean isError() { + return status.isError(); + } + + public boolean isTerminal() { + return status.isTerminal(); + } + + public boolean isWaiting() { + return status.isWaiting(); + } + + public boolean isPending() { + return status.isPending(); + } + + public boolean isSent() { + return status.isSent(); + } + + public boolean isPaid() { + return status.isPaid(); + } + + public enum Status { + WAITING, // Waiting for mempool + PENDING, // Detected (waiting for confirmations) + SETTLING, // Settlement in progress + SETTLED, // Settlement completed + // no refunding in monerujo so these are ignored: +// REFUND, // Queued for refund +// REFUNDING, // Refund in progress +// REFUNDED // Refund completed + UNDEFINED, + EXPIRED, + ERROR; // Something went wrong and the user needs to interact with the provider + + public boolean isError() { + return this == Status.UNDEFINED || this == Status.ERROR || this == Status.EXPIRED; + } + + public boolean isTerminal() { + return (this == Status.SETTLED) || isError(); + } + + public boolean isWaiting() { + return this == Status.WAITING; + } + + public boolean isPending() { + return this == Status.PENDING; + } + + public boolean isSent() { + return this == Status.SETTLING; + } + + public boolean isPaid() { + return this == Status.SETTLED; + } + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/RequestQuote.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/RequestQuote.java similarity index 77% rename from app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/RequestQuote.java rename to app/src/main/java/com/m2049r/xmrwallet/service/shift/api/RequestQuote.java index cbbb36fb..56f63300 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/RequestQuote.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/RequestQuote.java @@ -14,13 +14,17 @@ * limitations under the License. */ -package com.m2049r.xmrwallet.service.shift.sideshift.api; +package com.m2049r.xmrwallet.service.shift.api; + +import com.m2049r.xmrwallet.service.shift.ShiftType; import java.util.Date; public interface RequestQuote { - double getBtcAmount(); // settleAmount + double getBtcAmount(); // what we want to receive + + double getXmrAmount(); // the XMR we need to send String getId(); // id @@ -28,7 +32,7 @@ public interface RequestQuote { Date getExpiresAt(); // expiresAt - double getXmrAmount(); // depositAmount - double getPrice(); // rate + + ShiftType getType(); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/ShiftApi.java similarity index 66% rename from app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java rename to app/src/main/java/com/m2049r/xmrwallet/service/shift/api/ShiftApi.java index 6c9331c9..e62138a9 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/api/ShiftApi.java @@ -14,15 +14,17 @@ * limitations under the License. */ -package com.m2049r.xmrwallet.service.shift.sideshift.api; +package com.m2049r.xmrwallet.service.shift.api; import android.net.Uri; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.m2049r.xmrwallet.data.CryptoAmount; import com.m2049r.xmrwallet.service.shift.ShiftCallback; -public interface SideShiftApi { +public interface ShiftApi { int QUERY_INTERVAL = 5000; // ms /** @@ -30,22 +32,23 @@ public interface SideShiftApi { * * @param callback the callback with the OrderParameter object */ - void queryOrderParameters(@NonNull final ShiftCallback callback); + void queryOrderParameters(@NonNull final CryptoAmount btcAmount, @NonNull final ShiftCallback callback); /** * Creates an order * - * @param xmrAmount the desired XMR amount + * @param btcAddress destination + * @param btcAmount the desired amount to send */ - void requestQuote(final double xmrAmount, @NonNull final ShiftCallback callback); + void requestQuote(@Nullable final String btcAddress, @NonNull final CryptoAmount btcAmount, @NonNull final ShiftCallback callback); /** * Creates an order * - * @param quoteId the desired XMR amount + * @param quote the quote from {@link #requestQuote(String, CryptoAmount, ShiftCallback)} * @param btcAddress the target bitcoin address */ - void createOrder(final String quoteId, @NonNull final String btcAddress, @NonNull final ShiftCallback callback); + void createOrder(final RequestQuote quote, @NonNull final String btcAddress, @NonNull final ShiftCallback callback); /** * Queries the order status for given current order diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/PreProcess.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/PreProcess.java new file mode 100644 index 00000000..f0f8486d --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/PreProcess.java @@ -0,0 +1,53 @@ +package com.m2049r.xmrwallet.service.shift.process; + +import com.m2049r.xmrwallet.data.CryptoAmount; +import com.m2049r.xmrwallet.fragment.send.PreShifter; +import com.m2049r.xmrwallet.service.shift.ShiftCallback; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderParameters; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import timber.log.Timber; + +@RequiredArgsConstructor +public class PreProcess implements PreShiftProcess { + @Getter + final private ShiftService service; + final private PreShifter preshifter; + + @Override + public void run() { + getOrderParameters(); + } + + @Override + public void restart() { + run(); + } + + private void getOrderParameters() { + Timber.d("getOrderParameters"); + if (!preshifter.isActive()) return; + preshifter.showProgress(); + final CryptoAmount btcAmount = preshifter.getAmount(); + service.getShiftApi().queryOrderParameters(btcAmount, new ShiftCallback() { + @Override + public void onSuccess(final QueryOrderParameters orderParameters) { + if (!preshifter.isActive()) return; + onOrderParametersReceived(orderParameters); + } + + @Override + public void onError(final Exception ex) { + if (!preshifter.isActive()) return; + preshifter.onOrderParametersError(ex); + } + }); + } + + private void onOrderParametersReceived(final QueryOrderParameters orderParameters) { + Timber.d("onOrderParmsReceived %f", orderParameters.getPrice()); + preshifter.onOrderParametersReceived(orderParameters); + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/PreShiftProcess.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/PreShiftProcess.java new file mode 100644 index 00000000..e32a56d3 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/PreShiftProcess.java @@ -0,0 +1,11 @@ +package com.m2049r.xmrwallet.service.shift.process; + +import com.m2049r.xmrwallet.service.shift.ShiftService; + +public interface PreShiftProcess { + ShiftService getService(); + + void run(); + + void restart(); +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/Process.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/Process.java new file mode 100644 index 00000000..38517374 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/Process.java @@ -0,0 +1,178 @@ +package com.m2049r.xmrwallet.service.shift.process; + +import com.m2049r.xmrwallet.data.Crypto; +import com.m2049r.xmrwallet.data.TxDataBtc; +import com.m2049r.xmrwallet.fragment.send.Shifter; +import com.m2049r.xmrwallet.service.shift.ShiftCallback; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.ShiftType; +import com.m2049r.xmrwallet.service.shift.api.CreateOrder; +import com.m2049r.xmrwallet.service.shift.api.RequestQuote; + +import java.util.Date; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import timber.log.Timber; + +@RequiredArgsConstructor +public class Process implements ShiftProcess { + @Getter + final private ShiftService service; + final private Shifter shifter; + private TxDataBtc txDataBtc; + private RequestQuote quote = null; + private CreateOrder order = null; + + @Override + public void run(TxDataBtc txData) { + txDataBtc = txData; + switch (service.getType()) { + case TWOSTEP: + getQuote(); + break; + case ONESTEP: + quote = new RequestQuote() { + @Override + public double getBtcAmount() { + return txDataBtc.getBtcAmount(); + } + + @Override + public double getXmrAmount() { + return txDataBtc.getXmrAmount(); + } + + @Override + public String getId() { + return null; + } + + @Override + public Date getCreatedAt() { + return null; + } + + @Override + public Date getExpiresAt() { + return null; + } + + @Override + public double getPrice() { + return 0; + } + + @Override + public ShiftType getType() { + return (txDataBtc.getShiftAmount().getCrypto() == Crypto.XMR) ? ShiftType.FLOAT : ShiftType.FIXED; + } + }; + createOrder(); + break; + default: + throw new IllegalStateException(); + } + } + + @Override + public void restart() { + run(txDataBtc); + } + + private void getQuote() { + shifter.invalidateShift(); + if (!shifter.isActive()) return; + Timber.d("Request Quote"); + quote = null; + order = null; + shifter.showProgress(Shifter.Stage.A); + + ShiftCallback callback = new ShiftCallback() { + @Override + public void onSuccess(RequestQuote requestQuote) { + if (!shifter.isActive()) return; + if (quote != null) { + Timber.w("another ongoing request quote request"); + return; + } + onQuoteReceived(requestQuote); + } + + @Override + public void onError(Exception ex) { + if (!shifter.isActive()) return; + if (quote != null) { + Timber.w("another ongoing request quote request"); + return; + } + shifter.onQuoteError(ex); + } + }; + service.getShiftApi().requestQuote(txDataBtc.getBtcAddress(), txDataBtc.getShiftAmount(), callback); + } + + private void onQuoteReceived(final RequestQuote quote) { + Timber.d("onQuoteReceived %s", quote.getId()); + // verify the shift is correct + if (!txDataBtc.validate(quote)) { + Timber.d("Failed to get quote"); + shifter.showQuoteError(); + return; // just stop for now + } + this.quote = quote; + txDataBtc.setAmount(this.quote.getXmrAmount()); + shifter.onQuoteReceived(this.quote); + createOrder(); + } + + @Override + public void retryCreateOrder() { + createOrder(); + } + + private void createOrder() { + Timber.d("createOrder(%s)", quote.getId()); + if (!shifter.isActive()) return; + final String btcAddress = txDataBtc.getBtcAddress(); + order = null; + shifter.showProgress(Shifter.Stage.B); + service.getShiftApi().createOrder(quote, btcAddress, new ShiftCallback() { + @Override + public void onSuccess(final CreateOrder order) { + if (!shifter.isActive()) return; + if (quote == null) return; + if ((quote.getId() != null) && !order.getQuoteId().equals(quote.getId())) { + Timber.d("Quote ID does not match"); + // ignore (we got a response to a stale request) + return; + } + if (Process.this.order != null) + throw new IllegalStateException("order must be null here!"); + onOrderReceived(order); + } + + @Override + public void onError(final Exception ex) { + if (!shifter.isActive()) return; + shifter.onOrderError(ex); + } + }); + } + + private void onOrderReceived(final CreateOrder order) { + Timber.d("onOrderReceived %s for %s", order.getOrderId(), order.getQuoteId()); + // verify amount & destination + if (!order.getBtcCurrency().equalsIgnoreCase(txDataBtc.getBtcSymbol())) + throw new IllegalStateException("Destination Currency is wrong: " + order.getBtcCurrency()); // something is terribly wrong - die + if ((order.getType() == ShiftType.FIXED) && (order.getBtcAmount() != txDataBtc.getShiftAmount().getAmount())) + throw new IllegalStateException("Destination Amount is wrong: " + order.getBtcAmount()); // something is terribly wrong - die + if ((order.getType() == ShiftType.FLOAT) && (order.getXmrAmount() != txDataBtc.getShiftAmount().getAmount())) + throw new IllegalStateException("Source Amount is wrong: " + order.getXmrAmount()); // something is terribly wrong - die + if (!txDataBtc.validateAddress(order.getBtcAddress())) { + throw new IllegalStateException("Destination address is wrong: " + order.getBtcAddress()); // something is terribly wrong - die + } + this.order = order; + shifter.onOrderCreated(order); + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/ShiftProcess.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/ShiftProcess.java new file mode 100644 index 00000000..4f9ae53c --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/process/ShiftProcess.java @@ -0,0 +1,14 @@ +package com.m2049r.xmrwallet.service.shift.process; + +import com.m2049r.xmrwallet.data.TxDataBtc; +import com.m2049r.xmrwallet.service.shift.ShiftService; + +public interface ShiftProcess { + ShiftService getService(); + + void run(TxDataBtc txData); + + void restart(); + + void retryCreateOrder(); +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/ShiftApiImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/ShiftApiImpl.java new file mode 100644 index 00000000..cbe29ad4 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/ShiftApiImpl.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2017-2021 m2049r et 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.service.shift.provider; + +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.m2049r.xmrwallet.data.CryptoAmount; +import com.m2049r.xmrwallet.service.shift.NetworkCallback; +import com.m2049r.xmrwallet.service.shift.ShiftApiCall; +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.api.CreateOrder; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderParameters; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderStatus; +import com.m2049r.xmrwallet.service.shift.api.RequestQuote; +import com.m2049r.xmrwallet.service.shift.api.ShiftApi; +import com.m2049r.xmrwallet.util.NetCipherHelper; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +import okhttp3.Call; +import okhttp3.HttpUrl; +import okhttp3.Response; +import timber.log.Timber; + +abstract public class ShiftApiImpl implements ShiftApi, ShiftApiCall { + + protected abstract String getBaseUrl(); + + protected abstract String getApiUrl(); + + private final HttpUrl api; + + public ShiftApiImpl() { + api = HttpUrl.parse(getApiUrl()); + } + + @Override + public void queryOrderParameters(CryptoAmount btcAmount, @NonNull final ShiftCallback callback) { + throw new UnsupportedOperationException(); + } + + @Override + public void requestQuote(@Nullable final String btcAddress, @NonNull final CryptoAmount btcAmount, @NonNull final ShiftCallback callback) { + throw new UnsupportedOperationException(); + } + + @Override + public void createOrder(@NonNull final RequestQuote quote, @NonNull final String btcAddress, + @NonNull final ShiftCallback callback) { + throw new UnsupportedOperationException(); + } + + @Override + public void queryOrderStatus(@NonNull final String uuid, + @NonNull final ShiftCallback callback) { + throw new UnsupportedOperationException(); + } + + @Override + public Uri getQueryOrderUri(String orderId) { + throw new UnsupportedOperationException(); + } + + + // void post(@NonNull final String path, final JSONObject data, @NonNull final NetworkCallback callback); + + @Override + public void get(@NonNull final String path, final String parameters, @NonNull final NetworkCallback callback) { + Timber.d("GET parameters=%s", parameters); + final HttpUrl.Builder builder = api.newBuilder().addPathSegments(path); + if (parameters != null) + for (String parm : parameters.split("&")) { + String[] p = parm.split("="); + builder.addQueryParameter(p[0], p[1]); + } + NetCipherHelper.Request request = new NetCipherHelper.Request(builder.build()); + augment(request, null); + enqueue(request, callback); + } + + @Override + public void post(@NonNull final String path, final JSONObject data, @NonNull final NetworkCallback callback) { + Timber.d("data=%s", data); + final HttpUrl url = api.newBuilder().addPathSegments(path).build(); + final NetCipherHelper.Request request = new NetCipherHelper.Request(url, data); + augment(request, data); + enqueue(request, callback); + } + + protected void augment(@NonNull final NetCipherHelper.Request request, @Nullable final JSONObject data) { + } + + private void enqueue(NetCipherHelper.Request request, @NonNull final NetworkCallback callback) { + Timber.d("REQ: %s", request); + request.enqueue(new okhttp3.Callback() { + @Override + public void onFailure(@NonNull final Call call, @NonNull final IOException ex) { + callback.onError(ex, null); + } + + @Override + public void onResponse(@NonNull final Call call, @NonNull final Response response) throws IOException { + Timber.d("onResponse code=%d", response.code()); + try { + if (response.body() == null) { + callback.onError(new IllegalStateException("Empty response from service"), null); + return; + } + final String body = response.body().string(); + if ((response.code() >= 200) && (response.code() <= 499)) { + try { + Timber.d(" SUCCESS %s", body); + final JSONObject json = new JSONObject(body); + final ShiftError error = createShiftError(ShiftError.Type.SERVICE, json); + if (error != null) { + callback.onError(new ShiftException(response.code(), error), json); + } else { + callback.onSuccess(json); + } + } catch (JSONException ex) { + callback.onError(ex, null); + } + } else { + try { + Timber.d("!SUCCESS %s", body); + final JSONObject json = new JSONObject(body); + Timber.d(json.toString(2)); + final ShiftError error = createShiftError(ShiftError.Type.INFRASTRUCTURE, json); + Timber.d("%s says %d/%s", getBaseUrl(), response.code(), error); + callback.onError(new ShiftException(response.code(), error), json); + } catch (JSONException ex) { + callback.onError(new ShiftException(response.code()), null); + } + } + } finally { + response.close(); + } + } + }); + } + + abstract protected ShiftError createShiftError(ShiftError.Type type, final JSONObject jsonObject); +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/CreateOrderImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/CreateOrderImpl.java new file mode 100644 index 00000000..34d5a374 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/CreateOrderImpl.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2017-2021 m2049r et 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.service.shift.provider.exolix; + +import androidx.annotation.NonNull; + +import com.m2049r.xmrwallet.service.shift.NetworkCallback; +import com.m2049r.xmrwallet.service.shift.ShiftApiCall; +import com.m2049r.xmrwallet.service.shift.ShiftCallback; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.ShiftType; +import com.m2049r.xmrwallet.service.shift.api.CreateOrder; +import com.m2049r.xmrwallet.service.shift.api.RequestQuote; +import com.m2049r.xmrwallet.util.DateHelper; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.text.ParseException; +import java.util.Date; + +import lombok.Getter; + +@Getter +class CreateOrderImpl implements CreateOrder { + private final static long EXPIRE = 10 * 60 * 1000; // 10 minutes + private final String btcCurrency; + private final double btcAmount; + private final String btcAddress; + private final String orderId; + private final double xmrAmount; + private final String xmrAddress; + private final Date createdAt; + private final Date expiresAt; + private final ShiftType type; + + @Override + public String getQueryOrderId() { + return orderId; + } + + @Override + public String getQuoteId() { + return null; + } + + CreateOrderImpl(final JSONObject jsonObject) throws JSONException { + final JSONObject coinFrom = jsonObject.getJSONObject("coinFrom"); + final JSONObject coinTo = jsonObject.getJSONObject("coinTo"); + // sanity checks + final String depositMethod = coinFrom.getString("coinCode"); + final String settleMethod = coinTo.getString("coinCode"); + if (!"xmr".equalsIgnoreCase(depositMethod) + || !ShiftService.ASSET.getSymbol().equalsIgnoreCase(settleMethod)) + throw new IllegalStateException(); + + btcCurrency = settleMethod.toUpperCase(); + btcAmount = jsonObject.getDouble("amountTo"); + btcAddress = jsonObject.getString("withdrawalAddress"); + + xmrAmount = jsonObject.getDouble("amount"); + xmrAddress = jsonObject.getString("depositAddress"); + + orderId = jsonObject.getString("id"); + + try { + final String created = jsonObject.getString("createdAt"); + createdAt = DateHelper.parse(created); + expiresAt = new Date(createdAt.getTime() + EXPIRE); + } catch (ParseException ex) { + throw new JSONException(ex.getLocalizedMessage()); + } + + type = jsonObject.getString("rateType").equals("float") ? ShiftType.FLOAT : ShiftType.FIXED; + } + + public static void call(@NonNull final ShiftApiCall api, + @NonNull final String btcAddress, + @NonNull final RequestQuote quote, + @NonNull final ShiftCallback callback) { + try { + final JSONObject request = createRequest(btcAddress, quote); + api.post("transactions", request, new NetworkCallback() { + @Override + public void onSuccess(JSONObject jsonObject) { + try { + callback.onSuccess(new CreateOrderImpl(jsonObject)); + } catch (JSONException ex) { + callback.onError(ex); + } + } + + @Override + public void onError(Exception ex, JSONObject json) { + callback.onError(ex); + } + }); + } catch (JSONException ex) { + callback.onError(ex); + } + } + + static JSONObject createRequest(@NonNull final String btcAddress, @NonNull final RequestQuote quote) throws JSONException { + final JSONObject jsonObject = new JSONObject(); + if (quote.getType() == ShiftType.FLOAT) { + jsonObject.put("rateType", "float"); + jsonObject.put("amount", quote.getXmrAmount()); + } else { // default is FIXED + jsonObject.put("rateType", "fixed"); + jsonObject.put("withdrawalAmount", quote.getBtcAmount()); + } + jsonObject.put("coinFrom", "XMR"); + jsonObject.put("coinTo", ShiftService.ASSET.getSymbol()); + jsonObject.put("networkTo", ShiftService.ASSET.getNetwork()); + jsonObject.put("withdrawalAddress", btcAddress); + return jsonObject; + } + + @Override + public String getTag() { + return ShiftService.EXOLIX.getTag(); + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/ExolixApiImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/ExolixApiImpl.java new file mode 100644 index 00000000..08c1fb8f --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/ExolixApiImpl.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2017-2021 m2049r et 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.service.shift.provider.exolix; + +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.m2049r.xmrwallet.BuildConfig; +import com.m2049r.xmrwallet.data.CryptoAmount; +import com.m2049r.xmrwallet.service.shift.ShiftCallback; +import com.m2049r.xmrwallet.service.shift.ShiftError; +import com.m2049r.xmrwallet.service.shift.api.CreateOrder; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderParameters; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderStatus; +import com.m2049r.xmrwallet.service.shift.api.RequestQuote; +import com.m2049r.xmrwallet.service.shift.provider.ShiftApiImpl; +import com.m2049r.xmrwallet.util.IdHelper; +import com.m2049r.xmrwallet.util.NetCipherHelper; + +import org.json.JSONException; +import org.json.JSONObject; + +import lombok.Getter; + +public class ExolixApiImpl extends ShiftApiImpl { + @Getter + final private String baseUrl = "https://exolix.com"; + @Getter + final private String apiUrl = baseUrl + "/api/v2"; + + @Override + public void queryOrderParameters(CryptoAmount btcAmount, @NonNull final ShiftCallback callback) { + QueryOrderParametersImpl.call(this, btcAmount, callback); + } + + @Override + public void createOrder(@NonNull final RequestQuote quote, @NonNull final String btcAddress, + @NonNull final ShiftCallback callback) { + CreateOrderImpl.call(this, btcAddress, quote, callback); + } + + @Override + public void queryOrderStatus(@NonNull final String uuid, + @NonNull final ShiftCallback callback) { + QueryOrderStatusImpl.call(this, uuid, callback); + } + + @Override + public Uri getQueryOrderUri(String orderId) { + return Uri.parse(getBaseUrl() + "/transaction/" + orderId); + } + + @Override + protected ShiftError createShiftError(ShiftError.Type type, final JSONObject jsonObject) { + try { + if (jsonObject.has("message")) { + final String message = jsonObject.getString("message"); + if (!"null".equals(message)) + return new ShiftError(type, message); + } + } catch (JSONException ex) { + return new ShiftError(ShiftError.Type.INFRASTRUCTURE, "unknown"); + } + return null; + } + + @Override + protected void augment(@NonNull final NetCipherHelper.Request request, @Nullable final JSONObject data) { + request.setAugmenter((b) -> IdHelper.addHeader(b, "Authorization", BuildConfig.ID_F)); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/QueryOrderParametersImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/QueryOrderParametersImpl.java new file mode 100644 index 00000000..d62bb63f --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/QueryOrderParametersImpl.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2017-2021 m2049r et 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.service.shift.provider.exolix; + +import androidx.annotation.NonNull; + +import com.m2049r.xmrwallet.data.Crypto; +import com.m2049r.xmrwallet.data.CryptoAmount; +import com.m2049r.xmrwallet.service.shift.NetworkCallback; +import com.m2049r.xmrwallet.service.shift.ShiftApiCall; +import com.m2049r.xmrwallet.service.shift.ShiftCallback; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderParameters; +import com.m2049r.xmrwallet.util.AmountHelper; +import com.m2049r.xmrwallet.util.Helper; + +import org.json.JSONException; +import org.json.JSONObject; + +import lombok.Getter; + +@Getter +class QueryOrderParametersImpl implements QueryOrderParameters { + + private final double lowerLimit; + private final double price; + private final double upperLimit; + + QueryOrderParametersImpl(final JSONObject jsonObject) throws JSONException { + price = jsonObject.getDouble("rate"); + lowerLimit = jsonObject.getDouble("minAmount"); // XMR + upperLimit = jsonObject.getDouble("maxAmount"); // XMR + } + + public static void call(@NonNull final ShiftApiCall api, CryptoAmount btcAmount, + @NonNull final ShiftCallback callback) { + if (btcAmount.getAmount() == 0) { // just checking rate without real amount + btcAmount = new CryptoAmount(Crypto.withSymbol(Helper.BASE_CRYPTO), 1); // might as well check for 1 XMR + } + final CryptoAmount cryptoAmount = btcAmount; + final StringBuilder params = new StringBuilder(); + if (btcAmount.getCrypto() == Crypto.XMR) { // we are sending XMR, so float + params.append("rateType=float"); + params.append("&amount=").append(AmountHelper.format(cryptoAmount.getAmount())); + params.append("&coinFrom=XMR"); + } else { // we are receiving non-XMR, i.e. paying something, so fixed + params.append("rateType=fixed"); + params.append("&withdrawalAmount=").append(AmountHelper.format(cryptoAmount.getAmount())); + params.append("&coinFrom=XMR"); + } + params.append("&coinTo=").append(ShiftService.ASSET.getSymbol()); + params.append("&networkTo=").append(ShiftService.ASSET.getNetwork()); + + api.get("rate", params.toString(), new NetworkCallback() { + @Override + public void onSuccess(JSONObject jsonObject) { + try { + callback.onSuccess(new QueryOrderParametersImpl(jsonObject)); + } catch (JSONException ex) { + callback.onError(ex); + } + } + + @Override + public void onError(Exception ex, JSONObject json) { + if ((json != null) && json.has("minAmount")) { + try { + final double lowerLimit = json.getDouble((cryptoAmount.getCrypto() == Crypto.XMR) ? "minAmount" : "withdrawMin"); + call(api, cryptoAmount.newWithAmount(1.5 * lowerLimit), callback); // try again with 150% of minimum + } catch (JSONException jex) { + callback.onError(jex); + } + } else { + callback.onError(ex); + } + } + }); + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/QueryOrderStatusImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/QueryOrderStatusImpl.java new file mode 100644 index 00000000..e4347af4 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/provider/exolix/QueryOrderStatusImpl.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2017-2021 m2049r et 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.service.shift.provider.exolix; + +import androidx.annotation.NonNull; + +import com.m2049r.xmrwallet.service.shift.NetworkCallback; +import com.m2049r.xmrwallet.service.shift.ShiftApiCall; +import com.m2049r.xmrwallet.service.shift.ShiftCallback; +import com.m2049r.xmrwallet.service.shift.ShiftService; +import com.m2049r.xmrwallet.service.shift.api.QueryOrderStatus; +import com.m2049r.xmrwallet.util.DateHelper; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.text.ParseException; +import java.util.Date; + +class QueryOrderStatusImpl extends QueryOrderStatus { + + private QueryOrderStatusImpl(String orderId, Status status, String btcCurrency, double btcAmount, String btcAddress, double xmrAmount, String xmrAddress, Date createdAt, Date expiresAt) { + super(orderId, status, btcCurrency, btcAmount, btcAddress, xmrAmount, xmrAddress, createdAt, expiresAt); + } + + static private Status getStatus(String status) { + switch (status) { + case "wait": + return Status.WAITING; + case "confirmation": + case "confirmed": + return Status.PENDING; + case "exchanging": + case "sending": + return Status.SETTLING; + case "success": + return Status.SETTLED; + case "overdue": + return Status.EXPIRED; + case "refunded": + default: + return Status.UNDEFINED; + } + } + + static private QueryOrderStatusImpl of(final JSONObject jsonObject) throws JSONException { + final JSONObject coinFrom = jsonObject.getJSONObject("coinFrom"); + final JSONObject coinTo = jsonObject.getJSONObject("coinTo"); + // sanity checks + final String depositMethod = coinFrom.getString("coinCode"); + final String settleMethod = coinTo.getString("coinCode"); + if (!"xmr".equalsIgnoreCase(depositMethod) + || !ShiftService.ASSET.getSymbol().equalsIgnoreCase(settleMethod)) + throw new IllegalStateException(); + + final double btcAmount = jsonObject.getDouble("amountTo"); + final String btcAddress = jsonObject.getString("withdrawalAddress"); + + final double xmrAmount = jsonObject.getDouble("amount"); + final String xmrAddress = jsonObject.getString("depositAddress"); + + final String orderId = jsonObject.getString("id"); + + Date createdAt; + Date expiresAt; + try { + final String created = jsonObject.getString("createdAt"); + createdAt = DateHelper.parse(created); + expiresAt = new Date(createdAt.getTime() + 300000); + } catch (ParseException ex) { + throw new JSONException(ex.getLocalizedMessage()); + } + + final String status = jsonObject.getString("status"); + + return new QueryOrderStatusImpl( + orderId, + getStatus(status), + settleMethod, + btcAmount, + btcAddress, + xmrAmount, + xmrAddress, + createdAt, + expiresAt + ); + } + + public static void call(@NonNull final ShiftApiCall api, @NonNull final String orderId, + @NonNull final ShiftCallback callback) { + api.get("transactions/" + orderId, null, new NetworkCallback() { + @Override + public void onSuccess(JSONObject jsonObject) { + try { + callback.onSuccess(QueryOrderStatusImpl.of(jsonObject)); + } catch (JSONException ex) { + callback.onError(ex); + } + } + + @Override + public void onError(Exception ex, JSONObject json) { + callback.onError(ex); + } + }); + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderStatus.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderStatus.java deleted file mode 100644 index acb201cb..00000000 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/QueryOrderStatus.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2017-2021 m2049r et 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.service.shift.sideshift.api; - -import java.util.Date; - -public interface QueryOrderStatus { - enum State { - WAITING, // Waiting for mempool - PENDING, // Detected (waiting for confirmations) - SETTLING, // Settlement in progress - SETTLED, // Settlement completed - // no refunding in monerujo so theese are ignored: -// REFUND, // Queued for refund -// REFUNDING, // Refund in progress -// REFUNDED // Refund completed - UNDEFINED - } - - boolean isCreated(); - - boolean isTerminal(); - - boolean isWaiting(); - - boolean isPending(); - - boolean isSent(); - - boolean isPaid(); - - boolean isError(); - - QueryOrderStatus.State getState(); - - String getOrderId(); - - Date getCreatedAt(); - - Date getExpiresAt(); - - double getBtcAmount(); - - String getBtcAddress(); - - double getXmrAmount(); - - String getXmrAddress(); - - double getPrice(); -} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java deleted file mode 100644 index d04222fc..00000000 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2017-2021 m2049r et 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.service.shift.sideshift.network; - -import androidx.annotation.NonNull; - -import com.m2049r.xmrwallet.BuildConfig; -import com.m2049r.xmrwallet.service.shift.NetworkCallback; -import com.m2049r.xmrwallet.service.shift.ShiftApiCall; -import com.m2049r.xmrwallet.service.shift.ShiftCallback; -import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder; -import com.m2049r.xmrwallet.util.DateHelper; -import com.m2049r.xmrwallet.util.ServiceHelper; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.text.ParseException; -import java.util.Date; - -import lombok.Getter; - -class CreateOrderImpl implements CreateOrder { - @Getter - private final String btcCurrency; - @Getter - private final double btcAmount; - @Getter - private final String btcAddress; - @Getter - private final String quoteId; - @Getter - private final String orderId; - @Getter - private final double xmrAmount; - @Getter - private final String xmrAddress; - @Getter - private final Date createdAt; - @Getter - private final Date expiresAt; - - CreateOrderImpl(final JSONObject jsonObject) throws JSONException { - // sanity checks - final String depositMethod = jsonObject.getString("depositMethodId"); - final String settleMethod = jsonObject.getString("settleMethodId"); - 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"); - - xmrAmount = jsonObject.getDouble("depositAmount"); - JSONObject depositAddress = jsonObject.getJSONObject("depositAddress"); - xmrAddress = depositAddress.getString("address"); - - quoteId = jsonObject.getString("quoteId"); - - orderId = jsonObject.getString("orderId"); - - try { - final String created = jsonObject.getString("createdAtISO"); - createdAt = DateHelper.parse(created); - final String expires = jsonObject.getString("expiresAtISO"); - expiresAt = DateHelper.parse(expires); - } catch (ParseException ex) { - throw new JSONException(ex.getLocalizedMessage()); - } - } - - public static void call(@NonNull final ShiftApiCall api, final String quoteId, @NonNull final String btcAddress, - @NonNull final ShiftCallback callback) { - try { - final JSONObject request = createRequest(quoteId, btcAddress); - api.call("orders", request, new NetworkCallback() { - @Override - public void onSuccess(JSONObject jsonObject) { - try { - callback.onSuccess(new CreateOrderImpl(jsonObject)); - } catch (JSONException ex) { - callback.onError(ex); - } - } - - @Override - public void onError(Exception ex) { - callback.onError(ex); - } - }); - } catch (JSONException ex) { - callback.onError(ex); - } - } - - static JSONObject createRequest(final String quoteId, final String address) throws JSONException { - final JSONObject jsonObject = new JSONObject(); - jsonObject.put("type", "fixed"); - jsonObject.put("quoteId", quoteId); - jsonObject.put("settleAddress", address); - if (!BuildConfig.ID_A.isEmpty() && !"null".equals(BuildConfig.ID_A)) { - jsonObject.put("affiliateId", BuildConfig.ID_A); - } - return jsonObject; - } -} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java deleted file mode 100644 index 98dfbf70..00000000 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2017-2021 m2049r et 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.service.shift.sideshift.network; - -import androidx.annotation.NonNull; - -import com.m2049r.xmrwallet.service.shift.NetworkCallback; -import com.m2049r.xmrwallet.service.shift.ShiftApiCall; -import com.m2049r.xmrwallet.service.shift.ShiftCallback; -import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters; -import com.m2049r.xmrwallet.util.ServiceHelper; - -import org.json.JSONException; -import org.json.JSONObject; - -class QueryOrderParametersImpl implements QueryOrderParameters { - - private double lowerLimit; - private double price; - private double upperLimit; - - public double getLowerLimit() { - return lowerLimit; - } - - public double getPrice() { - return price; - } - - public double getUpperLimit() { - return upperLimit; - } - - QueryOrderParametersImpl(final JSONObject jsonObject) throws JSONException { - lowerLimit = jsonObject.getDouble("min"); - price = jsonObject.getDouble("rate"); - upperLimit = jsonObject.getDouble("max"); - } - - public static void call(@NonNull final ShiftApiCall api, - @NonNull final ShiftCallback callback) { - api.call("pairs/xmr/" + ServiceHelper.ASSET, new NetworkCallback() { - @Override - public void onSuccess(JSONObject jsonObject) { - try { - callback.onSuccess(new QueryOrderParametersImpl(jsonObject)); - } catch (JSONException ex) { - callback.onError(ex); - } - } - - @Override - public void onError(Exception ex) { - callback.onError(ex); - } - }); - } -} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderStatusImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderStatusImpl.java deleted file mode 100644 index c717cef3..00000000 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderStatusImpl.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2017-2021 m2049r et 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.service.shift.sideshift.network; - -import androidx.annotation.NonNull; - -import com.m2049r.xmrwallet.service.shift.NetworkCallback; -import com.m2049r.xmrwallet.service.shift.ShiftApiCall; -import com.m2049r.xmrwallet.service.shift.ShiftCallback; -import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderStatus; -import com.m2049r.xmrwallet.util.DateHelper; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.text.ParseException; -import java.util.Date; - -import lombok.Getter; - -class QueryOrderStatusImpl implements QueryOrderStatus { - - @Getter - private QueryOrderStatus.State state; - @Getter - private final String orderId; - @Getter - private final Date createdAt; - @Getter - private final Date expiresAt; - @Getter - private final double btcAmount; - @Getter - private final String btcAddress; - @Getter - private final double xmrAmount; - @Getter - private final String xmrAddress; - - public boolean isCreated() { - return true; - } - - public boolean isTerminal() { - return (state.equals(State.SETTLED) || isError()); - } - - public boolean isError() { - return state.equals(State.UNDEFINED); - } - - public boolean isWaiting() { - return state.equals(State.WAITING); - } - - public boolean isPending() { - return state.equals(State.PENDING); - } - - public boolean isSent() { - return state.equals(State.SETTLING); - } - - public boolean isPaid() { - return state.equals(State.SETTLED); - } - - public double getPrice() { - return btcAmount / xmrAmount; - } - - QueryOrderStatusImpl(final JSONObject jsonObject) throws JSONException { - try { - String created = jsonObject.getString("createdAtISO"); - createdAt = DateHelper.parse(created); - String expires = jsonObject.getString("expiresAtISO"); - expiresAt = DateHelper.parse(expires); - } catch (ParseException ex) { - throw new JSONException(ex.getLocalizedMessage()); - } - orderId = jsonObject.getString("orderId"); - - btcAmount = jsonObject.getDouble("settleAmount"); - JSONObject settleAddress = jsonObject.getJSONObject("settleAddress"); - btcAddress = settleAddress.getString("address"); - - xmrAmount = jsonObject.getDouble("depositAmount"); - JSONObject depositAddress = jsonObject.getJSONObject("depositAddress"); - xmrAddress = settleAddress.getString("address"); - - JSONArray deposits = jsonObject.getJSONArray("deposits"); - // we only create one deposit, so die if there are more than one: - if (deposits.length() > 1) - throw new IllegalStateException("more than one deposits"); - - state = State.UNDEFINED; - if (deposits.length() == 0) { - state = State.WAITING; - } else if (deposits.length() == 1) { - // sanity check - if (!orderId.equals(deposits.getJSONObject(0).getString("orderId"))) - throw new IllegalStateException("deposit has different order id!"); - String stateName = deposits.getJSONObject(0).getString("status"); - try { - state = State.valueOf(stateName.toUpperCase()); - } catch (IllegalArgumentException ex) { - state = State.UNDEFINED; - } - } - } - - public static void call(@NonNull final ShiftApiCall api, @NonNull final String orderId, - @NonNull final ShiftCallback callback) { - api.call("orders/" + orderId, new NetworkCallback() { - @Override - public void onSuccess(JSONObject jsonObject) { - try { - callback.onSuccess(new QueryOrderStatusImpl(jsonObject)); - } catch (JSONException ex) { - callback.onError(ex); - } - } - - @Override - public void onError(Exception ex) { - callback.onError(ex); - } - }); - } -} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java deleted file mode 100644 index 1cbdf24c..00000000 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2017-2021 m2049r et 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.service.shift.sideshift.network; - -import androidx.annotation.NonNull; - -import com.m2049r.xmrwallet.service.shift.NetworkCallback; -import com.m2049r.xmrwallet.service.shift.ShiftApiCall; -import com.m2049r.xmrwallet.service.shift.ShiftCallback; -import com.m2049r.xmrwallet.service.shift.sideshift.api.RequestQuote; -import com.m2049r.xmrwallet.util.DateHelper; -import com.m2049r.xmrwallet.util.ServiceHelper; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.text.ParseException; -import java.util.Date; -import java.util.Locale; - -import lombok.Getter; - -class RequestQuoteImpl implements RequestQuote { - @Getter - private final double btcAmount; - @Getter - private final String id; - @Getter - private final Date createdAt; - @Getter - private final Date expiresAt; - @Getter - private final double xmrAmount; - @Getter - private final double price; - - // TODO do something with errors - they always seem to send us 500 - - RequestQuoteImpl(final JSONObject jsonObject) throws JSONException { - // sanity checks - final String depositMethod = jsonObject.getString("depositMethod"); - final String settleMethod = jsonObject.getString("settleMethod"); - if (!"xmr".equals(depositMethod) || !ServiceHelper.ASSET.equals(settleMethod)) - throw new IllegalStateException(); - - btcAmount = jsonObject.getDouble("settleAmount"); - id = jsonObject.getString("id"); - - try { - final String created = jsonObject.getString("createdAt"); - createdAt = DateHelper.parse(created); - final String expires = jsonObject.getString("expiresAt"); - expiresAt = DateHelper.parse(expires); - } catch (ParseException ex) { - throw new JSONException(ex.getLocalizedMessage()); - } - xmrAmount = jsonObject.getDouble("depositAmount"); - price = jsonObject.getDouble("rate"); - } - - public static void call(@NonNull final ShiftApiCall api, final double btcAmount, - @NonNull final ShiftCallback callback) { - try { - final JSONObject request = createRequest(btcAmount); - api.call("quotes", request, new NetworkCallback() { - @Override - public void onSuccess(JSONObject jsonObject) { - try { - callback.onSuccess(new RequestQuoteImpl(jsonObject)); - } catch (JSONException ex) { - callback.onError(ex); - } - } - - @Override - public void onError(Exception ex) { - callback.onError(ex); - } - }); - } catch (JSONException ex) { - callback.onError(ex); - } - } - - /** - * Create JSON request object - * - * @param btcAmount how much XMR to shift to BTC - */ - - static JSONObject createRequest(final double btcAmount) throws JSONException { - final JSONObject jsonObject = new JSONObject(); - jsonObject.put("depositMethod", "xmr"); - jsonObject.put("settleMethod", ServiceHelper.ASSET); - // #sideshift is silly and likes numbers as strings - String amount = AmountFormatter.format(btcAmount); - jsonObject.put("settleAmount", amount); - return jsonObject; - } - - static final DecimalFormat AmountFormatter; - - static { - AmountFormatter = new DecimalFormat(); - AmountFormatter.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US)); - AmountFormatter.setMinimumIntegerDigits(1); - AmountFormatter.setMaximumFractionDigits(12); - AmountFormatter.setGroupingUsed(false); - } -} diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/SideShiftApiImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/SideShiftApiImpl.java deleted file mode 100644 index c22e3220..00000000 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/SideShiftApiImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2017-2021 m2049r et 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.service.shift.sideshift.network; - -import android.net.Uri; - -import androidx.annotation.NonNull; - -import com.m2049r.xmrwallet.service.shift.NetworkCallback; -import com.m2049r.xmrwallet.service.shift.ShiftApiCall; -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.QueryOrderParameters; -import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderStatus; -import com.m2049r.xmrwallet.service.shift.sideshift.api.RequestQuote; -import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; -import com.m2049r.xmrwallet.util.NetCipherHelper; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; - -import okhttp3.Call; -import okhttp3.HttpUrl; -import okhttp3.Response; -import timber.log.Timber; - -public class SideShiftApiImpl implements SideShiftApi, ShiftApiCall { - - private final HttpUrl baseUrl; - - public SideShiftApiImpl(final HttpUrl baseUrl) { - this.baseUrl = baseUrl; - } - - @Override - public void queryOrderParameters(@NonNull final ShiftCallback callback) { - QueryOrderParametersImpl.call(this, callback); - } - - @Override - public void requestQuote(final double btcAmount, @NonNull final ShiftCallback callback) { - RequestQuoteImpl.call(this, btcAmount, callback); - } - - @Override - public void createOrder(final String quoteId, @NonNull final String btcAddress, - @NonNull final ShiftCallback callback) { - CreateOrderImpl.call(this, quoteId, btcAddress, callback); - } - - @Override - public void queryOrderStatus(@NonNull final String uuid, - @NonNull final ShiftCallback callback) { - QueryOrderStatusImpl.call(this, uuid, callback); - } - - @Override - public Uri getQueryOrderUri(String orderId) { - return Uri.parse("https://sideshift.ai/orders/" + orderId); - } - - @Override - public void call(@NonNull final String path, @NonNull final NetworkCallback callback) { - call(path, null, callback); - } - - @Override - public void call(@NonNull final String path, final JSONObject request, @NonNull final NetworkCallback callback) { - final HttpUrl url = baseUrl.newBuilder() - .addPathSegments(path) - .build(); - - NetCipherHelper.Request httpRequest = new NetCipherHelper.Request(url, request); - httpRequest.enqueue(new okhttp3.Callback() { - @Override - public void onFailure(final Call call, final IOException ex) { - callback.onError(ex); - } - - @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) throws IOException { - Timber.d("onResponse code=%d", response.code()); - if (response.isSuccessful()) { - try { - final JSONObject json = new JSONObject(response.body().string()); - callback.onSuccess(json); - } catch (JSONException ex) { - callback.onError(ex); - } - } else { - try { - final JSONObject json = new JSONObject(response.body().string()); - Timber.d(json.toString(2)); - final ShiftError error = new ShiftError(json); - Timber.w("%s says %d/%s", CreateOrder.TAG, response.code(), error.toString()); - callback.onError(new ShiftException(response.code(), error)); - } catch (JSONException ex) { - callback.onError(new ShiftException(response.code())); - } - } - } - }); - } -} diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/AmountHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/AmountHelper.java new file mode 100644 index 00000000..9c989f93 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/util/AmountHelper.java @@ -0,0 +1,28 @@ +package com.m2049r.xmrwallet.util; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; + +public class AmountHelper { + static final DecimalFormat AmountFormatter_12; + + static { + AmountFormatter_12 = new DecimalFormat(); + AmountFormatter_12.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US)); + AmountFormatter_12.setMinimumIntegerDigits(1); + AmountFormatter_12.setMaximumFractionDigits(12); + AmountFormatter_12.setGroupingUsed(false); + } + + public static String format(double amount) { + return AmountFormatter_12.format(amount); + } + + public static String format_6(double amount) { + int n = (int) Math.ceil(Math.log10(amount)); + int d = Math.max(2, 6 - n); + final String fmt = "%,." + d + "f"; + return String.format(Locale.getDefault(), fmt, amount); + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java index 6b06e9a4..0042255f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java @@ -78,12 +78,13 @@ import timber.log.Timber; public class Helper { static public final String NOCRAZYPASS_FLAGFILE = ".nocrazypass"; - static public final String BASE_CRYPTO = Crypto.XMR.getSymbol(); + static public final Crypto BASE_CRYPTO_CRYPTO = Crypto.XMR; + static public final String BASE_CRYPTO = BASE_CRYPTO_CRYPTO.getSymbol(); static public final int XMR_DECIMALS = 12; static public final long ONE_XMR = Math.round(Math.pow(10, Helper.XMR_DECIMALS)); static public final boolean SHOW_EXCHANGERATES = true; - static public boolean ALLOW_SHIFT = false; + static public boolean ALLOW_SHIFT = true; static private final String WALLET_DIR = "wallets"; static private final String MONERO_DIR = "monero"; diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/IdHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/IdHelper.java new file mode 100644 index 00000000..d3a35e59 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/util/IdHelper.java @@ -0,0 +1,34 @@ +package com.m2049r.xmrwallet.util; + +import com.m2049r.xmrwallet.BuildConfig; + +import org.json.JSONException; +import org.json.JSONObject; + +import okhttp3.Request; + +public class IdHelper { + static public String idOrNot(String id) { + return isId(id) ? id : ""; + } + + static public boolean isId(String id) { + return (id != null) && !id.isEmpty() && !"null".equals(id); + } + + static public String asParameter(String name, String id) { + return isId(id) ? (name + "=" + id) : ""; + } + + static public void jsonPut(JSONObject jsonObject, String name, String id) throws JSONException { + if (isId(id)) { + jsonObject.put(name, id); + } + } + + static public void addHeader(Request.Builder builder, String name, String id) { + if (isId(id)) { + builder.addHeader(name, id); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/NetCipherHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/NetCipherHelper.java index 17c18bb4..fb50be49 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/NetCipherHelper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/NetCipherHelper.java @@ -45,6 +45,7 @@ import info.guardianproject.netcipher.proxy.MyOrbotHelper; import info.guardianproject.netcipher.proxy.SignatureUtils; import info.guardianproject.netcipher.proxy.StatusCallback; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.ToString; import okhttp3.Call; import okhttp3.Callback; @@ -58,11 +59,11 @@ import timber.log.Timber; @RequiredArgsConstructor public class NetCipherHelper implements StatusCallback { public static final String USER_AGENT = "Monerujo/1.0"; - public static final int HTTP_TIMEOUT_CONNECT = 1000; //ms - public static final int HTTP_TIMEOUT_READ = 2000; //ms - public static final int HTTP_TIMEOUT_WRITE = 1000; //ms - public static final int TOR_TIMEOUT_CONNECT = 5000; //ms - public static final int TOR_TIMEOUT = 2000; //ms + public static final int HTTP_TIMEOUT_CONNECT = 2500; //ms + public static final int HTTP_TIMEOUT_READ = 5000; //ms + public static final int HTTP_TIMEOUT_WRITE = 2500; //ms + public static final int TOR_TIMEOUT_CONNECT = 10000; //ms + public static final int TOR_TIMEOUT = 5000; //ms public interface OnStatusChangedListener { void connected(); @@ -112,7 +113,6 @@ public class NetCipherHelper implements StatusCallback { .withSocksProxy() .applyTo(okBuilder, statusIntent) .build(); - Helper.ALLOW_SHIFT = false; // no shifting with Tor } catch (Exception ex) { throw new IllegalStateException(ex); } @@ -125,7 +125,6 @@ public class NetCipherHelper implements StatusCallback { .writeTimeout(HTTP_TIMEOUT_WRITE, TimeUnit.MILLISECONDS) .readTimeout(HTTP_TIMEOUT_READ, TimeUnit.MILLISECONDS) .build(); - Helper.ALLOW_SHIFT = true; } catch (Exception ex) { throw new IllegalStateException(ex); } @@ -295,19 +294,36 @@ public class NetCipherHelper implements StatusCallback { @ToString static public class Request { final HttpUrl url; - final String json; + final JSONObject data; final String username; final String password; + @Setter + RequestAugmenter augmenter; - public Request(final HttpUrl url, final String json, final String username, final String password) { - this.url = url; - this.json = json; - this.username = username; - this.password = password; + final Method method; + + public enum Method { + GET, POST; } - public Request(final HttpUrl url, final JSONObject json) { - this(url, json == null ? null : json.toString(), null, null); + public interface RequestAugmenter { + void augment(okhttp3.Request.Builder builder); + } + + public Request(final HttpUrl url, final JSONObject data, final String username, final String password) { + this.url = url; + this.data = data; + this.username = username; + this.password = password; + if (data == null) { + method = Method.GET; + } else { + method = Method.POST; + } + } + + public Request(final HttpUrl url, final JSONObject data) { + this(url, data, null, null); } public Request(final HttpUrl url) { @@ -346,11 +362,16 @@ public class NetCipherHelper implements StatusCallback { final okhttp3.Request.Builder builder = new okhttp3.Request.Builder() .url(url) - .header("User-Agent", USER_AGENT); - if (json != null) { - builder.post(RequestBody.create(json, MediaType.parse("application/json"))); - } else { - builder.get(); + .header("User-Agent", USER_AGENT) + .header("Accept", "application/json"); + if (augmenter != null) augmenter.augment(builder); + switch (method) { + case GET: + builder.get(); + break; + case POST: + builder.post(RequestBody.create(data.toString(), MediaType.parse("application/json"))); + break; } return builder.build(); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/OpenAliasHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/OpenAliasHelper.java index 985e71c2..2b00e39b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/OpenAliasHelper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/OpenAliasHelper.java @@ -143,8 +143,8 @@ public class OpenAliasHelper { for (String txt : txts) { BarcodeData bc = BarcodeData.parseOpenAlias(txt, dnssec); if (bc != null) { - if (!dataMap.containsKey(bc.asset)) { - dataMap.put(bc.asset, bc); + if (!dataMap.containsKey(bc.getAsset())) { + dataMap.put(bc.getAsset(), bc); } } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java index b04b20a7..2c01a43a 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java @@ -7,16 +7,6 @@ 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.krakenFiat.ExchangeApiImpl(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressType.java b/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressType.java deleted file mode 100644 index a1415b1e..00000000 --- a/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressType.java +++ /dev/null @@ -1,51 +0,0 @@ -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}}; - } - -} diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidator.java b/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidator.java deleted file mode 100644 index ce5cec04..00000000 --- a/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidator.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * 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://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; - -import java.math.BigInteger; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; - -public class BitcoinAddressValidator { - private static final String ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - - public static Crypto validate(String address) { - for (BitcoinAddressType type : BitcoinAddressType.values()) { - if (validate(address, type)) - return Crypto.valueOf(type.name()); - } - return null; - } - - // 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; - 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); - - return Arrays.equals(Arrays.copyOfRange(hash2, 0, 4), Arrays.copyOfRange(decoded, 21, 25)); - } - - private static byte[] decodeBase58To25Bytes(String input) { - BigInteger num = BigInteger.ZERO; - for (char t : input.toCharArray()) { - int p = ALPHABET.indexOf(t); - if (p == -1) - return null; - num = num.multiply(BigInteger.valueOf(58)).add(BigInteger.valueOf(p)); - } - - byte[] result = new byte[25]; - byte[] numBytes = num.toByteArray(); - if (num.bitLength() > 200) return null; - - if (num.bitLength() == 200) { - System.arraycopy(numBytes, 1, result, 0, 25); - } else { - System.arraycopy(numBytes, 0, result, result.length - numBytes.length, numBytes.length); - } - return result; - } - - private static byte[] sha256(byte[] data) { - try { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - md.update(data); - return md.digest(); - } catch (NoSuchAlgorithmException e) { - throw new IllegalStateException(e); - } - } - - // - // validate Bech32 segwit - // see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki for spec - // - - private static final String DATA_CHARS = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; - - public static boolean validateBech32Segwit(String bech32, 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 (!bech32.startsWith(type.getBech32Prefix(testnet))) 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); - for (int i = 0; i < bytes.length; i++) { - if ((bytes[i] < 33) || (bytes[i] > 126)) { - return false; - } - if (bytes[i] == 49) sep = i; // 49 := '1' in ASCII - } - - if (sep != hrpLength) return false; - if (sep > bytes.length - 7) { - return false; // min 6 bytes data - } - if (bytes.length < 8) { // hrp{min}=1 + sep=1 + data{min}=6 := 8 - return false; // too short - } - if (bytes.length > 90) { - return false; // too long - } - - final byte[] hrp = Arrays.copyOfRange(bytes, 0, sep); - - final byte[] data = Arrays.copyOfRange(bytes, sep + 1, bytes.length); - for (int i = 0; i < data.length; i++) { - int b = DATA_CHARS.indexOf(data[i]); - if (b < 0) return false; // invalid character - data[i] = (byte) b; - } - - if (!validateBech32Data(data)) return false; - - return verifyChecksum(hrp, data); - } - - private static int polymod(byte[] values) { - final int[] GEN = {0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3}; - int chk = 1; - for (byte v : values) { - byte b = (byte) (chk >> 25); - chk = ((chk & 0x1ffffff) << 5) ^ v; - for (int i = 0; i < 5; i++) { - chk ^= ((b >> i) & 1) == 1 ? GEN[i] : 0; - } - } - return chk; - } - - private static byte[] hrpExpand(byte[] hrp) { - final byte[] expanded = new byte[(2 * hrp.length) + 1]; - int i = 0; - for (byte b : hrp) { - expanded[i++] = (byte) (b >> 5); - } - expanded[i++] = 0; - for (byte b : hrp) { - expanded[i++] = (byte) (b & 0x1f); - } - return expanded; - } - - private static boolean verifyChecksum(byte[] hrp, byte[] data) { - final byte[] hrpExpanded = hrpExpand(hrp); - final byte[] values = new byte[hrpExpanded.length + data.length]; - System.arraycopy(hrpExpanded, 0, values, 0, hrpExpanded.length); - System.arraycopy(data, 0, values, hrpExpanded.length, data.length); - return (polymod(values) == 1); - } - - private static boolean validateBech32Data(final byte[] data) { - if ((data[0] < 0) || (data[0] > 16)) return false; // witness version - final int programLength = data.length - 1 - 6; // 1-byte version at beginning & 6-byte checksum at end - - // since we are coming from our own decoder, we don't need to verify data is 5-bit bytes - - final int convertedSize = programLength * 5 / 8; - final int remainderSize = programLength * 5 % 8; - - if ((convertedSize < 2) || (convertedSize > 40)) return false; - - if ((data[0] == 0) && (convertedSize != 20) && (convertedSize != 32)) return false; - - if (remainderSize >= 5) return false; - // ignore checksum at end and get last byte of program - if ((data[data.length - 1 - 6] & ((1 << remainderSize) - 1)) != 0) return false; - - return true; - } -} diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/validator/EthAddressValidator.java b/app/src/main/java/com/m2049r/xmrwallet/util/validator/EthAddressValidator.java deleted file mode 100644 index 3e4c4763..00000000 --- a/app/src/main/java/com/m2049r/xmrwallet/util/validator/EthAddressValidator.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/CTextInputLayout.java b/app/src/main/java/com/m2049r/xmrwallet/widget/CTextInputLayout.java index e427e3d8..ccfdd0f7 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/CTextInputLayout.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/CTextInputLayout.java @@ -39,7 +39,8 @@ public class CTextInputLayout extends TextInputLayout { @Override public int getBaseline() { - EditText editText = getEditText(); + final EditText editText = getEditText(); + assert editText != null; return editText.getBaseline() - (getMeasuredHeight() - editText.getMeasuredHeight()); } } \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/DotBar.java b/app/src/main/java/com/m2049r/xmrwallet/widget/DotBar.java index 0baf2d3e..65965909 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/DotBar.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/DotBar.java @@ -25,8 +25,11 @@ import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; +import androidx.annotation.NonNull; + import com.m2049r.xmrwallet.R; +import lombok.Getter; import timber.log.Timber; public class DotBar extends View { @@ -37,7 +40,9 @@ public class DotBar extends View { final private float dotSize; private float dotSpacing; + @Getter final private int numDots; + @Getter private int activeDot; final private Paint paint; @@ -45,17 +50,13 @@ public class DotBar extends View { public DotBar(Context context, AttributeSet attrs) { super(context, attrs); - TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DotBar, 0, 0); - try { + try (TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DotBar, 0, 0)) { inactiveColor = ta.getInt(R.styleable.DotBar_inactiveColor, 0); activeColor = ta.getInt(R.styleable.DotBar_activeColor, 0); dotSize = ta.getDimensionPixelSize(R.styleable.DotBar_dotSize, 8); numDots = ta.getInt(R.styleable.DotBar_numberDots, 5); activeDot = ta.getInt(R.styleable.DotBar_activeDot, 0); - } finally { - ta.recycle(); } - paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setStyle(Paint.Style.FILL); } @@ -105,14 +106,14 @@ public class DotBar extends View { } @Override - protected void onDraw(Canvas canvas) { + protected void onDraw(@NonNull Canvas canvas) { super.onDraw(canvas); // Centering the dots in the middle of the canvas float singleDotSize = dotSpacing + dotSize; float combinedDotSize = singleDotSize * numDots - dotSpacing; - int startingX = (int) ((canvas.getWidth() - combinedDotSize) / 2); - int startingY = (int) ((canvas.getHeight() - dotSize) / 2); + int startingX = (int) ((getWidth() - combinedDotSize) / 2); + int startingY = (int) ((getHeight() - dotSize) / 2); for (int i = 0; i < numDots; i++) { int x = (int) (startingX + i * singleDotSize); @@ -145,12 +146,4 @@ public class DotBar extends View { invalidate(); } } - - public int getActiveDot() { - return activeDot; - } - - public int getNumDots() { - return numDots; - } } \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java index f274cae4..be32e270 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java @@ -400,7 +400,6 @@ public class ExchangeEditText extends LinearLayout { exchangeRate.getQuoteCurrency(), sCurrencyB.getSelectedItem()); return; } - exchangeRateCache = exchangeRate; if (prepareExchange()) { exchange(exchangeRate.getRate()); diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java index 3dd344ef..71ffa412 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java @@ -28,6 +28,8 @@ import android.widget.Spinner; import androidx.annotation.NonNull; import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.data.Crypto; +import com.m2049r.xmrwallet.data.CryptoAmount; import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback; import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate; import com.m2049r.xmrwallet.util.Helper; @@ -35,9 +37,18 @@ import com.m2049r.xmrwallet.util.Helper; import java.util.ArrayList; import java.util.List; +import lombok.Setter; import timber.log.Timber; public class ExchangeOtherEditText extends ExchangeEditText { + + public interface Listener { + void onExchangeRequested(); + } + + @Setter + private Listener listener = null; + /* all exchanges are done through XMR baseCurrency is the native currency @@ -60,13 +71,10 @@ public class ExchangeOtherEditText extends ExchangeEditText { } private void setBaseCurrency(Context context, AttributeSet attrs) { - TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ExchangeEditText, 0, 0); - try { + try (TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ExchangeEditText, 0, 0)) { baseCurrency = ta.getString(R.styleable.ExchangeEditText_baseSymbol); if (baseCurrency == null) throw new IllegalArgumentException("base currency must be set"); - } finally { - ta.recycle(); } } @@ -133,7 +141,7 @@ public class ExchangeOtherEditText extends ExchangeEditText { // first deal with XMR/baseCurrency & baseCurrency/XMR if (currencyA.equals(Helper.BASE_CRYPTO) && (currencyB.equals(baseCurrency))) { - localExchange(currencyA, currencyB, 1.0d / exchangeRate); + localExchange(currencyA, currencyB, (exchangeRate > 0) ? (1.0d / exchangeRate) : 0); return; } if (currencyA.equals(baseCurrency) && (currencyB.equals(Helper.BASE_CRYPTO))) { @@ -157,32 +165,29 @@ public class ExchangeOtherEditText extends ExchangeEditText { @Override public void onSuccess(final ExchangeRate exchangeRate) { if (isAttachedToWindow()) - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - ExchangeRate xchange = new ExchangeRate() { - @Override - public String getServiceName() { - return exchangeRate.getServiceName() + "+" + baseCurrency; - } + new Handler(Looper.getMainLooper()).post(() -> { + ExchangeRate xchange = new ExchangeRate() { + @Override + public String getServiceName() { + return exchangeRate.getServiceName() + "+" + baseCurrency; + } - @Override - public String getBaseCurrency() { - return baseIsBaseCrypto ? baseCurrency : base; - } + @Override + public String getBaseCurrency() { + return baseIsBaseCrypto ? baseCurrency : base; + } - @Override - public String getQuoteCurrency() { - return baseIsBaseCrypto ? quote : baseCurrency; - } + @Override + public String getQuoteCurrency() { + return baseIsBaseCrypto ? quote : baseCurrency; + } - @Override - public double getRate() { - return exchangeRate.getRate() * factor; - } - }; - exchange(xchange); - } + @Override + public double getRate() { + return exchangeRate.getRate() * factor; + } + }; + exchange(xchange); }); } @@ -193,4 +198,35 @@ public class ExchangeOtherEditText extends ExchangeEditText { } }); } + + @Override + public void doExchange() { + super.doExchange(); + if (listener != null) + listener.onExchangeRequested(); + } + + private double getCleanAmount(String enteredAmount) { + try { + return Double.parseDouble(enteredAmount); + } catch (NumberFormatException ex) { + return 0; + } + } + + public CryptoAmount getPrimaryAmount() { + // we can send xmr (=float) or baseCurrency (=fixed) + if (getCurrencyA() == 0) { // baseCurrency + // send it + return new CryptoAmount(Crypto.withSymbol(baseCurrency), getCleanAmount(etAmountA.getEditText().getText().toString())); + } else if (getCurrencyA() == 1) { // XMR + // send XMR + return new CryptoAmount(Helper.BASE_CRYPTO_CRYPTO, getCleanAmount(etAmountA.getEditText().getText().toString())); + } else if (getCurrencyB() == 0) { // fiat is on A (currencyB must be baseCurrency) + // send baseCurrency shown on B + return new CryptoAmount(Crypto.withSymbol(baseCurrency), getCleanAmount(tvAmountB.getText().toString())); + } else { + throw new IllegalStateException("B is not base"); + } + } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java index 6e647d1b..a574f328 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java @@ -51,6 +51,7 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; +import lombok.Setter; import timber.log.Timber; public class ExchangeView extends LinearLayout { @@ -441,29 +442,20 @@ public class ExchangeView extends LinearLayout { void onNewAmount(String xmr); } + @Setter OnNewAmountListener onNewAmountListener; - public void setOnNewAmountListener(OnNewAmountListener listener) { - onNewAmountListener = listener; - } - public interface OnAmountInvalidatedListener { void onAmountInvalidated(); } + @Setter OnAmountInvalidatedListener onAmountInvalidatedListener; - public void setOnAmountInvalidatedListener(OnAmountInvalidatedListener listener) { - onAmountInvalidatedListener = listener; - } - public interface OnFailedExchangeListener { void onFailedExchange(); } + @Setter OnFailedExchangeListener onFailedExchangeListener; - - public void setOnFailedExchangeListener(OnFailedExchangeListener listener) { - onFailedExchangeListener = listener; - } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/SendProgressView.java b/app/src/main/java/com/m2049r/xmrwallet/widget/SendProgressView.java index 11d53559..5b980c10 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/SendProgressView.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/SendProgressView.java @@ -23,6 +23,8 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.Nullable; + import com.m2049r.xmrwallet.R; public class SendProgressView extends LinearLayout { @@ -75,7 +77,7 @@ public class SendProgressView extends LinearLayout { llMessage.setVisibility(INVISIBLE); } - public void showMessage(String code, String message, String solution) { + public void showMessage(String code, String message, @Nullable String solution) { tvCode.setText(code); tvMessage.setText(message); tvSolution.setText(solution); diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java b/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java index d40ffa0a..f00081b9 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java @@ -30,6 +30,7 @@ import android.widget.TextView; import com.google.android.material.appbar.MaterialToolbar; import com.m2049r.xmrwallet.R; +import lombok.Setter; import timber.log.Timber; public class Toolbar extends MaterialToolbar { @@ -37,12 +38,9 @@ public class Toolbar extends MaterialToolbar { void onButton(int type); } + @Setter OnButtonListener onButtonListener; - public void setOnButtonListener(OnButtonListener listener) { - onButtonListener = listener; - } - ImageView toolbarImage; TextView toolbarTitle; TextView toolbarSubtitle; diff --git a/app/src/main/res/drawable-v24/ic_xmrto_dash_off.xml b/app/src/main/res/drawable-v24/ic_xmrto_dash_off.xml deleted file mode 100644 index 8d52acf7..00000000 --- a/app/src/main/res/drawable-v24/ic_xmrto_dash_off.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable-v24/ic_xmrto_doge_off.xml b/app/src/main/res/drawable-v24/ic_xmrto_doge_off.xml deleted file mode 100644 index dc12f6b4..00000000 --- a/app/src/main/res/drawable-v24/ic_xmrto_doge_off.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable-v24/ic_xmrto_sol_off.xml b/app/src/main/res/drawable-v24/ic_xmrto_sol_off.xml new file mode 100644 index 00000000..6f7c3740 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_xmrto_sol_off.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-v24/ic_xmrto_usdt_trc20_off.xml b/app/src/main/res/drawable-v24/ic_xmrto_usdt_trc20_off.xml new file mode 100644 index 00000000..77d6edcc --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_xmrto_usdt_trc20_off.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_error_red_24dp.xml b/app/src/main/res/drawable/ic_error_red_24dp.xml index 70e38a93..98f6d25b 100644 --- a/app/src/main/res/drawable/ic_error_red_24dp.xml +++ b/app/src/main/res/drawable/ic_error_red_24dp.xml @@ -4,6 +4,6 @@ android:viewportHeight="24.0" android:viewportWidth="24.0"> diff --git a/app/src/main/res/drawable/ic_exolix_icon.xml b/app/src/main/res/drawable/ic_exolix_icon.xml new file mode 100644 index 00000000..37cb4723 --- /dev/null +++ b/app/src/main/res/drawable/ic_exolix_icon.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_exolix_wide.xml b/app/src/main/res/drawable/ic_exolix_wide.xml new file mode 100644 index 00000000..b18e372d --- /dev/null +++ b/app/src/main/res/drawable/ic_exolix_wide.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sideshift_circle.xml b/app/src/main/res/drawable/ic_sideshift_icon.xml similarity index 51% rename from app/src/main/res/drawable/ic_sideshift_circle.xml rename to app/src/main/res/drawable/ic_sideshift_icon.xml index f894205f..206adf3b 100644 --- a/app/src/main/res/drawable/ic_sideshift_circle.xml +++ b/app/src/main/res/drawable/ic_sideshift_icon.xml @@ -1,12 +1,12 @@ + android:viewportWidth="103.75" + android:viewportHeight="103.75"> + android:pathData="M83.34,14.62A48.75,48.75 0,0 0,14.62 83.41Z" /> + android:pathData="M19.77,88.57A48.76,48.76 0,0 0,88.58 19.7Z" /> diff --git a/app/src/main/res/drawable/ic_sideshift_white.xml b/app/src/main/res/drawable/ic_sideshift_white.xml deleted file mode 100644 index 549c445f..00000000 --- a/app/src/main/res/drawable/ic_sideshift_white.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_sideshift_wide.xml b/app/src/main/res/drawable/ic_sideshift_wide.xml new file mode 100644 index 00000000..658af522 --- /dev/null +++ b/app/src/main/res/drawable/ic_sideshift_wide.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_xmrto_dash.xml b/app/src/main/res/drawable/ic_xmrto_dash.xml deleted file mode 100644 index a3ace157..00000000 --- a/app/src/main/res/drawable/ic_xmrto_dash.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_xmrto_dash_off.xml b/app/src/main/res/drawable/ic_xmrto_dash_off.xml deleted file mode 100644 index e1836260..00000000 --- a/app/src/main/res/drawable/ic_xmrto_dash_off.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_xmrto_doge.xml b/app/src/main/res/drawable/ic_xmrto_doge.xml deleted file mode 100644 index c8bfcd78..00000000 --- a/app/src/main/res/drawable/ic_xmrto_doge.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_xmrto_doge_off.xml b/app/src/main/res/drawable/ic_xmrto_doge_off.xml deleted file mode 100644 index c6c6a3b5..00000000 --- a/app/src/main/res/drawable/ic_xmrto_doge_off.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_xmrto_sol.xml b/app/src/main/res/drawable/ic_xmrto_sol.xml new file mode 100644 index 00000000..d765c9c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_sol.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_xmrto_sol_off.xml b/app/src/main/res/drawable/ic_xmrto_sol_off.xml new file mode 100644 index 00000000..5a627fec --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_sol_off.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_xmrto_usdt_trc20.xml b/app/src/main/res/drawable/ic_xmrto_usdt_trc20.xml new file mode 100644 index 00000000..cdd0c1bf --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_usdt_trc20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_xmrto_usdt_trc20_off.xml b/app/src/main/res/drawable/ic_xmrto_usdt_trc20_off.xml new file mode 100644 index 00000000..52f5a357 --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_usdt_trc20_off.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_send_address.xml b/app/src/main/res/layout/fragment_send_address.xml index 1194fc1c..72356654 100644 --- a/app/src/main/res/layout/fragment_send_address.xml +++ b/app/src/main/res/layout/fragment_send_address.xml @@ -113,23 +113,23 @@ android:contentDescription="ETH"/> + android:src="@drawable/ic_xmrto_usdt_trc20_off" + android:contentDescription="USDT"/> diff --git a/app/src/main/res/layout/fragment_send_btc_amount.xml b/app/src/main/res/layout/fragment_send_btc_amount.xml index fd1b9f8b..f0fe21f0 100644 --- a/app/src/main/res/layout/fragment_send_btc_amount.xml +++ b/app/src/main/res/layout/fragment_send_btc_amount.xml @@ -34,11 +34,12 @@ android:visibility="invisible"> + android:src="@drawable/ic_exolix_icon" /> + android:visibility="invisible"> + card_view:drawableStartCompat="@drawable/ic_exolix_icon" /> + android:src="@drawable/ic_exolix_wide" /> Si utilitzeu la funcionalitat d’intercanvi (opcional), monerujo obté el canvi          a través de l’API pública de coinmarketcap.com.          Consulteu la seva política de privacitat a https://coinmarketcap.com/privacy per a més detalls sobre com es recullen les dades de les vostres peticions

-

Si utilitzeu l’aplicació per pagar a adreces BTC, utilitzareu el servei SideShift.ai. -         Consulteu la seva política de privacitat a https://sideshift.ai/ per obtenir més informació. Monerujo els envia l’adreça de destinació de BTC i la quantitat. La vostra IP també podrà ser recollida.

+

Si utilitzeu l’aplicació per pagar a adreces BTC, utilitzareu el servei Exolix. +         Consulteu la seva política de privacitat a https://exolix.com/privacy per obtenir més informació. Monerujo els envia l’adreça de destinació de BTC i la quantitat. La vostra IP també podrà ser recollida.

Permisos de la App

  • INTERNET : Connectar a la xarxa Monero mitjançant un Node Daemon de Monero
  • diff --git a/app/src/main/res/values-cat/help.xml b/app/src/main/res/values-cat/help.xml index 51298ddd..548167e8 100644 --- a/app/src/main/res/values-cat/help.xml +++ b/app/src/main/res/values-cat/help.xml @@ -118,40 +118,40 @@
  • un OpenAlias per XMR o BTC
  • una adreça BTC
  • - Tingueu en compte que l’enviament de BTC es duu a terme a través del servei SideShift.ai (consulteu https://sideshift.ai per a més detalls). Consulteu la secció sobre l’enviament de BTC més avall.

    + Tingueu en compte que l’enviament de BTC es duu a terme a través del servei Exolix (consulteu https://exolix.com per a més detalls). Consulteu la secció sobre l’enviament de BTC més avall.

    Enviant BTC

    -

    SideShift.ai

    -

    SideShift.ai és un servei de tercers que fa proporciona el canvi de Monero a Bitcoin. - Nosaltres fem servir l’API SideShift.ai per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop d’ull a https://sideshift.ai i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. L’equip de Monerujo no està associat amb SideShift.ai i no pot oferir assistència amb el seu servei.

    -

    Tipus de Canvi SideShift.ai

    -

    A la pantalla \"Quantitat\" es mostraran els paràmetres actuals del servei SideShift.ai. Aquests +

    Exolix

    +

    Exolix és un servei de tercers que fa proporciona el canvi de Monero a Bitcoin. + Nosaltres fem servir l’API Exolix per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop d’ull a https://exolix.com i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. L’equip de Monerujo no està associat amb Exolix i no pot oferir assistència amb el seu servei.

    +

    Tipus de Canvi Exolix

    +

    A la pantalla \"Quantitat\" es mostraran els paràmetres actuals del servei Exolix. Aquests inclouen el tipus de canvi actual, així com els límits de BTC superiors i inferiors. Tingueu en compte que la tarifa no està garantida en aquell mateix moment.

    -

    Ordre de compra SideShift.ai

    -

    A la pantalla \"Confirmar\", veureu l’ordre de compra SideShift.ai real. Aquesta comanda és vàlida per a +

    Ordre de compra Exolix

    +

    A la pantalla \"Confirmar\", veureu l’ordre de compra Exolix real. Aquesta comanda és vàlida per a un temps limitat: és possible que veieu un compte enrere en el botó \"Gastar\". El tipus de canvi pot ser diferent del mostrat en pantalles anteriors.

    -

    Clau Secreta SideShift.ai

    -

    Com que Monerujo només gestiona la part Monero de la vostra transacció, la vostra clau secreta per SideShift.ai es pot utilitzar per fer el seguiment de la part de Bitcoin de la vostra comanda a la pàgina principal de SideShift.ai.

    -

    Compte enrere SideShift.ai!

    -

    Una vegada el compte enrere arribi a zero haureu d’obtenir una nova sol·licitud de SideShift.ai tornant enrere al pas anterior i després tornar a la pantalla de \"Confirmar\".

    +

    Clau Secreta Exolix

    +

    Com que Monerujo només gestiona la part Monero de la vostra transacció, la vostra clau secreta per Exolix es pot utilitzar per fer el seguiment de la part de Bitcoin de la vostra comanda a la pàgina principal de Exolix.

    +

    Compte enrere Exolix!

    +

    Una vegada el compte enrere arribi a zero haureu d’obtenir una nova sol·licitud de Exolix tornant enrere al pas anterior i després tornar a la pantalla de \"Confirmar\".

    ]]> Enviant BTC -

    SideShift.ai

    -

    SideShift.ai és un servei de tercers que fa proporciona el canvi de Monero a Bitcoin. - Nosaltres fem servir l’API SideShift.ai per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop d’ull a https://sideshift.ai i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. L’equip de Monerujo no està associat amb SideShift.ai i no pot oferir assistència amb el seu servei.

    -

    Tipus de Canvi SideShift.ai

    -

    A la pantalla \"Quantitat\" es mostraran els paràmetres actuals del servei SideShift.ai. Aquests +

    Exolix

    +

    Exolix és un servei de tercers que fa proporciona el canvi de Monero a Bitcoin. + Nosaltres fem servir l’API Exolix per integrar els pagaments de Bitcoin a Monerujo. Si us plau, doneu un cop d’ull a https://exolix.com i decidiu vosaltres mateixos si és una cosa que volgueu utilitzar. L’equip de Monerujo no està associat amb Exolix i no pot oferir assistència amb el seu servei.

    +

    Tipus de Canvi Exolix

    +

    A la pantalla \"Quantitat\" es mostraran els paràmetres actuals del servei Exolix. Aquests inclouen el tipus de canvi actual, així com els límits de BTC superiors i inferiors. Tingueu en compte que la tarifa no està garantida en aquell mateix moment.

    -

    Ordre de compra SideShift.ai

    -

    A la pantalla \"Confirmar\", veureu l’ordre de compra SideShift.ai real. Aquesta comanda és vàlida per a +

    Ordre de compra Exolix

    +

    A la pantalla \"Confirmar\", veureu l’ordre de compra Exolix real. Aquesta comanda és vàlida per a un temps limitat: és possible que veieu un compte enrere en el botó \"Gastar\". El tipus de canvi pot ser diferent del mostrat en pantalles anteriors.

    -

    Clau Secreta SideShift.ai

    -

    Com que Monerujo només gestiona la part Monero de la vostra transacció, la vostra clau secreta per SideShift.ai es pot utilitzar per fer el seguiment de la part de Bitcoin de la vostra comanda a la pàgina principal de SideShift.ai.

    -

    Compte enrere SideShift.ai!

    -

    Una vegada el compte enrere arribi a zero haureu d’obtenir una nova sol·licitud de SideShift.ai tornant enrere al pas anterior i després tornar a la pantalla de \"Confirmar\".

    +

    Clau Secreta Exolix

    +

    Com que Monerujo només gestiona la part Monero de la vostra transacció, la vostra clau secreta per Exolix es pot utilitzar per fer el seguiment de la part de Bitcoin de la vostra comanda a la pàgina principal de Exolix.

    +

    Compte enrere Exolix!

    +

    Una vegada el compte enrere arribi a zero haureu d’obtenir una nova sol·licitud de Exolix tornant enrere al pas anterior i després tornar a la pantalla de \"Confirmar\".

    ]]>
    Heu introduït una adreça %1$s.
    - Està a punt d\'enviar XMR i el destinatari rebrà %1$s a través del servei SideShift.ai service. + Està a punt d\'enviar XMR i el destinatari rebrà %2$s a través del servei %3$s service. ]]>
    - Ordre SideShift.ai + Ordre %1$s %1$s %2$s Confirmació Pendent Pagament Pendent - Error de SideShift.ai (%1$s) + Error de %1$s (%2$s) %1$s Enviats! Consultant … You can send %1$s — %2$s %4$s.
    - SideShift.ai està oferint una tasa de canvi de %3$s %4$s/XMR en aquest moment. + %5$s està oferint una tasa de canvi de %3$s %4$s/XMR en aquest moment. ]]>
    - Balanç: %2$s %3$s (%1$s XMR) + Balanç: %1$s XMR (~%2$s %3$s) ✔ ID de pagment integrat Preparant la seva transacció - Creant ordre SideShift.ai - Consultant ordre SideShift.ai + Creant ordre + Consultant ordre Preparant transacció Monero - Consultant paràmetres SideShift.ai + Consultant paràmetres - ERROR SideShift.ai + ERROR Codi: %1$d Premi aquí per tornar-ho a intentar Vatua l\'olla! Sembla ser que estem encallats! - Ups, sembla que SideShift.ai no està disponible ara mateix! + Ups, sembla que %1$s no està disponible ara mateix! %1$s %3$s = %2$s XMR (Canvi: %1$s %2$s/XMR) - Visita SideShift.ai per suport i seguiment - Clau secreta\nSideShift.ai - Clau secreta SideShift.ai + Visita %1$s per suport i seguiment + Clau secreta\n%1$s + Clau secreta %1$s Adreça %1$s de destí Quantitat @@ -148,7 +148,7 @@ Adreça Pública Clau Clau de visualització copiada al porta-retalls! - Clau de SideShift.ai copiada al porta-retalls! + Clau copiada al porta-retalls! Adreça del portamonedes copiada al porta-retalls! ID de transacció copiada al porta-retalls! S\'ha inhabilitat la funció de copiar per raons de seguretat! @@ -358,7 +358,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -390,7 +390,7 @@ Please enter or scan a %1$s address.
    - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
    Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-de/about.xml b/app/src/main/res/values-de/about.xml index 970bd2f0..d8e21318 100644 --- a/app/src/main/res/values-de/about.xml +++ b/app/src/main/res/values-de/about.xml @@ -33,8 +33,8 @@ den aktuellen Kurs über die öffentliche Schnittstelle von coinmarketcap.com ab. Siehe dir ihre Datenschutzerklärung unter https://coinmarketcap.com/privacy für Details darüber an, wie Daten in deinen Anfragen gesammelt werden.

    -

    Wenn du die App zum Bezahlen an BTC-Adressen verwendest, verwendest du den Dienst SideShift.ai. - Weitere Informationen findest du in der Datenschutzerklärung unter https://sideshift.ai/. +

    Wenn du die App zum Bezahlen an BTC-Adressen verwendest, verwendest du den Dienst Exolix. + Weitere Informationen findest du in der Datenschutzerklärung unter https://exolix.com/privacy. Monerujo schickt dem Anbieter die BTC-Zieladresse und den Betrag. Deine IP-Adresse kann dabei aufgezeichnet werden.

    App-Berechtigungen

    diff --git a/app/src/main/res/values-de/help.xml b/app/src/main/res/values-de/help.xml index c680b56c..41c92ee3 100644 --- a/app/src/main/res/values-de/help.xml +++ b/app/src/main/res/values-de/help.xml @@ -149,48 +149,48 @@
  • einen OpenAlias für XMR oder BTC
  • eine BTC-Adresse
  • - nutzen. Beachte bitte, dass das Senden von BTC über den Service von SideShift.ai erfolgt. (Siehe https://sideshift.ai + nutzen. Beachte bitte, dass das Senden von BTC über den Service von Exolix erfolgt. (Siehe https://exolix.com für Details). Weitere Details sind weiter unten unter "BTC senden".

    BTC senden

    -

    SideShift.ai

    -

    SideShift.ai ist ein Drittanbieter-Service, welcher als Wechselservice von Monero zu Bitcoin fungiert. - Wir nutzen die SideShift.ai-Schnittstelle, um Bitcoin-Zahlungen in Monerujo zu integrieren. Bitte schaue dir - https://sideshift.ai an und entscheide selbst, ob du diesen Service nutzen willst. Das Monerujo-Team - gehört nicht zu SideShift.ai und kann keinen Support für dessen Service bieten.

    -

    SideShift.ai-Wechselkurs

    -

    Auf dem \"Menge\" Bildschirm siehst du die aktuellen Werte des SideShift.ai-Service. Diese beinhalten den aktuellen Tauschkurs +

    Exolix

    +

    Exolix ist ein Drittanbieter-Service, welcher als Wechselservice von Monero zu Bitcoin fungiert. + Wir nutzen die Exolix-Schnittstelle, um Bitcoin-Zahlungen in Monerujo zu integrieren. Bitte schaue dir + https://exolix.com an und entscheide selbst, ob du diesen Service nutzen willst. Das Monerujo-Team + gehört nicht zu Exolix und kann keinen Support für dessen Service bieten.

    +

    Exolix-Wechselkurs

    +

    Auf dem \"Menge\" Bildschirm siehst du die aktuellen Werte des Exolix-Service. Diese beinhalten den aktuellen Tauschkurs sowie die oberen und unteren BTC-Limits. Bitte bedenke, dass dieser Kurs zu diesem Zeitpunkt nicht garantiert ist.

    -

    SideShift.ai-Auftrag

    -

    Auf dem \"Bestätigen\" Bildschirm siehst du das genaue SideShift.ai-Angebot. Dieses Angebot gilt +

    Exolix-Auftrag

    +

    Auf dem \"Bestätigen\" Bildschirm siehst du das genaue Exolix-Angebot. Dieses Angebot gilt für eine bestimmte Zeit – du siehst einen Countdown auf dem \"Ausgeben\" Button. Der Wechselkurs kann sich von den vorherigen Angaben unterscheiden.

    -

    Geheimer SideShift.ai-Schlüssel

    -

    Da Monerujo nur den Monero-Teil deiner Transaktion verarbeitet, kann dein geheimer SideShift.ai-Schlüssel - dazu benutzt werden, den Bitcoin-Teil deines Auftrags auf der SideShift.ai-Homepage zu verfolgen.

    -

    SideShift.ai-Countdown!

    -

    Wenn der Countdown 0 erreicht, musst du ein neues Angebot von SideShift.ai anfordern, indem du zum vorherigen Schritt +

    Geheimer Exolix-Schlüssel

    +

    Da Monerujo nur den Monero-Teil deiner Transaktion verarbeitet, kann dein geheimer Exolix-Schlüssel + dazu benutzt werden, den Bitcoin-Teil deines Auftrags auf der Exolix-Homepage zu verfolgen.

    +

    Exolix-Countdown!

    +

    Wenn der Countdown 0 erreicht, musst du ein neues Angebot von Exolix anfordern, indem du zum vorherigen Schritt zurückkehrst und wieder zum \"Bestätigen\"-Bildschirm zurückkommst.

    ]]> BTC senden -

    SideShift.ai

    -

    SideShift.ai ist ein Drittanbieter-Service, welcher als Wechselservice von Monero zu Bitcoin fungiert. - Wir nutzen die SideShift.ai-Schnittstelle, um Bitcoin-Zahlungen in Monerujo zu integrieren. Bitte schaue dir - https://sideshift.ai an und entscheide selbst, ob du diesen Service nutzen willst. Das Monerujo-Team - gehört nicht zu SideShift.ai und kann keinen Support für dessen Service bieten.

    -

    SideShift.ai-Wechselkurs

    -

    Auf dem \"Menge\" Bildschirm siehst du die aktuellen Werte des SideShift.ai-Service. Diese beinhalten den aktuellen Tauschkurs +

    Exolix

    +

    Exolix ist ein Drittanbieter-Service, welcher als Wechselservice von Monero zu Bitcoin fungiert. + Wir nutzen die Exolix-Schnittstelle, um Bitcoin-Zahlungen in Monerujo zu integrieren. Bitte schaue dir + https://exolix.com an und entscheide selbst, ob du diesen Service nutzen willst. Das Monerujo-Team + gehört nicht zu Exolix und kann keinen Support für dessen Service bieten.

    +

    Exolix-Wechselkurs

    +

    Auf dem \"Menge\" Bildschirm siehst du die aktuellen Werte des Exolix-Service. Diese beinhalten den aktuellen Tauschkurs sowie die oberen und unteren BTC-Limits. Bitte bedenke, dass dieser Kurs zu diesem Zeitpunkt nicht garantiert ist.

    -

    SideShift.ai-Auftrag

    -

    Auf dem \"Bestätigen\" Bildschirm siehst du das genaue SideShift.ai-Angebot. Dieses Angebot gilt +

    Exolix-Auftrag

    +

    Auf dem \"Bestätigen\" Bildschirm siehst du das genaue Exolix-Angebot. Dieses Angebot gilt für eine bestimmte Zeit – du siehst einen Countdown auf dem \"Ausgeben\" Button. Der Wechselkurs kann sich von den vorherigen Angaben unterscheiden.

    -

    Geheimer SideShift.ai-Schlüssel

    -

    Da Monerujo nur den Monero-Teil deiner Transaktion verarbeitet, kann dein geheimer SideShift.ai-Schlüssel - dazu benutzt werden, den Bitcoin-Teil deines Auftrags auf der SideShift.ai-Homepage zu verfolgen.

    -

    SideShift.ai-Countdown!

    -

    Wenn der Countdown 0 erreicht, musst du ein neues Angebot von SideShift.ai anfordern, indem du zum vorherigen Schritt +

    Geheimer Exolix-Schlüssel

    +

    Da Monerujo nur den Monero-Teil deiner Transaktion verarbeitet, kann dein geheimer Exolix-Schlüssel + dazu benutzt werden, den Bitcoin-Teil deines Auftrags auf der Exolix-Homepage zu verfolgen.

    +

    Exolix-Countdown!

    +

    Wenn der Countdown 0 erreicht, musst du ein neues Angebot von Exolix anfordern, indem du zum vorherigen Schritt zurückkehrst und wieder zum \"Bestätigen\"-Bildschirm zurückkommst.

    ]]>
    diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 26e4af13..5ff8be7b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -36,48 +36,48 @@ Du hast eine %1$s-Adresse eingegeben.
    - Du wirst XMR versenden und der Empfänger durch den SideShift.ai Service %1$s erhalten. + Du wirst XMR versenden und der Empfänger durch den %3$s Service %2$s erhalten. ]]>
    - SideShift.ai-Auftrag + %1$s-Auftrag %1$s %2$s Bestätigung ausstehend Bezahlung ausstehend - SideShift.ai-Fehler (%1$s) + %1$s-Fehler (%2$s) %1$s gesendet! Frage ab … Du kannst %1$s — %2$s %4$s senden.
    - SideShift.ai gibt dir aktuell einen Wechselkurs von %3$s %4$s/XMR. + %5$s gibt dir aktuell einen Wechselkurs von %3$s %4$s/XMR. ]]>
    - Guthaben: %2$s %3$s (%1$s XMR) + Guthaben: %1$s XMR (~%2$s %3$s) ✔ Zahlungs-ID integriert Bereite deine Transaktion vor - Erstelle SideShift.ai-Auftrag - Frage SideShift.ai-Auftrag ab + Erstelle Auftrag + Frage Auftrag ab Bereite Monero-Transaktion vor - Frage SideShift.ai-Parameter ab + Frage Parameter ab - SideShift.ai-FEHLER + FEHLER Code: %1$d Berühre zum Wiederholen Jetzt hängen wir hier fest! - Oh – SideShift.ai scheint im Moment nicht verfügbar zu sein! + Oh – %1$s scheint im Moment nicht verfügbar zu sein! %1$s %3$s = %2$s XMR (Kurs: %1$s %2$s/XMR) - Besuche SideShift.ai für Support & Nachverfolgung - Geheimer Schlüssel\nSideShift.ai - SideShift.ai – Geheimer Schlüssel + Besuche %1$s für Support & Nachverfolgung + Geheimer Schlüssel\n%1$s + %1$s Geheimer Schlüssel %1$s-Zieladresse Betrag @@ -363,7 +363,7 @@ Halte deinen Seed geheim Der Seed ermöglicht vollen Zugriff auf deine Monero - jedem der ihn besitzt. Du bist in der Verantwortung: Wenn du ihn verlierst, kann ihn niemand wiederherstellen und deine gespeicherten Monero sind verloren. Sende Krypto - Monerujo hat SideShift.ai unterstützung eingebaut. Scanne oder kopiere einfach eine BTC, LTC, ETH, DASH oder DOGE Adresse und schon kannst du mit deinen XMR bezahlen. + Monerujo hat exchange unterstützung eingebaut. Scanne oder kopiere einfach eine BTC, LTC, ETH, TRXUSDT oder SOL Adresse und schon kannst du mit deinen XMR bezahlen. Nodes und deine Knoten Nodes(Knoten) verbinden dich mit dem Moneronetzwerk. Du kannst öffentliche Nodes oder deinen eigenen verwenden. Sende Geld mit deinem Fingerabdruck @@ -395,7 +395,7 @@ Bitte scanne oder trage eine %1$s Adresse ein.
    - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
    TOR benötigt \u00A0WARTE AUF KNOTEN\u00A0 "Erlaube Hintergrundstart" in Orbot Einstellungen um TOR zu nutzen! - SideShift.ai unterstützt nicht TOR.\nDeaktiviere TOR um XMR zu wechseln. + %1$s unterstützt nicht TOR.\nDeaktiviere TOR um XMR zu wechseln. Seed-Verschlüsselung (EXPERIMENTELL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-el/about.xml b/app/src/main/res/values-el/about.xml index 81d45158..fd909d36 100644 --- a/app/src/main/res/values-el/about.xml +++ b/app/src/main/res/values-el/about.xml @@ -34,8 +34,8 @@ rate through the public API of coinmarketcap.com. See their privacy policy at https://coinmarketcap.com/privacy for details on how data in your requests is collected.

    -

    If you use the app to pay to BTC addresses, you will be using the SideShift.ai service. - See their privacy policy at https://sideshift.ai/ for details. Monerujo send them the BTC +

    If you use the app to pay to BTC addresses, you will be using the Exolix service. + See their privacy policy at https://exolix.com/privacy for details. Monerujo send them the BTC destination address and amount. Your IP will also be collectable.

    App Permissions

      diff --git a/app/src/main/res/values-el/help.xml b/app/src/main/res/values-el/help.xml index c1a7434c..18c07e43 100644 --- a/app/src/main/res/values-el/help.xml +++ b/app/src/main/res/values-el/help.xml @@ -128,50 +128,50 @@
    • an OpenAlias for XMR or BTC
    • a BTC address
    • - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

      Αποστολή BTC

      -

      SideShift.ai

      -

      Το SideShift.ai είναι τρίτος πάροχος που δρα σαν ανταλλακτήριο από Monero σε Bitcoin. - Χρησιμοποιούμε το API του SideShift.ai για να ενσωματώσουμε πληρωμές Bitcoin στο Monerujo. Παρακαλώ δες το - https://sideshift.ai και αποφάσισε για τον εαυτό σου εαν αυτό είναι κάτι που θες να χρησιμοποιήσεις. Η Ομάδα του - Monerujo δεν συνδέεται με το SideShift.ai και δεν μπορεί να σε βοηθήσει με την υπηρεσία.

      -

      Ισοτιμία συναλλάγματος SideShift.ai

      -

      Στην οθόνη \"Ποσό\" θα σου δωθούν οι τρέχουσες παράμετροι της υπηρεσίας SideShift.ai. Αυτές +

      Exolix

      +

      Το Exolix είναι τρίτος πάροχος που δρα σαν ανταλλακτήριο από Monero σε Bitcoin. + Χρησιμοποιούμε το API του Exolix για να ενσωματώσουμε πληρωμές Bitcoin στο Monerujo. Παρακαλώ δες το + https://exolix.com και αποφάσισε για τον εαυτό σου εαν αυτό είναι κάτι που θες να χρησιμοποιήσεις. Η Ομάδα του + Monerujo δεν συνδέεται με το Exolix και δεν μπορεί να σε βοηθήσει με την υπηρεσία.

      +

      Ισοτιμία συναλλάγματος Exolix

      +

      Στην οθόνη \"Ποσό\" θα σου δωθούν οι τρέχουσες παράμετροι της υπηρεσίας Exolix. Αυτές περιλαμβάνουν την τρέχουσα ισοτιμία καθώς και τα μέγιστα και ελάχιστα όρια BTC. Σημειωτέον ότι αυτή η ισοτιμία δεν εξασφαλίζεται σε αυτό το σημείο.

      -

      Εντολή SideShift.ai

      -

      Στην οθόνη \"Επιβεβαίωση\", θα δεις την πραγματική εντολή SideShift.ai. Αυτή η εντολή ισχύει για +

      Εντολή Exolix

      +

      Στην οθόνη \"Επιβεβαίωση\", θα δεις την πραγματική εντολή Exolix. Αυτή η εντολή ισχύει για περιορισμένο χρόνο - μπορεί να προσέξεις μια αντίστροφη μέτρηση στο κουμπί \"Ξόδεψε\". Η ισοτιμία μπορεί να είναι διαφορετική από την ενδεικτική που φαινόταν σε προηγούμενες οθόνες.

      -

      Μυστικό Κλειδί SideShift.ai

      -

      Μιας και το Monerujo διαχειρίζεται μόνο την πλευρά του Monero της συναλλαγής το μυστικό κλειδί SideShift.ai - μπορεί να χρησιμοποιηθεί για να εντοπίσει την συναλλαγή απο μεριάς Bitcoin στην SideShift.ai εντολή σου στην αρχική τους σελίδα.

      -

      Αντίστροφη μέτρηση SideShift.ai!

      -

      Μόλις η αντίστροφη μέτρηση φθάσει στο μηδέν, χρειάζεται να ξεκινήσεις πάλι την συναλλαγή στο SideShift.ai πηγαίνοντας +

      Μυστικό Κλειδί Exolix

      +

      Μιας και το Monerujo διαχειρίζεται μόνο την πλευρά του Monero της συναλλαγής το μυστικό κλειδί Exolix + μπορεί να χρησιμοποιηθεί για να εντοπίσει την συναλλαγή απο μεριάς Bitcoin στην Exolix εντολή σου στην αρχική τους σελίδα.

      +

      Αντίστροφη μέτρηση Exolix!

      +

      Μόλις η αντίστροφη μέτρηση φθάσει στο μηδέν, χρειάζεται να ξεκινήσεις πάλι την συναλλαγή στο Exolix πηγαίνοντας πίσω στο προηγούμενο βήμα και μετά επιστρέφοντας στην οθόνη \"Επιβεβαίωση\".

      ]]> Αποστολή BTC -

      SideShift.ai

      -

      Το SideShift.ai είναι τρίτος πάροχος που δρα σαν ανταλλακτήριο από Monero σε Bitcoin. - Χρησιμοποιούμε το API του SideShift.ai για να ενσωματώσουμε πληρωμές Bitcoin στο Monerujo. Παρακαλώ δες το - https://sideshift.ai και αποφάσισε για τον εαυτό σου εαν αυτό είναι κάτι που θες να χρησιμοποιήσεις. Η Ομάδα του - Monerujo δεν συνδέεται με το SideShift.ai και δεν μπορεί να σε βοηθήσει με την υπηρεσία.

      -

      Ισοτιμία συναλλάγματος SideShift.ai

      -

      Στην οθόνη \"Ποσό\" θα σου δωθούν οι τρέχουσες παράμετροι της υπηρεσίας SideShift.ai. Αυτές +

      Exolix

      +

      Το Exolix είναι τρίτος πάροχος που δρα σαν ανταλλακτήριο από Monero σε Bitcoin. + Χρησιμοποιούμε το API του Exolix για να ενσωματώσουμε πληρωμές Bitcoin στο Monerujo. Παρακαλώ δες το + https://exolix.com και αποφάσισε για τον εαυτό σου εαν αυτό είναι κάτι που θες να χρησιμοποιήσεις. Η Ομάδα του + Monerujo δεν συνδέεται με το Exolix και δεν μπορεί να σε βοηθήσει με την υπηρεσία.

      +

      Ισοτιμία συναλλάγματος Exolix

      +

      Στην οθόνη \"Ποσό\" θα σου δωθούν οι τρέχουσες παράμετροι της υπηρεσίας Exolix. Αυτές περιλαμβάνουν την τρέχουσα ισοτιμία καθώς και τα μέγιστα και ελάχιστα όρια BTC. Σημειωτέον ότι αυτή η ισοτιμία δεν εξασφαλίζεται σε αυτό το σημείο.

      -

      Εντολή SideShift.ai

      -

      Στην οθόνη \"Επιβεβαίωση\", θα δεις την πραγματική εντολή SideShift.ai. Αυτή η εντολή ισχύει για +

      Εντολή Exolix

      +

      Στην οθόνη \"Επιβεβαίωση\", θα δεις την πραγματική εντολή Exolix. Αυτή η εντολή ισχύει για περιορισμένο χρόνο - μπορεί να προσέξεις μια αντίστροφη μέτρηση στο κουμπί \"Ξόδεψε\". Η ισοτιμία μπορεί να είναι διαφορετική από την ενδεικτική που φαινόταν σε προηγούμενες οθόνες.

      -

      Μυστικό Κλειδί SideShift.ai

      -

      Μιας και το Monerujo διαχειρίζεται μόνο την πλευρά του Monero της συναλλαγής το μυστικό κλειδί SideShift.ai - μπορεί να χρησιμοποιηθεί για να εντοπίσει την συναλλαγή απο μεριάς Bitcoin στην SideShift.ai εντολή σου στην αρχική τους σελίδα.

      -

      Αντίστροφη μέτρηση SideShift.ai!

      -

      Μόλις η αντίστροφη μέτρηση φθάσει στο μηδέν, χρειάζεται να ξεκινήσεις πάλι την συναλλαγή στο SideShift.ai πηγαίνοντας +

      Μυστικό Κλειδί Exolix

      +

      Μιας και το Monerujo διαχειρίζεται μόνο την πλευρά του Monero της συναλλαγής το μυστικό κλειδί Exolix + μπορεί να χρησιμοποιηθεί για να εντοπίσει την συναλλαγή απο μεριάς Bitcoin στην Exolix εντολή σου στην αρχική τους σελίδα.

      +

      Αντίστροφη μέτρηση Exolix!

      +

      Μόλις η αντίστροφη μέτρηση φθάσει στο μηδέν, χρειάζεται να ξεκινήσεις πάλι την συναλλαγή στο Exolix πηγαίνοντας πίσω στο προηγούμενο βήμα και μετά επιστρέφοντας στην οθόνη \"Επιβεβαίωση\".

      ]]>
      diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 8368f2d5..f354e70c 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -34,48 +34,48 @@ Έβαλες μια διεύθυνση %1$s.
      - Θα στείλεις XMR και ο παραλήπτης θα πάρει %1$s μέσο της υπηρεσίας SideShift.ai. + Θα στείλεις XMR και ο παραλήπτης θα πάρει %2$s μέσο της υπηρεσίας %3$s. ]]>
      - Εντολή SideShift.ai + Εντολή %1$s %1$s %2$s Επιβεβαίωση Εκκρεμεί Πληρωμή σε εκκρεμότητα - SideShift.ai Σφάλμα (%1$s) + %1$s Σφάλμα (%2$s) %1$s Αποστάλθηκαν! Αίτηση … Μπορείς να στείλεις %1$s — %2$s %4$s.
      - Το SideShift.ai σου δίνει ισοτιμία ανταλλαγής %3$s %4$s/XMR αυτή τη στιγμή. + Το %5$s σου δίνει ισοτιμία ανταλλαγής %3$s %4$s/XMR αυτή τη στιγμή. ]]>
      - Σύνολο: %2$s %3$s (%1$s XMR) + Σύνολο: %1$s XMR (~%2$s %3$s) ✔ ID πληρωμής ενσωματωμένο Προετοιμασία της συναλλαγής σου - Δημιουργία εντολής με SideShift.ai - Αίτηση εντολής στο SideShift.ai + Δημιουργία εντολής + Αίτηση εντολής Προετοιμασά συναλλαγής Monero - Αίτηση στο SideShift.ai για παραμέτρους + Αίτηση για παραμέτρους - SideShift.ai ΣΦΑΛΜΑ + ΣΦΑΛΜΑ Κωδικός σφάλματος: %1$d Πάτησε για να προσπαθήσεις ξανά Τώρα έχουμε κολλήσει εδώ! - Ωχ,το SideShift.ai φαίνεται να μην ειναι προσωρινά διαθέσιμο! + Ωχ,το %1$s φαίνεται να μην ειναι προσωρινά διαθέσιμο! %1$s %3$s = %2$s XMR (Rate: %1$s %2$s/XMR) - Επίσκεψη στο SideShift.ai για υποστήριξη & με εντοπισμό συναλλαγής - Μυστικό Κλειδί\nSideShift.ai - SideShift.ai Μυστικό Κλειδί + Επίσκεψη στο %1$s για υποστήριξη & με εντοπισμό συναλλαγής + Μυστικό Κλειδί\n%1$s + %1$s Μυστικό Κλειδί %1$s Διεύθυνση Παραλήπτη Ποσό @@ -360,7 +360,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -392,7 +392,7 @@ Please enter or scan a %1$s address.
      - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
      Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-eo/about.xml b/app/src/main/res/values-eo/about.xml index 2742fef3..15fa3a86 100644 --- a/app/src/main/res/values-eo/about.xml +++ b/app/src/main/res/values-eo/about.xml @@ -30,8 +30,8 @@ monerujo informpetos pri la kurzo per la publika interfaco de coinmarketcap.com. Vidu ilian privatecan politikon je https://coinmarketcap.com/privacy por detaloj pri kiel la datumo de viaj petoj kolektiĝos.

      -

      Se vi uzas la aplikaĵon por pagi al Bitmono-adresoj, vi uzos la SideShift.ai-servon. - Vidu ilian privatecan politikon je https://sideshift.ai/ por detaloj. Monerujo sendos al ili la +

      Se vi uzas la aplikaĵon por pagi al Bitmono-adresoj, vi uzos la Exolix-servon. + Vidu ilian privatecan politikon je https://exolix.com/privacy por detaloj. Monerujo sendos al ili la BTC-ricevontadreson kaj kvanton. Via IP-adreso ankaŭ kolekteblos.

      Permesoj de la aplikaĵo

        diff --git a/app/src/main/res/values-eo/help.xml b/app/src/main/res/values-eo/help.xml index 1785c885..1f01be21 100644 --- a/app/src/main/res/values-eo/help.xml +++ b/app/src/main/res/values-eo/help.xml @@ -181,57 +181,57 @@
      • iun OpenAlias por XMR aŭ BTC
      • bitmonan-adreson (BTC)
      - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

      Sendi BTC

      -

      SideShift.ai

      -

      SideShift.ai estas ekstera liveranto kiu agas kiel ŝanĝisto de Monero al Bitmono. Ni uzas la +

      Exolix

      +

      Exolix estas ekstera liveranto kiu agas kiel ŝanĝisto de Monero al Bitmono. Ni uzas la interfacon de XMR.TR por integrigi pagojn de bitmono en Monerujo. Bonvolu mem legi ĉe - https://sideshift.ai kaj decidu ĉu vi volas uzi tion. La Monerujo-teamo ne asocias kun SideShift.ai kaj ne + https://exolix.com kaj decidu ĉu vi volas uzi tion. La Monerujo-teamo ne asocias kun Exolix kaj ne kapablas helpi vin kun ilia servo.

      -

      Kurzo de SideShift.ai

      -

      Sur la \"Kvanto\"-ekrano montriĝos la nunaj parametroj de la SideShift.ai-servo. Ili inkludas la +

      Kurzo de Exolix

      +

      Sur la \"Kvanto\"-ekrano montriĝos la nunaj parametroj de la Exolix-servo. Ili inkludas la nunan XMR/BTC-kurzon, la superan limon kaj suban limon de la eblaj BTC-transakcioj. Bonvolu noti ke tiu kurzo ĉiam ŝanĝiĝas.

      -

      Mendo al SideShift.ai

      -

      Sur la \"konfirmi\"-ekrano, vi vidos la efektivan SideShift.ai-mendon. Tiu mendo validas nur dum +

      Mendo al Exolix

      +

      Sur la \"konfirmi\"-ekrano, vi vidos la efektivan Exolix-mendon. Tiu mendo validas nur dum limigita tempo - vi certe ekvidos retrokalkulon sur la \"Spendi\"-butonon. La kurzo estos eble malsama ol tiu antaŭe montrita.

      -

      Sekreta ŝlosilo de SideShift.ai

      +

      Sekreta ŝlosilo de Exolix

      Ĉar Monerujo nur traktas la Monero-flankon de via transakcio, vi uzu la sekretan - SideShift.ai-ŝlosilon por sekvi la Bitmono-parton de via mendo sur la hejmpaĝo de SideShift.ai.

      -

      La retrokalkulo de SideShift.ai!

      -

      Kiam la retrokalkulo atingas nulon, vi devos akiri novan QUOTE de SideShift.ai, reirante al la + Exolix-ŝlosilon por sekvi la Bitmono-parton de via mendo sur la hejmpaĝo de Exolix.

      +

      La retrokalkulo de Exolix!

      +

      Kiam la retrokalkulo atingas nulon, vi devos akiri novan QUOTE de Exolix, reirante al la antaŭa fazo kaj el tie repaŝi ĝis la \"Konfirmi\"-ekrano.

      ]]> Elspezi Bitmonon -

      SideShift.ai

      -

      SideShift.ai estas ekstera liveranto kiu agas kiel ŝanĝisto de Monero al Bitmono. Ni uzas la +

      Exolix

      +

      Exolix estas ekstera liveranto kiu agas kiel ŝanĝisto de Monero al Bitmono. Ni uzas la interfacon de XMR.TR por integrigi pagojn de bitmono en Monerujo. Bonvolu mem legi ĉe - https://sideshift.ai kaj decidu ĉu vi volas uzi tion. La Monerujo-teamo ne asocias kun SideShift.ai kaj ne + https://exolix.com kaj decidu ĉu vi volas uzi tion. La Monerujo-teamo ne asocias kun Exolix kaj ne kapablas helpi vin kun ilia servo.

      -

      Kurzo de SideShift.ai

      -

      Sur la \"Kvanto\"-ekrano montriĝos la nunaj parametroj de la SideShift.ai-servo. Ili inkludas la +

      Kurzo de Exolix

      +

      Sur la \"Kvanto\"-ekrano montriĝos la nunaj parametroj de la Exolix-servo. Ili inkludas la nunan XMR/BTC-kurzon, la superan limon kaj suban limon de la eblaj BTC-transakcioj. Bonvolu noti ke tiu kurzo ĉiam ŝanĝiĝas.

      -

      Mendo al SideShift.ai

      -

      Sur la \"konfirmi\"-ekrano, vi vidos la efektivan SideShift.ai-mendon. Tiu mendo validas nur dum +

      Mendo al Exolix

      +

      Sur la \"konfirmi\"-ekrano, vi vidos la efektivan Exolix-mendon. Tiu mendo validas nur dum limigita tempo - vi certe ekvidos retrokalkulon sur la \"Spendi\"-butonon. La kurzo estos eble malsama ol tiu antaŭe montrita.

      -

      Sekreta ŝlosilo de SideShift.ai

      +

      Sekreta ŝlosilo de Exolix

      Ĉar Monerujo nur traktas la Monero-flankon de via transakcio, vi uzu la sekretan - SideShift.ai-ŝlosilon por sekvi la Bitmono-parton de via mendo sur la hejmpaĝo de SideShift.ai.

      -

      La retrokalkulo de SideShift.ai!

      -

      Kiam la retrokalkulo atingas nulon, vi devos akiri novan QUOTE de SideShift.ai, reirante al la + Exolix-ŝlosilon por sekvi la Bitmono-parton de via mendo sur la hejmpaĝo de Exolix.

      +

      La retrokalkulo de Exolix!

      +

      Kiam la retrokalkulo atingas nulon, vi devos akiri novan QUOTE de Exolix, reirante al la antaŭa fazo kaj el tie repaŝi ĝis la \"Konfirmi\"-ekrano.

      ]]>
      diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 3df9c9d7..9b5fd9e6 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -35,48 +35,48 @@ Vi entajpis %1$s-adreson.
      - Vi sendos XMR-on, kaj per laSideShift.ai-servo, la ricevanto havos %1$s-on. + Vi sendos XMR-on, kaj per la%3$s-servo, la ricevanto havos %2$s-on. ]]>
      - mendo al SideShift.ai + mendo al %1$s %1$s %2$s Konfirmo okazonta Pago okazonta - SideShift.ai eraro (%1$s) + %1$s eraro (%2$s) %1$s sendiĝis! Informpetante … Vi povas sendi %1$s — %2$s %4$s.
      - SideShift.ai proponas al vi tiun kurzon: %3$s %4$s/XMR nun. + %5$s proponas al vi tiun kurzon: %3$s %4$s/XMR nun. ]]>
      - Saldo: %2$s %3$s (%1$s XMR) + Saldo: %1$s XMR (~%2$s %3$s) ✔ Paga-ID integriĝis Preparante vian transakcion - Kreante mendon al SideShift.ai - Petante SideShift.ai-mendon + Kreante mendon + Petante mendon Preparante la Monero-transakcion - Petante la SideShift.ai-parametrojn + Petante la parametrojn - ERARO JE SideShift.ai + ERARO kodo: %1$d Tuŝu por reprovi Ni blokiĝis ĉi tie! - Uh-oh, ŝajne SideShift.ai ne disponas momente! + Uh-oh, ŝajne %1$s ne disponas momente! %1$s %3$s = %2$s XMR (kurzo: %1$s %2$s/XMR) - Vizitu SideShift.ai por helpo kaj sekvado - Sekreta ŝlosilo\nSideShift.ai - SideShift.ai sekreta ŝlosilo + Vizitu %1$s por helpo kaj sekvado + Sekreta ŝlosilo\n%1$s + %1$s sekreta ŝlosilo Ricevanta %1$s-adreso Kvanto @@ -358,7 +358,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -390,7 +390,7 @@ Please enter or scan a %1$s address.
      - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
      Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-es/help.xml b/app/src/main/res/values-es/help.xml index 4fd451f1..47261dcd 100644 --- a/app/src/main/res/values-es/help.xml +++ b/app/src/main/res/values-es/help.xml @@ -117,17 +117,7 @@

    Conversión

    La conversión de XMR en otra criptomoneda is realizada por un servicio externo de exchange. Monerujo no realiza dicha conversión ni está asociado con esos terceros. Por lo tanto no puede dar soporte por los intercambios, pero va a proveerte de toda la información necesaria para que puedas rastrear tu orden o recibir ayuda del exchange.

    -

    Pares disponibles

    -

    Monerujo soporta convertir de XMR hacia las siguientes monedas: -

      -
    • Bitcoin (BTC)
    • -
    • Ethereum (ETH)
    • -
    • Litecoin (LTC)
    • -
    • Dash (DASH)
    • -
    • Dai (DAI) on Ethereum
    • -
    • Tether (USDT) on Ethereum
    • -
    - Simplemente ingresa una dirección correspondiente o selecciona la moneda tocando en su ícono.

    +

    Simplemente ingresa una dirección correspondiente o selecciona la moneda tocando en su ícono.

    ]]> diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 58a52bc6..a51c25e5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -219,33 +219,33 @@ Restaurar monedero con semilla Ingresaste una dirección de %1$s
    - Vas a enviar XMR y esta dirección recibirá %1$s usando un exchange. + Vas a enviar XMR y esta dirección recibirá %2$s usando %3$s. ]]>
    %1$s %2$s Confirmación pendiente Pago pendiente - Error del exchange (%1$s) + Error de %1$s (%2$s) %1$s enviados! Consultando … Puedes enviar %1$s — %2$s %4$s.
    - El exchange está ofreciendo una tasa de cambio de %3$s %4$s/XMR en este momento. + %5$s está ofreciendo una tasa de cambio de %3$s %4$s/XMR en este momento. ]]>
    - Saldo: %2$s %3$s (%1$s XMR) - Creando orden en el exchange - Consultando orden en el exchange + Saldo: %1$s XMR (~%2$s %3$s) + Creando orden + Consultando orden Preparando transacción de Monero - Consultando parámetros del exchange - Error del exchange + Consultando parámetros + Error Código: %1$d Toca para reintentar ¡Parece que está atascada! - Oh no, parece que el exchange no está disponible ahora. + Oh no, parece que %1$s no está disponible ahora. %1$s %3$s = %2$s XMR (Cambio: %1$s %2$s/XMR) - Visita la página del exchange para soporte y rastreo - Número de operación\nExchange - Número de operación del Exchange + Visita la página %1$s para soporte y rastreo + Número de operación\n%1$s + Número de operación de %1$s Dirección %1$s destino Monto ¡Oye, tardaste demasiado! @@ -259,7 +259,7 @@ %1$s XMR +%1$s Comisión Monerujo - Orden del exchange + Orden del %1$s Puedes convertir de XMR a otras monedas, toca para leer más. Ledger activado, toca para más info. @@ -388,7 +388,7 @@ Por favor ingresa o escanea una dirección %1$s.
    - Vas a enviar XMR y el receptor obtendrá %2$s a través de SideShift.ai + Vas a enviar XMR y el receptor obtendrá %2$s a través de %3$s ]]>
    Requiere Tor \u00A0ESPERANDO AL NODO\u00A0 Selecciona "Permitir inicios en segundo plano" en los ajustes de Orbot para usar Tor - El exchange no soporta Tor.\nDesactiva Tor para cambiar XMR. + %1$s no soporta Tor.\nDesactiva Tor para cambiar XMR. Semilla encriptada (EXPERIMENTAL) Palabra clave adicional diff --git a/app/src/main/res/values-et/about.xml b/app/src/main/res/values-et/about.xml index 78de89ec..ffef8c55 100644 --- a/app/src/main/res/values-et/about.xml +++ b/app/src/main/res/values-et/about.xml @@ -33,8 +33,8 @@ https://coinmarketcap.com/privacy, et saada üksikasju, kuidas teie päringute kohta andmeid kogutakse.

    Kui kasutate äppi BTC-aadressitele raha saatmiseks, siis kasutatakse selleks - SideShift.ai teenust. Lisateabe saamiseks vaadake nende privaatsuspoliitikat aadressil - https://sideshift.ai/. Monerujo saadab neile BTC sihtkoha aadressi ja summa. Koguda + Exolix teenust. Lisateabe saamiseks vaadake nende privaatsuspoliitikat aadressil + https://exolix.com/privacy. Monerujo saadab neile BTC sihtkoha aadressi ja summa. Koguda võidakse ka teie IP aadressi.

    Äpi õigused

      diff --git a/app/src/main/res/values-et/help.xml b/app/src/main/res/values-et/help.xml index dcd16fbb..8d65ce32 100644 --- a/app/src/main/res/values-et/help.xml +++ b/app/src/main/res/values-et/help.xml @@ -160,50 +160,50 @@
    • an OpenAlias for XMR or BTC
    • a BTC address
    • - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

      Bitcoini (BTC) saatmine

      -

      SideShift.ai

      -

      SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin. - We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out - https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo - Team is not associated with SideShift.ai and cannot help you with their service.

      -

      SideShift.ai vahetuskurss

      -

      On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These +

      Exolix

      +

      Exolix is a third party service which acts as an exchange from Monero to Bitcoin. + We use the Exolix API to integrate Bitcoin payments into Monerujo. Please check out + https://exolix.com and decide for yourself if this is something you want to use. The Monerujo + Team is not associated with Exolix and cannot help you with their service.

      +

      Exolix vahetuskurss

      +

      On the \"Amount\" screen you will be shown the current parameters of the Exolix service. These include the current exchange rate as well as upper and lower BTC limits. Note that this rate is not guaranteed at this point.

      -

      SideShift.ai tellimus

      -

      On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for +

      Exolix tellimus

      +

      On the \"Confirm\" screen, you will see the actual Exolix order. This order is valid for a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may be different to the indicative one shown on previous screens.

      -

      SideShift.ai privaatvõti

      -

      Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key - can be used to track the Bitcoin part of your order on the SideShift.ai homepage.

      -

      SideShift.ai loendur

      -

      Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the +

      Exolix privaatvõti

      +

      Since Monerujo only handles the Monero part of your transaction your Exolix secret key + can be used to track the Bitcoin part of your order on the Exolix homepage.

      +

      Exolix loendur

      +

      Once the countdown reaches zero, you need to get a new quote from Exolix by going back to the previous step and then coming back to the \"Confirm\" screen.

      ]]> Bitcoini (BTC) saatmine -

      SideShift.ai

      -

      SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin. - We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out - https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo - Team is not associated with SideShift.ai and cannot help you with their service.

      -

      SideShift.ai vahetuskurss

      -

      On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These +

      Exolix

      +

      Exolix is a third party service which acts as an exchange from Monero to Bitcoin. + We use the Exolix API to integrate Bitcoin payments into Monerujo. Please check out + https://exolix.com and decide for yourself if this is something you want to use. The Monerujo + Team is not associated with Exolix and cannot help you with their service.

      +

      Exolix vahetuskurss

      +

      On the \"Amount\" screen you will be shown the current parameters of the Exolix service. These include the current exchange rate as well as upper and lower BTC limits. Note that this rate is not guaranteed at this point.

      -

      SideShift.ai tellimus

      -

      On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for +

      Exolix tellimus

      +

      On the \"Confirm\" screen, you will see the actual Exolix order. This order is valid for a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may be different to the indicative one shown on previous screens.

      -

      SideShift.ai privaatvõti

      -

      Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key - can be used to track the Bitcoin part of your order on the SideShift.ai homepage.

      -

      SideShift.ai loendur

      -

      Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the +

      Exolix privaatvõti

      +

      Since Monerujo only handles the Monero part of your transaction your Exolix secret key + can be used to track the Bitcoin part of your order on the Exolix homepage.

      +

      Exolix loendur

      +

      Once the countdown reaches zero, you need to get a new quote from Exolix by going back to the previous step and then coming back to the \"Confirm\" screen.

      ]]>
      diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 18781ad0..2f353ee5 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -35,48 +35,48 @@ Sa sisestasid %1$s aadressi.
      - See tähendab, et sa saadad Monerosid ning kohale jõuavad %1$s kasutades SideShift.ai teenust. + See tähendab, et sa saadad Monerosid ning kohale jõuavad %2$s kasutades %3$s teenust. ]]>
      - SideShift.ai tellimus + %1$s tellimus %1$s %2$s Ootan kinnitust Ootan makset - SideShift.ai viga (%1$s) + %1$s viga (%2$s) %1$s saadetud! Küsin … Sa saad saata %1$s — %2$s %4$s.
      - SideShift.ai annab hetkel vahetuskursiks %3$s %4$s/XMR. + %5$s annab hetkel vahetuskursiks %3$s %4$s/XMR. ]]>
      - Kontojääk: %2$s %3$s (%1$s XMR) + Kontojääk: %1$s XMR (~%2$s %3$s) ✔ Makse ID integreeritud Valmistan ülekannet ette - Loon SideShift.ai tellimust - Küsin SideShift.ai tellimust + Loon tellimust + Küsin tellimust Valmistan ette Monero ülekannet - Küsin SideShift.ai parameetreid + Küsin parameetreid - SideShift.ai viga + Viga Kood: %1$d Puuduta uuesti proovimiseks Nüüd jõudsime küll tupikusse! - Oh ei, SideShift.ai ei ole hetkel saadaval! + Oh ei, %1$s ei ole hetkel saadaval! %1$s %3$s = %2$s XMR (Kurss: %1$s %2$s/XMR) - Külasta SideShift.ai lisainfo saamiseks & jälgin - Privaatvõti\nSideShift.ai - SideShift.ai privaatvõti + Külasta %1$s lisainfo saamiseks & jälgin + Privaatvõti\n%1$s + %1$s privaatvõti Sihtkoha %1$s aadress Kogus @@ -358,7 +358,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -390,7 +390,7 @@ Please enter or scan a %1$s address.
      - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
      Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-fa/about.xml b/app/src/main/res/values-fa/about.xml index 26571b7c..66bd4ba1 100644 --- a/app/src/main/res/values-fa/about.xml +++ b/app/src/main/res/values-fa/about.xml @@ -30,8 +30,8 @@ ببینید.

      - اگر از برنامه برای پرداخت به آدرس‌های بیت‌کوین استفاده می‌کنید، از سرویس SideShift.ai استفاده خواهید کرد. برای جزئیات بیشتر به خط‌مشی رازداری آنها در - sideshift.ai + اگر از برنامه برای پرداخت به آدرس‌های بیت‌کوین استفاده می‌کنید، از سرویس Exolix استفاده خواهید کرد. برای جزئیات بیشتر به خط‌مشی رازداری آنها در + exolix.com مراجعه کنید. مونروجو مقدار و آدرس مقصد بیت‌کوین را برای آنها ارسال می‌کند. آدرس IP شما نیز قابل جمع‌آوری خواهد بود.

      دسترسی‌های نرم‌افزار

      diff --git a/app/src/main/res/values-fa/help.xml b/app/src/main/res/values-fa/help.xml index d6ea0761..25b3065c 100644 --- a/app/src/main/res/values-fa/help.xml +++ b/app/src/main/res/values-fa/help.xml @@ -208,89 +208,89 @@
    • یک آدرس بیتکوین
    • - لطفا توجه داشته باشید که ارسال بیتکوین از طریق سرویس SideShift.ai پردازش + لطفا توجه داشته باشید که ارسال بیتکوین از طریق سرویس Exolix پردازش می‌شود (برای جزئیات به - https://sideshift.ai + https://exolix.com مراجعه کنید). جزئیات ارسال بیتکوین را در زیر بخوانید.

      ارسال بیتکوین

      -

      SideShift.ai

      +

      Exolix

      - وبسایت SideShift.ai یک سرویس شخص ثالث است که به‌عنوان صرافی مونرو به بیتکوین عمل می‌کند. - ما از API آن‌ها برای ادغام پرداخت‌های بیتکوین در مونروجو استفاده می‌کنیم. لطفا https://sideshift.ai را + وبسایت Exolix یک سرویس شخص ثالث است که به‌عنوان صرافی مونرو به بیتکوین عمل می‌کند. + ما از API آن‌ها برای ادغام پرداخت‌های بیتکوین در مونروجو استفاده می‌کنیم. لطفا https://exolix.com را بررسی کنید و برای خودتان تصمیم بگیرید که آیا این چیزی است که می‌خواهید استفاده کنید یا خیر. تیم - مونروجو به SideShift.ai مرتبط نیست و نمی‌تواند به شما در خدمات آن‌ها کمکی کند. + مونروجو به Exolix مرتبط نیست و نمی‌تواند به شما در خدمات آن‌ها کمکی کند.

      - نرخ تبادل SideShift.ai + نرخ تبادل Exolix

      - در صفحهٔ «مقدار» پارامترهای فعلی سرویس SideShift.ai به شما نشان داده می‌شود. این‌ها شامل + در صفحهٔ «مقدار» پارامترهای فعلی سرویس Exolix به شما نشان داده می‌شود. این‌ها شامل نرخ فعلی تبادل و همچنین محدودیت‌های مقداری حداکثر و حداقلی بیتکوین می‌شود. توجه داشته باشید که این نرخ در این نقطه تقریبی است.

      - سفارش SideShift.ai + سفارش Exolix

      - در صفحهٔ «تایید»، سفارش واقعی SideShift.ai را خواهید دید.این سفارش برای مدت محدودی معتبر + در صفحهٔ «تایید»، سفارش واقعی Exolix را خواهید دید.این سفارش برای مدت محدودی معتبر است - ممکن است متوجه یک شمارش معکوس روی دکمهٔ «مصرف» بشوید. نرخ تبادل ممکن است با نرخی که در صفحات قبل نشان داده شد متفاوت باشد.

      - کلید خصوصی SideShift.ai + کلید خصوصی Exolix

      از آنجایی که مونروجو فقط بخش مونروی تراکنش شما را مدیریت می‌کند، این کلید خصوصی می‌تواند - برای ردیابی بخش بیتکوین سفارش شما در وبسایت SideShift.ai استفاده شود. + برای ردیابی بخش بیتکوین سفارش شما در وبسایت Exolix استفاده شود.

      - شمارش معکوس SideShift.ai + شمارش معکوس Exolix

      هنگامی که شمارش معکوس به صفر رسید، باید با رفتن به مرحلهٔ قبل و سپس بازگشت - به صفحهٔ «تایید»، یک نقل قول جدید از SideShift.ai دریافت کنید. + به صفحهٔ «تایید»، یک نقل قول جدید از Exolix دریافت کنید.

      ]]> ارسال بیتکوین -

      SideShift.ai

      +

      Exolix

      - وبسایت SideShift.ai یک سرویس شخص ثالث است که به‌عنوان صرافی مونرو به بیتکوین عمل می‌کند. - ما از API آن‌ها برای ادغام پرداخت‌های بیتکوین در مونروجو استفاده می‌کنیم. لطفا https://sideshift.ai را + وبسایت Exolix یک سرویس شخص ثالث است که به‌عنوان صرافی مونرو به بیتکوین عمل می‌کند. + ما از API آن‌ها برای ادغام پرداخت‌های بیتکوین در مونروجو استفاده می‌کنیم. لطفا https://exolix.com را بررسی کنید و برای خودتان تصمیم بگیرید که آیا این چیزی است که می‌خواهید استفاده کنید یا خیر. تیم - مونروجو به SideShift.ai مرتبط نیست و نمی‌تواند به شما در خدمات آن‌ها کمکی کند. + مونروجو به Exolix مرتبط نیست و نمی‌تواند به شما در خدمات آن‌ها کمکی کند.

      - نرخ تبادل SideShift.ai + نرخ تبادل Exolix

      - در صفحهٔ «مقدار» پارامترهای فعلی سرویس SideShift.ai به شما نشان داده می‌شود. این‌ها شامل + در صفحهٔ «مقدار» پارامترهای فعلی سرویس Exolix به شما نشان داده می‌شود. این‌ها شامل نرخ فعلی تبادل و همچنین محدودیت‌های مقداری حداکثر و حداقلی بیتکوین می‌شود. توجه داشته باشید که این نرخ در این نقطه تقریبی است.

      - سفارش SideShift.ai + سفارش Exolix

      - در صفحهٔ «تایید»، سفارش واقعی SideShift.ai را خواهید دید.این سفارش برای مدت محدودی معتبر + در صفحهٔ «تایید»، سفارش واقعی Exolix را خواهید دید.این سفارش برای مدت محدودی معتبر است - ممکن است متوجه یک شمارش معکوس روی دکمهٔ «مصرف» بشوید. نرخ تبادل ممکن است با نرخی که در صفحات قبل نشان داده شد متفاوت باشد.

      - کلید خصوصی SideShift.ai + کلید خصوصی Exolix

      از آنجایی که مونروجو فقط بخش مونروی تراکنش شما را مدیریت می‌کند، این کلید خصوصی می‌تواند - برای ردیابی بخش بیتکوین سفارش شما در وبسایت SideShift.ai استفاده شود. + برای ردیابی بخش بیتکوین سفارش شما در وبسایت Exolix استفاده شود.

      - شمارش معکوس SideShift.ai + شمارش معکوس Exolix

      هنگامی که شمارش معکوس به صفر رسید، باید با رفتن به مرحلهٔ قبل و سپس بازگشت - به صفحهٔ «تایید»، یک نقل قول جدید از SideShift.ai دریافت کنید. + به صفحهٔ «تایید»، یک نقل قول جدید از Exolix دریافت کنید.

      ]]>
      diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index f72b09cc..6d6be8a9 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -42,15 +42,16 @@
      شما با ارسال XMR با استفاده از سرویس - SideShift.ai + %3$s برای دریافت کننده - %1$s + %2$s خواهید فرستاد. ]]> - سفارش SideShift.ai + سفارش + %1$s %1$s %2$s @@ -58,8 +59,8 @@ در حال تایید در حال پرداخت - خطای SideShift.ai - (%1$s) + خطای Exolix + (%2$s) %1$s ارسال شد! @@ -77,7 +78,7 @@ در حال حاضر سرویس - SideShift.ai + %5$s به شما نرخ تبدیل %3$s %4$s/XMR را می‌دهد. @@ -86,7 +87,7 @@ موجودی - %2$s %3$s (%1$s XMR) + %1$s XMR (~%2$s %3$s) شناسهٔ پرداخت ادغام شد @@ -95,19 +96,19 @@ در حال آماده‌سازی تراکنش - در حال ساخت تراکنش SideShift.ai + در حال ساخت تراکنش - در حال پرس‌وجوی سفارش SideShift.ai + در حال پرس‌وجوی سفارش در حال آماده‌سازی تراکنش مونرو - در حال پرس‌وجوی پارامترهای SideShift.ai + در حال پرس‌وجوی پارامترهای - خطای SideShift.ai + خطای کد: @@ -116,7 +117,9 @@ برای تلاش دوباره لمس کنید ما اینجا گیر کردیم! - سرویس SideShift.ai در حال حاضر در دسترس نیست! + سرویس + %1$s + در حال حاضر در دسترس نیست! %1$s %3$s = %2$s XMR @@ -125,13 +128,15 @@ %1$s %2$s/XMR) - برای پشتیبانی و رهگیری سفارش به SideShift.ai مراجعه کنید + برای پشتیبانی و رهگیری سفارش به + %1$s + مراجعه کنید کلید خصوصی - \nSideShift.ai + \n%1$s - کلید خصوصی SideShift.ai + کلید خصوصی %s آدرس مقصد @@ -149,7 +154,7 @@ در حال تغییر رمز - در حال انجام... + در حال انجام… \n این کار ممکن است زمان زیادی طول بکشد! @@ -553,7 +558,7 @@ هرنوع رمزارز ارسال کنید - مونروجو دارای پشتیبانی داخلی SideShift.ai است. فقط یک آدرس BTC، LTC، ETH، DASH یا DOGE را بچسبانید یا اسکن کنید و با خرج کردن XMR، این رمزارزها را ارسال خواهید کرد (آدرس IP ایران در تحریم است). + Monerujo دارای پشتیبانی صرافی داخلی است. فقط یک آدرس BTC، LTC، ETH، TRXUSDT یا SOL را بچسبانید یا اسکن کنید و با خرج کردن XMR، این رمزارزها را ارسال خواهید کرد (آدرس IP ایران در تحریم است). گره‌ها، به میل شما @@ -614,7 +619,7 @@ را اسکن یا وارد کنید.
      شما به وسیلهٔ سرویس - SideShift.ai + %3$s با ارسال XMR برای گیرنده %2$s ارسال خواهید کرد. @@ -658,7 +663,7 @@ برای استفاده از تور، تنظیمات «اجازه دادن به اجرا در پس‌زمینه» را در Orbot فعال کنید!
      - قابلیت SideShift.ai از تور پشتیبانی نمی‌کند. برای تبدیل XMR تور را غیرفعال کنید. + قابلیت %s از تور پشتیبانی نمی‌کند. برای تبدیل XMR تور را غیرفعال کنید. رمزگذاری بذر (قابلیت آزمایشی) diff --git a/app/src/main/res/values-fr/about.xml b/app/src/main/res/values-fr/about.xml index 78c82cb4..d033b3c6 100644 --- a/app/src/main/res/values-fr/about.xml +++ b/app/src/main/res/values-fr/about.xml @@ -36,7 +36,7 @@ Consultez leur politique de confidentialité sur https://coinmarketcap.com/privacy pour des détails sur la façon dont les données de vos requêtes sont collectées.

      Si vous utilisez l’application pour payer à une adresse BTC, vous utiliserez - le service SideShift.ai. Consultez leur politique de confidentialité sur https://sideshift.ai/ + le service Exolix. Consultez leur politique de confidentialité sur https://exolix.com/privacy pour plus de détails. Monerujo leur transmet l’adresse de destination BTC et le montant. Votre IP serait également collectable.

      Permissions de l’application

      diff --git a/app/src/main/res/values-fr/help.xml b/app/src/main/res/values-fr/help.xml index c7b17caf..132a3929 100644 --- a/app/src/main/res/values-fr/help.xml +++ b/app/src/main/res/values-fr/help.xml @@ -158,53 +158,53 @@
    • une adresse OpenAlias pour XMR ou BTC
    • une adresse BTC
    • - Notez que l’envoi de BTC est traité à travers le service SideShift.ai (voir https://sideshift.ai pour + Notez que l’envoi de BTC est traité à travers le service Exolix (voir https://exolix.com pour plus de détails). Voir la rubrique sur l’envoi de BTC plus bas.

      Envoyer des BTC

      -

      SideShift.ai

      -

      SideShift.ai est un service tierce-partie qui agit commme un change depuis Monero vers Bitcoin. - Nous utilisons l’API SideShift.ai pour intégrer les paiements Bitcoin dans Monerujo. Veuillez - consulter https://sideshift.ai et décidez vous-même si vous souhaitez l’utiliser. L’équipe Monerujo - n’est pas affiliée à SideShift.ai et ne peut pas vous aider concernant leurs services.

      -

      Taux de change SideShift.ai

      -

      Sur l’écran \"Montant\" vous seront indiqué les paramètres actuels du serive SideShift.ai. Cela +

      Exolix

      +

      Exolix est un service tierce-partie qui agit commme un change depuis Monero vers Bitcoin. + Nous utilisons l’API Exolix pour intégrer les paiements Bitcoin dans Monerujo. Veuillez + consulter https://exolix.com et décidez vous-même si vous souhaitez l’utiliser. L’équipe Monerujo + n’est pas affiliée à Exolix et ne peut pas vous aider concernant leurs services.

      +

      Taux de change Exolix

      +

      Sur l’écran \"Montant\" vous seront indiqué les paramètres actuels du serive Exolix. Cela inclus le taux de change actuel, ainsi que les limites BTC hautes et basses. Notez que ce taux n’est pas garantit à ce stade.

      -

      Ordre SideShift.ai

      -

      Sur l’écran \"Confirmation\", vous verez l’ordre SideShift.ai actuel. Cette ordre est valide pour +

      Ordre Exolix

      +

      Sur l’écran \"Confirmation\", vous verez l’ordre Exolix actuel. Cette ordre est valide pour un temps limité - vous pouvez remarquer le compte à rebours sur le bouton \"Dépenser\". Ce taux de change peut être différent du taux indicatif de l’écran précédent.

      -

      Clef Secrète SideShift.ai

      +

      Clef Secrète Exolix

      Comme Monerujo ne traite que le volet Monero de votre transaction, votre clef secrète - SideShift.ai peut être utilisée pour suivre le volet Bitcoin de votre ordre sur la page d’accueil - de SideShift.ai.

      -

      Compte à Rebours SideShift.ai !

      + Exolix peut être utilisée pour suivre le volet Bitcoin de votre ordre sur la page d’accueil + de Exolix.

      +

      Compte à Rebours Exolix !

      Une fois que le compte à rebours atteint zéro, vous devrez obtenir un nouveau devis depuis - SideShift.ai en retournant à l’étape précédente puis en revenant à l’écran \"Confirmation\".

      + Exolix en retournant à l’étape précédente puis en revenant à l’écran \"Confirmation\".

      ]]> Envoyer des BTC -

      SideShift.ai

      -

      SideShift.ai est un service tierce-partie qui agit commme un change depuis Monero vers Bitcoin. - Nous utilisons l’API SideShift.ai pour intégrer les paiements Bitcoin dans Monerujo. Veuillez - consulter https://sideshift.ai et décidez vous-même si vous souhaitez l’utiliser. L’équipe Monerujo - n’est pas affiliée à SideShift.ai et ne peut pas vous aider concernant leurs services.

      -

      Taux de change SideShift.ai

      -

      Sur l’écran \"Montant\" vous seront indiqué les paramètres actuels du serive SideShift.ai. Cela +

      Exolix

      +

      Exolix est un service tierce-partie qui agit commme un change depuis Monero vers Bitcoin. + Nous utilisons l’API Exolix pour intégrer les paiements Bitcoin dans Monerujo. Veuillez + consulter https://exolix.com et décidez vous-même si vous souhaitez l’utiliser. L’équipe Monerujo + n’est pas affiliée à Exolix et ne peut pas vous aider concernant leurs services.

      +

      Taux de change Exolix

      +

      Sur l’écran \"Montant\" vous seront indiqué les paramètres actuels du serive Exolix. Cela inclus le taux de change actuel, ainsi que les limites BTC hautes et basses. Notez que ce taux n’est pas garantit à ce stade.

      -

      Ordre SideShift.ai

      -

      Sur l’écran \"Confirmation\", vous verez l’ordre SideShift.ai actuel. Cette ordre est valide pour +

      Ordre Exolix

      +

      Sur l’écran \"Confirmation\", vous verez l’ordre Exolix actuel. Cette ordre est valide pour un temps limité - vous pouvez remarquer le compte à rebours sur le bouton \"Dépenser\". Ce taux de change peut être différent du taux indicatif de l’écran précédent.

      -

      Clef Secrète SideShift.ai

      +

      Clef Secrète Exolix

      Comme Monerujo ne traite que le volet Monero de votre transaction, votre clef secrète - SideShift.ai peut être utilisée pour suivre le volet Bitcoin de votre ordre sur la page d’accueil - de SideShift.ai.

      -

      Compte à Rebours SideShift.ai !

      + Exolix peut être utilisée pour suivre le volet Bitcoin de votre ordre sur la page d’accueil + de Exolix.

      +

      Compte à Rebours Exolix !

      Une fois que le compte à rebours atteint zéro, vous devrez obtenir un nouveau devis depuis - SideShift.ai en retournant à l’étape précédente puis en revenant à l’écran \"Confirmation\".

      + Exolix en retournant à l’étape précédente puis en revenant à l’écran \"Confirmation\".

      ]]>
      Vous avez entré une adresse %1$s.
      - Vous envoyez des XMR et le destinataire recevra des %1$s via le service SideShift.ai. + Vous envoyez des XMR et le destinataire recevra des %2$s via le service %3$s. ]]>
      - Ordres SideShift.ai + Ordres %1$s %1$s %2$s En Attente de Confirmation En Attente de Paiement - Erreur SideShift.ai (%1$s) + Erreur %1$s (%2$s) %1$s Envoyé ! Interrogation … Vous pouvez envoyer %1$s — %2$s %4$s.
      - SideShift.ai vous donne un taux de change de %3$s %4$s/XMR actuellement. + %5$s vous donne un taux de change de %3$s %4$s/XMR actuellement. ]]>
      - Solde : %2$s %3$s (%1$s XMR) + Solde : %1$s XMR (~%2$s %3$s) ✔ ID de Paiement intégré Préparation de votre transaction - Création de l\'ordre SideShift.ai - Interrogation de l\'ordre SideShift.ai + Création de l\'ordre + Interrogation de l\'ordre Préparation de la Transaction Monero - Interrogation des paramètres SideShift.ai + Interrogation des paramètres - ERREUR SideShift.ai + ERREUR Code : %1$d Touchez pour réessayer Maintenant on est coincé ici ! - Oh-oh, SideShift.ai n\'a pas l\'air disponible pour le moment ! + Oh-oh, %1$s n\'a pas l\'air disponible pour le moment ! %1$s %3$s = %2$s XMR (Taux : %1$s %2$s/XMR) - Visitez SideShift.ai pour l\'assistance & le suivi - Clef Secrète\nSideShift.ai - Clef Secrète SideShift.ai + Visitez %1$s pour l\'assistance & le suivi + Clef Secrète\n%1$s + Clef Secrète %1$s Adresse %1$s Destination Montant @@ -370,7 +370,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -402,7 +402,7 @@ Please enter or scan a %1$s address.
      - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
      Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Activer TOR Seed encryption (EXPERIMENTAL) diff --git a/app/src/main/res/values-he/about.xml b/app/src/main/res/values-he/about.xml index b91d876b..d7417918 100644 --- a/app/src/main/res/values-he/about.xml +++ b/app/src/main/res/values-he/about.xml @@ -34,8 +34,8 @@ באמצעות ה-API הציבורי של coinmarketcap.com. ראה את מדיניות הפרטיות שלהם בכתובת https://coinmarketcap.com/privacy בשביל פרטים על אופן איסוף הנתונים בבקשות שלך.

      -

      אם אתה משתמש באפליקציה כדי לשלם לכתובות BTC, אתה תשתמש בשירות SideShift.ai. - ראה את מדיניות הפרטיות שלהם בכתובת https://sideshift.ai/ לפרטים נוספים. מונרוג\'ו שולח להם +

      אם אתה משתמש באפליקציה כדי לשלם לכתובות BTC, אתה תשתמש בשירות Exolix. + ראה את מדיניות הפרטיות שלהם בכתובת https://exolix.com/privacy לפרטים נוספים. מונרוג\'ו שולח להם את כתובת היעד וסכום הביטקוין. כתובת ה-אייפי שלך תהיה גם ניתנת לאיסוף.p>

      הרשאות אפליקציה

        diff --git a/app/src/main/res/values-he/help.xml b/app/src/main/res/values-he/help.xml index e6800a48..16e8720d 100644 --- a/app/src/main/res/values-he/help.xml +++ b/app/src/main/res/values-he/help.xml @@ -160,50 +160,50 @@
      • OpenAlias עבור XMR או BTC
      • כתובת BTC
      • - שים לב, כי שליחת ביטקוין מעובדת באמצעות שירות SideShift.ai (בדוק את https://sideshift.ai + שים לב, כי שליחת ביטקוין מעובדת באמצעות שירות Exolix (בדוק את https://exolix.com בשביל פרטים). ראה את הסעיף על שליחת ביטקוין למטה.

        שליחת ביטקוין

        -

        SideShift.ai

        -

        SideShift.ai הוא שירות צד שלישי הפועל כבורסה ממונרו לביטקוין. - אנחנו משתמשים ב- SideShift.ai API כדי לשלב תשלומי ביטקוין במונרוג\'ו. אנא בדוק את - https://sideshift.ai ותחליט בעצמך אם זה משהו שאתה רוצה להשתמש בו. צוות מונרוג\'ו - אינו קשור ל- SideShift.ai ולא יכול לעזור לך עם השירות שלהם.

        -

        SideShift.ai שער החליפין

        -

        במסך \"הסכום\" יוצגו לך הפרמטרים הנוכחיים של השירות SideShift.ai. אלה +

        Exolix

        +

        Exolix הוא שירות צד שלישי הפועל כבורסה ממונרו לביטקוין. + אנחנו משתמשים ב- Exolix API כדי לשלב תשלומי ביטקוין במונרוג\'ו. אנא בדוק את + https://exolix.com ותחליט בעצמך אם זה משהו שאתה רוצה להשתמש בו. צוות מונרוג\'ו + אינו קשור ל- Exolix ולא יכול לעזור לך עם השירות שלהם.

        +

        Exolix שער החליפין

        +

        במסך \"הסכום\" יוצגו לך הפרמטרים הנוכחיים של השירות Exolix. אלה כוללים את שער החליפין הנוכחי, כמו גם את גבולות BTC העליונים והתחתונים. שים לב ששיעור זה אינו מובטח בשלב זה.

        -

        SideShift.ai הזמנה

        -

        במסך \"האישור\", תראה את ההזמנה בפועל SideShift.ai. הזמנה זו תקפה +

        Exolix הזמנה

        +

        במסך \"האישור\", תראה את ההזמנה בפועל Exolix. הזמנה זו תקפה לזמן מוגבל - ייתכן שתבחין בספירה לאחור בלחצן \"ההוצאה\". שער החליפין עשוי להיות שונה מזה האינדיקטיבי שהוצג במסכים קודמים.

        -

        SideShift.ai מפתח סודי

        -

        מכיוון שמונרוג\'ו מטפל רק בחלק מונרו של העסקה שלך, ניתן להשתמש במפתח הסודי של ה-SideShift.ai שלך - כדי לעקוב אחר חלק הביטקוין של ההזמנה שלך בדף הבית של SideShift.ai.

        -

        SideShift.ai ספירה לאחור!

        -

        ברגע שהספירה לאחור מגיעה לאפס, עליך לקבל הצעת מחיר חדשה מ- SideShift.ai על ידי חזרה +

        Exolix מפתח סודי

        +

        מכיוון שמונרוג\'ו מטפל רק בחלק מונרו של העסקה שלך, ניתן להשתמש במפתח הסודי של ה-Exolix שלך + כדי לעקוב אחר חלק הביטקוין של ההזמנה שלך בדף הבית של Exolix.

        +

        Exolix ספירה לאחור!

        +

        ברגע שהספירה לאחור מגיעה לאפס, עליך לקבל הצעת מחיר חדשה מ- Exolix על ידי חזרה לשלב הקודם ולאחר מכן חזרה למסך \"האישור\".

        ]]> Sending BTC -

        SideShift.ai

        -

        SideShift.ai הוא שירות צד שלישי הפועל כבורסה ממונרו לביטקוין. - אנחנו משתמשים ב- SideShift.ai API כדי לשלב תשלומי ביטקוין במונרוג\'ו. אנא בדוק את - https://sideshift.ai ותחליט בעצמך אם זה משהו שאתה רוצה להשתמש בו. צוות מונרוג\'ו - אינו קשור ל- SideShift.ai ולא יכול לעזור לך עם השירות שלהם.

        -

        SideShift.ai שער החליפין

        -

        במסך \"הסכום\" יוצגו לך הפרמטרים הנוכחיים של השירות SideShift.ai. אלה +

        Exolix

        +

        Exolix הוא שירות צד שלישי הפועל כבורסה ממונרו לביטקוין. + אנחנו משתמשים ב- Exolix API כדי לשלב תשלומי ביטקוין במונרוג\'ו. אנא בדוק את + https://exolix.com ותחליט בעצמך אם זה משהו שאתה רוצה להשתמש בו. צוות מונרוג\'ו + אינו קשור ל- Exolix ולא יכול לעזור לך עם השירות שלהם.

        +

        Exolix שער החליפין

        +

        במסך \"הסכום\" יוצגו לך הפרמטרים הנוכחיים של השירות Exolix. אלה כוללים את שער החליפין הנוכחי, כמו גם את גבולות BTC העליונים והתחתונים. שים לב ששיעור זה אינו מובטח בשלב זה.

        -

        SideShift.ai הזמנה

        -

        במסך \"האישור\", תראה את ההזמנה בפועל SideShift.ai. הזמנה זו תקפה +

        Exolix הזמנה

        +

        במסך \"האישור\", תראה את ההזמנה בפועל Exolix. הזמנה זו תקפה לזמן מוגבל - ייתכן שתבחין בספירה לאחור בלחצן \"ההוצאה\". שער החליפין עשוי להיות שונה מזה האינדיקטיבי שהוצג במסכים קודמים.

        -

        SideShift.ai מפתח סודי

        -

        מכיוון שמונרוג\'ו מטפל רק בחלק מונרו של העסקה שלך, ניתן להשתמש במפתח הסודי של ה-SideShift.ai שלך - כדי לעקוב אחר חלק הביטקוין של ההזמנה שלך בדף הבית של SideShift.ai.

        -

        SideShift.ai ספירה לאחור!

        -

        ברגע שהספירה לאחור מגיעה לאפס, עליך לקבל הצעת מחיר חדשה מ- SideShift.ai על ידי חזרה +

        Exolix מפתח סודי

        +

        מכיוון שמונרוג\'ו מטפל רק בחלק מונרו של העסקה שלך, ניתן להשתמש במפתח הסודי של ה-Exolix שלך + כדי לעקוב אחר חלק הביטקוין של ההזמנה שלך בדף הבית של Exolix.

        +

        Exolix ספירה לאחור!

        +

        ברגע שהספירה לאחור מגיעה לאפס, עליך לקבל הצעת מחיר חדשה מ- Exolix על ידי חזרה לשלב הקודם ולאחר מכן חזרה למסך \"האישור\".

        ]]>
        diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 7fd67c33..658f5650 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -36,48 +36,48 @@ הזנת %1$s כתובת.
        - אתה תשלח XMR והמקבל יקבל %1$s באמצעות השירות SideShift.ai. + אתה תשלח XMR והמקבל יקבל %2$s באמצעות השירות %3$s. ]]>
        - הזמנת SideShift.ai + הזמנת %1$s %1$s %2$s אישור ממתין תשלום ממתין - שגיאה SideShift.ai (%1$s) + שגיאה %1$s (%2$s) %1$s נשלח! חוקר … אתה יכול לשלוח %1$s — %2$s %4$s.
        - SideShift.ai נותן לך שער חליפין של %3$s %4$s/XMR כרגע. + %5$s נותן לך שער חליפין של %3$s %4$s/XMR כרגע. ]]>
        - היתרה: %2$s %3$s (%1$s XMR) + היתרה: %1$s XMR (~%2$s %3$s) ✔ מזהה תשלום משולב מכין את העסקתך - יוצר הזנמת SideShift.ai - חוקר הזמנת SideShift.ai + יוצר הזמנות + חוקרת את הצו ממתין לעסקת מונרו - חוקר את הפרמטרים של SideShift.ai + חוקר את הפרמטרים - SideShift.ai שגיאה + שגיאה קוד: %1$d לחץ כדי לנסות שוב עכשיו אנחנו תקועים כאן! - או-אוו, SideShift.ai לא נראה זמין כרגע! + או-אוו, %1$s לא נראה זמין כרגע! %1$s %3$s = %2$s XMR (שיעור: %1$s %2$s/XMR) - בקר ב-SideShift.ai לקבלת תמיכה & מעקב - מפתח סודי\nSideShift.ai - SideShift.ai מפתח סודי + בקר ב-%1$s לקבלת תמיכה & מעקב + מפתח סודי\n%1$s + %1$s מפתח סודי כתובת %1$s היעד כמות @@ -362,7 +362,7 @@ שמור על הסיד שלך בטוח הסיד מעניק גישה מלאה למי שיש אותו. אם אתה מאבד את זה, אנחנו לא יכולים לעזור לך לשחזר את זה ואתה מאבד את המונרוג\' האהוב שלך. שלח קריפטו - למונרוג\'ו יש את התמיכה של SideShift.ai מובנת. פשוט הדבק או סרוק BTC, LTC, ETH, DASH או DOGE כתובת ואתה תשלח את הקריפטו האלה על ידי הוצאת XMR. + למונרוג\'ו יש את התמיכה של exchange מובנת. פשוט הדבק או סרוק BTC, LTC, ETH, TRXUSDT או SOL כתובת ואתה תשלח את הקריפטו האלה על ידי הוצאת XMR. החוליות, בדרך שלך החוליות מחברות אותך לרשת מונרו. בחר בין החוליות הציבוריות או שתתחבר לאחת משלך. שלח עם טביעת אצבע @@ -394,7 +394,7 @@ אנא הזן או סרוק %1$s כתובת.
        - אתה תשלח XMR והמקבל יקבל %2$s באמצעות השירות של SideShift.ai + אתה תשלח XMR והמקבל יקבל %2$s באמצעות השירות של %3$s ]]>
        טור נדרש \u00A0מחכה לחולייה\u00A0 "אפשר התחלות רקע" בהגדרות Orbot לשימוש בטור! - SideShift.ai לא תומך בטור.\nהשבת את טור כדי להחליף את XMR. + %1$s לא תומך בטור.\nהשבת את טור כדי להחליף את XMR. הצפנת סיד (ניסיוני) ביטוי היסט סיט (אופציונלי) diff --git a/app/src/main/res/values-hu/about.xml b/app/src/main/res/values-hu/about.xml index 4720a2a0..cf2d310b 100644 --- a/app/src/main/res/values-hu/about.xml +++ b/app/src/main/res/values-hu/about.xml @@ -34,8 +34,8 @@ nyilvános API-ján keresztül kéri le az árfolyamot. A kéréseid során történő adatgyűjtés módjával kapcsolatban tekintsd meg az adatvédelmi irányelveiket a https://coinmarketcap.com/privacy weboldalon.

        -

        Ha BTC-címekre való fizetésre használod az applikációt, akkor az SideShift.ai szolgáltatását - használod. Részletes adatvédelmi irányelveiket a https://sideshift.ai/ weboldalon tekintheted meg. +

        Ha BTC-címekre való fizetésre használod az applikációt, akkor az Exolix szolgáltatását + használod. Részletes adatvédelmi irányelveiket a https://exolix.com/privacy weboldalon tekintheted meg. A monerujo számukra a kedvezményezett BTC-címet és a küldeni kívánt mennyiséget közli meg, ám az IP-címed is begyűjthető.

        Applikációengedélyek

        diff --git a/app/src/main/res/values-hu/help.xml b/app/src/main/res/values-hu/help.xml index d3541c8b..96f5f356 100644 --- a/app/src/main/res/values-hu/help.xml +++ b/app/src/main/res/values-hu/help.xml @@ -147,52 +147,52 @@
      • an OpenAlias for XMR or BTC
      • a BTC address
      • - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

        BTC-küldés

        -

        SideShift.ai

        -

        Az SideShift.ai egy harmadik féltől származó szolgáltatás, mely Moneróról Bitcoinra való átváltóként - viselkedik. Az SideShift.ai API-ját használjuk a Bitcoinban való fizetés monerujóba való integrálásához. - Kérlek, látogass el a https://sideshift.ai weboldalra, és döntsd el magad, hogy szeretnéd-e használni. - A monerujo csapata nincsen kapcsolatban az SideShift.ai-val és nem tudnak segítséget nyújtani a +

        Exolix

        +

        Az Exolix egy harmadik féltől származó szolgáltatás, mely Moneróról Bitcoinra való átváltóként + viselkedik. Az Exolix API-ját használjuk a Bitcoinban való fizetés monerujóba való integrálásához. + Kérlek, látogass el a https://exolix.com weboldalra, és döntsd el magad, hogy szeretnéd-e használni. + A monerujo csapata nincsen kapcsolatban az Exolix-val és nem tudnak segítséget nyújtani a szolgáltatásaikkal kapcsolatban.

        -

        SideShift.ai árfolyam

        -

        A Mennyiség oldalon kerülnek megjelenítésre az SideShift.ai szolgáltatás paraméterei. Ez magában +

        Exolix árfolyam

        +

        A Mennyiség oldalon kerülnek megjelenítésre az Exolix szolgáltatás paraméterei. Ez magában foglalja az aktuális árfolyamot, valamint a BTC alsó és felső határértékeit. Vedd figyelembe, hogy ez az árfolyam ekkor még nem garantált.

        -

        SideShift.ai megrendelés

        +

        Exolix megrendelés

        A Megerősítés oldalon láthatod a tényleges megrendelést. A megrendelés korlátozott ideig érvényes - láthatod a visszaszámlálást a Küldés gombon. Az árfolyam különbözhet a korábbi képernyőkön látottaktól.

        -

        SideShift.ai titkos kulcs

        -

        Mivel a monerujo csak a tranzakciód Monero részét kezeli, így az SideShift.ai titkos kulcsod - használható a megrendelésed Bitcoin részének nyomonkövetésére az SideShift.ai kezdőlapján.

        -

        SideShift.ai visszaszámlálás!

        -

        Amint a visszaszámlálás eléri a nullát, új ajánlatot kell kérned az SideShift.ai-tól azáltal, hogy +

        Exolix titkos kulcs

        +

        Mivel a monerujo csak a tranzakciód Monero részét kezeli, így az Exolix titkos kulcsod + használható a megrendelésed Bitcoin részének nyomonkövetésére az Exolix kezdőlapján.

        +

        Exolix visszaszámlálás!

        +

        Amint a visszaszámlálás eléri a nullát, új ajánlatot kell kérned az Exolix-tól azáltal, hogy visszamész az előző lépésre, majd visszajössz a Megerősítés oldalra.

        ]]> BTC-küldés -

        SideShift.ai

        -

        Az SideShift.ai egy harmadik féltől származó szolgáltatás, mely Moneróról Bitcoinra való átváltóként - viselkedik. Az SideShift.ai API-ját használjuk a Bitcoinban való fizetés monerujóba való integrálásához. - Kérlek, látogass el a https://sideshift.ai weboldalra, és döntsd el magad, hogy szeretnéd-e használni. - A monerujo csapata nincsen kapcsolatban az SideShift.ai-val és nem tudnak segítséget nyújtani a +

        Exolix

        +

        Az Exolix egy harmadik féltől származó szolgáltatás, mely Moneróról Bitcoinra való átváltóként + viselkedik. Az Exolix API-ját használjuk a Bitcoinban való fizetés monerujóba való integrálásához. + Kérlek, látogass el a https://exolix.com weboldalra, és döntsd el magad, hogy szeretnéd-e használni. + A monerujo csapata nincsen kapcsolatban az Exolix-val és nem tudnak segítséget nyújtani a szolgáltatásaikkal kapcsolatban.

        -

        SideShift.ai árfolyam

        -

        A Mennyiség oldalon kerülnek megjelenítésre az SideShift.ai szolgáltatás paraméterei. Ez magában +

        Exolix árfolyam

        +

        A Mennyiség oldalon kerülnek megjelenítésre az Exolix szolgáltatás paraméterei. Ez magában foglalja az aktuális árfolyamot, valamint a BTC alsó és felső határértékeit. Vedd figyelembe, hogy ez az árfolyam ekkor még nem garantált.

        -

        SideShift.ai megrendelés

        +

        Exolix megrendelés

        A Megerősítés oldalon láthatod a tényleges megrendelést. A megrendelés korlátozott ideig érvényes - láthatod a visszaszámlálást a Küldés gombon. Az árfolyam különbözhet a korábbi képernyőkön látottaktól.

        -

        SideShift.ai titkos kulcs

        -

        Mivel a monerujo csak a tranzakciód Monero részét kezeli, így az SideShift.ai titkos kulcsod - használható a megrendelésed Bitcoin részének nyomonkövetésére az SideShift.ai kezdőlapján.

        -

        SideShift.ai visszaszámlálás!

        -

        Amint a visszaszámlálás eléri a nullát, új ajánlatot kell kérned az SideShift.ai-tól azáltal, hogy +

        Exolix titkos kulcs

        +

        Mivel a monerujo csak a tranzakciód Monero részét kezeli, így az Exolix titkos kulcsod + használható a megrendelésed Bitcoin részének nyomonkövetésére az Exolix kezdőlapján.

        +

        Exolix visszaszámlálás!

        +

        Amint a visszaszámlálás eléri a nullát, új ajánlatot kell kérned az Exolix-tól azáltal, hogy visszamész az előző lépésre, majd visszajössz a Megerősítés oldalra.

        ]]>
        diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index df1378a8..3c811e93 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -35,48 +35,48 @@ %1$s-címet adtál meg.
        - XMR-t fogsz küldeni, a fogadó pedig %1$s-t fog kapni az SideShift.ai szolgáltatásán keresztül. + XMR-t fogsz küldeni, a fogadó pedig %2$s-t fog kapni az %3$s szolgáltatásán keresztül. ]]>
        - SideShift.ai megrendelés + %1$s megrendelés %1$s %2$s Megerősítés folyamatban Kifizetés folyamatban - SideShift.ai-hiba (%1$s) + %1$s-hiba (%2$s) %1$s elküldve! Lekérdezés… Elküldhetsz: %1$s — %2$s %4$s.
        - Az SideShift.ai aktuális árfolyama: %3$s %4$s/XMR. + Az %5$s aktuális árfolyama: %3$s %4$s/XMR. ]]>
        - Egyenleg: %2$s %3$s (%1$s XMR) + Egyenleg: %1$s XMR (~%2$s %3$s) ✔ Fizetési azonosító integrálva Tranzakció előkészítése - SideShift.ai megrendelés létrehozása - SideShift.ai megrendelés lekérdezése + Megrendelés létrehozása + Megrendelés lekérdezése Monero-tranzakció előkészítése - SideShift.ai paraméterek lekérdezése + Paraméterek lekérdezése - SideShift.ai HIBA + HIBA Kód: %1$d Koppints az újrapróbálkozáshoz Itt most elakadtunk! - Ajjaj! Úgy néz ki, az SideShift.ai most nem elérhető! + Ajjaj! Úgy néz ki, az %1$s most nem elérhető! %1$s %3$s = %2$s XMR (Arány: %1$s %2$s/XMR) - Segítségért és nyomonkövetésért látogass el az SideShift.ai weboldalra - Titkos kulcs\nSideShift.ai - SideShift.ai titkos kulcs + Segítségért és nyomonkövetésért látogass el az %1$s weboldalra + Titkos kulcs\n%1$s + %1$s titkos kulcs Kedvezményezett %1$s-címe Mennyiség @@ -362,7 +362,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -394,7 +394,7 @@ Please enter or scan a %1$s address.
        - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
        Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-it/about.xml b/app/src/main/res/values-it/about.xml index 63e3d31c..27773ec9 100644 --- a/app/src/main/res/values-it/about.xml +++ b/app/src/main/res/values-it/about.xml @@ -27,8 +27,8 @@

        Altri dati personali non sono raccolti dall\'app.

        Se usi la funzionalità (opzionale) del cambio, monerujo recupera il tasso di cambio attraverso le API pubbliche di coinmarketcap.com. Controlla la loro politica per la privacy (in lingua inglese) su https://coinmarketcap.com/privacy per conoscere i dettagli su come vengono raccolti i dati nelle tue richieste.

        -

        Se utilizzi l\'app per effettuare pagamenti ad indirizzi BTC, stai usando il servizio SideShift.ai. - Controlla la loro politica per la privacy (in lingua inglese) su https://sideshift.ai/ per conoscere i dettagli. Monerujo invia a loro l\'indirizzo di destinazione BTC e l\'ammontare della transazione. Anche il tuo IP potrebbe essere raccolto.

        +

        Se utilizzi l\'app per effettuare pagamenti ad indirizzi BTC, stai usando il servizio Exolix. + Controlla la loro politica per la privacy (in lingua inglese) su https://exolix.com/privacy per conoscere i dettagli. Monerujo invia a loro l\'indirizzo di destinazione BTC e l\'ammontare della transazione. Anche il tuo IP potrebbe essere raccolto.

        Permessi app

        • INTERNET : Connessione alla rete Monero attraverso un nodo
        • diff --git a/app/src/main/res/values-it/help.xml b/app/src/main/res/values-it/help.xml index a32e3d4b..83496d90 100644 --- a/app/src/main/res/values-it/help.xml +++ b/app/src/main/res/values-it/help.xml @@ -153,49 +153,49 @@
        • un OpenAlias per XMR o BTC
        • un indirizzo BTC
        • - L'invio di BTC è processato tramite il servizio SideShift.ai. (per dettagli: https://sideshift.ai). Vedi la sezione sull'invio di BTC in basso.

          + L'invio di BTC è processato tramite il servizio Exolix. (per dettagli: https://exolix.com). Vedi la sezione sull'invio di BTC in basso.

          Inviare BTC

          -

          SideShift.ai

          -

          SideShift.ai è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin. - Utilizziamo le API SideShift.ai per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://sideshift.ai +

          Exolix

          +

          Exolix è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin. + Utilizziamo le API Exolix per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://exolix.com e decidi tu stesso se questa è una funzionalità che vuoi usare. Il team Monerujo non è associato in alcun modo - con SideShift.ai e non è in grado di aiutarti con il servizio da loro offerto.

          -

          Tasso di cambio SideShift.ai

          -

          Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio SideShift.ai. Questi parametri + con Exolix e non è in grado di aiutarti con il servizio da loro offerto.

          +

          Tasso di cambio Exolix

          +

          Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio Exolix. Questi parametri includono il tasso di cambio attuale oltre ai limiti massimo e minimo di BTC. Considera che il tasso che ti viene mostrato non è ancora garantito in questa fase.

          -

          Ordine SideShift.ai

          -

          Sulla schermata \"Conferma\", troverai il vero ordine SideShift.ai. Questo ordine è valido per un tempo limitato - potresti +

          Ordine Exolix

          +

          Sulla schermata \"Conferma\", troverai il vero ordine Exolix. Questo ordine è valido per un tempo limitato - potresti notare un conto alla rovescia sul pulsante \"Spendi\". Il tasso di cambio potrebbe essere diverso da quello indicativo mostrato nelle schermate precedenti.

          -

          Chiave segreta SideShift.ai

          +

          Chiave segreta Exolix

          Dal momento che Monerujo gestisce soltanto il versante Monero della tua transazione, può essere usata la chiave - segreta SideShift.ai per tracciare il versante Bitcoin del tuo ordine sulla homepage SideShift.ai.

          -

          Conto alla rovescia SideShift.ai!

          -

          Non appena il conto alla rovescia arriva a zero, è necessario richiedere una nuova quotazione a SideShift.ai tornando + segreta Exolix per tracciare il versante Bitcoin del tuo ordine sulla homepage Exolix.

          +

          Conto alla rovescia Exolix!

          +

          Non appena il conto alla rovescia arriva a zero, è necessario richiedere una nuova quotazione a Exolix tornando indietro al passo precedente e tornando poi di nuovo alla schermata \"Conferma\".

          ]]> Inviare BTC -

          SideShift.ai

          -

          SideShift.ai è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin. - Utilizziamo le API SideShift.ai per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://sideshift.ai +

          Exolix

          +

          Exolix è un servizio di terze parti che funziona come cambiavaluta da Monero a Bitcoin. + Utilizziamo le API Exolix per integrare pagamenti Bitcoin all'interno di Monerujo. Controlla https://exolix.com e decidi tu stesso se questa è una funzionalità che vuoi usare. Il team Monerujo non è associato in alcun modo - con SideShift.ai e non è in grado di aiutarti con il servizio da loro offerto.

          -

          Tasso di cambio SideShift.ai

          -

          Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio SideShift.ai. Questi parametri + con Exolix e non è in grado di aiutarti con il servizio da loro offerto.

          +

          Tasso di cambio Exolix

          +

          Sulla schermata \"Ammontare\" ti verranno mostrati i parametri attuali del servizio Exolix. Questi parametri includono il tasso di cambio attuale oltre ai limiti massimo e minimo di BTC. Considera che il tasso che ti viene mostrato non è ancora garantito in questa fase.

          -

          Ordine SideShift.ai

          -

          Sulla schermata \"Conferma\", troverai il vero ordine SideShift.ai. Questo ordine è valido per un tempo limitato - potresti +

          Ordine Exolix

          +

          Sulla schermata \"Conferma\", troverai il vero ordine Exolix. Questo ordine è valido per un tempo limitato - potresti notare un conto alla rovescia sul pulsante \"Spendi\". Il tasso di cambio potrebbe essere diverso da quello indicativo mostrato nelle schermate precedenti.

          -

          Chiave segreta SideShift.ai

          +

          Chiave segreta Exolix

          Dal momento che Monerujo gestisce soltanto il versante Monero della tua transazione, può essere usata la chiave - segreta SideShift.ai per tracciare il versante Bitcoin del tuo ordine sulla homepage SideShift.ai.

          -

          Conto alla rovescia SideShift.ai!

          -

          Non appena il conto alla rovescia arriva a zero, è necessario richiedere una nuova quotazione a SideShift.ai tornando + segreta Exolix per tracciare il versante Bitcoin del tuo ordine sulla homepage Exolix.

          +

          Conto alla rovescia Exolix!

          +

          Non appena il conto alla rovescia arriva a zero, è necessario richiedere una nuova quotazione a Exolix tornando indietro al passo precedente e tornando poi di nuovo alla schermata \"Conferma\".

          ]]>
          diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4666a31f..0b32a2c8 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -35,49 +35,49 @@ Hai inserito un indirizzo %1$s.
          - Invierai XMR e il destinatario riceverà %1$s tramite il servizio SideShift.ai. + Invierai XMR e il destinatario riceverà %2$s tramite il servizio %3$s. ]]>
          - Ordine SideShift.ai + Ordine %1$s %1$s %2$s In attesa di conferma In attesa del pagamento - Errore SideShift.ai (%1$s) + Errore %1$s (%2$s) %1$s Inviati! Richiedendo … Puoi inviare %1$s — %2$s %4$s.
          - SideShift.ai ti sta attualmente concedendo un tasso di cambio di %3$s %4$s/XMR. + %5$s ti sta attualmente concedendo un tasso di cambio di %3$s %4$s/XMR. ]]>
          - Saldo: %2$s %3$s (%1$s XMR) + Saldo: %1$s XMR (~%2$s %3$s) ✔ ID pagamento integrato Preparando la tua transazione - Creando l\'ordine SideShift.ai - Richiedendo l\'ordine SideShift.ai + Creando l\'ordine + Richiedendo l\'ordine Preparando la transazione Monero - Richiedendo i parametri SideShift.ai + Richiedendo i parametri - ERRORE SideShift.ai + ERRORE Codice: %1$d Tocca per riprovare Ora siamo bloccati qui!! - Oh Oh, SideShift.ai sembra non essere disponibile in questo momento! + Oh Oh, %1$s sembra non essere disponibile in questo momento! %1$s %3$s = %2$s XMR (Tasso: %1$s %2$s/XMR) - Visita SideShift.ai per supporto e tracciamento - Chiave segreta\nSideShift.ai - Chiave segreta SideShift.ai + Visita %1$s per supporto e tracciamento + Chiave segreta\n%1$s + Chiave segreta %1$s Indirizzo %1$s di destinazione Ammontare @@ -364,7 +364,7 @@ Tieni al sicuro il tuo seed Il seed permette l\'accesso al portafogli a chiunque lo abbia. Se lo perdi, non possiamo aiutarti a recuperarlo. Invia altre crypto - Monerujo supporta SideShift.ai. Copia o scansiona un indirizzo BTC, LTC, ETH, DASH o DOGE per inviare una di queste crypto spendendo XMR. + Monerujo supporta exchange. Copia o scansiona un indirizzo BTC, LTC, ETH, TRXUSDT o SOL per inviare una di queste crypto spendendo XMR. Nodi, a modo tuo I nodi ti connettono alla rete di Monero. Scegli tra i vari nodi pubblici oppure usa il tuo. Invia con impronta @@ -396,7 +396,7 @@ Inserisci o scansiona un indirizzo %1$s.
          - Invierai XMR e il destinatario otterrà %2$s tramite il servizio SideShift.ai. + Invierai XMR e il destinatario otterrà %2$s tramite il servizio %3$s. ]]>
          Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-ja/about.xml b/app/src/main/res/values-ja/about.xml index 3ecf7b6f..f055d275 100644 --- a/app/src/main/res/values-ja/about.xml +++ b/app/src/main/res/values-ja/about.xml @@ -36,9 +36,9 @@ 詳細については、coinmarketcap.com のプライバシーポリシーを https://coinmarketcap.com/privacy にて参照してください。

          もしあなたがこのアプリをビットコインアドレス宛に支払う場合、 - あなたは SideShift.ai のサービスを使うことになります。 - https://sideshift.ai/ を参照して SideShift.ai のプライバシーポリシーを - ご覧ください。Monerujoは SideShift.ai にビットコインの支払先アドレスと + あなたは Exolix のサービスを使うことになります。 + https://exolix.com/privacy を参照して Exolix のプライバシーポリシーを + ご覧ください。Monerujoは Exolix にビットコインの支払先アドレスと 数量を送信します。あなたのIPアドレスもまた収集されます。

          アプリの権限

            diff --git a/app/src/main/res/values-ja/help.xml b/app/src/main/res/values-ja/help.xml index c58ba6d8..98dd5701 100644 --- a/app/src/main/res/values-ja/help.xml +++ b/app/src/main/res/values-ja/help.xml @@ -244,69 +244,69 @@
          • XMRやBTCのOpenAlias
          • BTCアドレス
          • - BTCの送信はSideShift.aiサービス(https://sideshift.ai)を介して処理されることに注意してください。 + BTCの送信はExolixサービス(https://exolix.com)を介して処理されることに注意してください。 下記のBTCの送信に関するセクションを参照してください。

            BTCの送金

            -

            SideShift.ai

            -

            SideShift.ai はモネロからビットコインに換金する交換所として +

            Exolix

            +

            Exolix はモネロからビットコインに換金する交換所として 機能するサードパーティ製のサービスです。私達は - SideShift.ai のAPIを使うことでビットコインの支払い機能を + Exolix のAPIを使うことでビットコインの支払い機能を Monerujoに組み込んでいます。 - https://sideshift.ai を確認して、これがあなたが使いたい + https://exolix.com を確認して、これがあなたが使いたい 機能であるかどうかをご自身で判断してください。 - Monerujoの開発チームは SideShift.ai とは無関係であり、 - SideShift.aiのサービスに関してあなたをサポートすることはできません。

            -

            SideShift.ai の交換レート

            -

            「数量」(Amount)の画面では SideShift.ai の現在の + Monerujoの開発チームは Exolix とは無関係であり、 + Exolixのサービスに関してあなたをサポートすることはできません。

            +

            Exolix の交換レート

            +

            「数量」(Amount)の画面では Exolix の現在の パラメータが表示されます。これらは現在の交換レートに加えて 送金可能なBTCの上限・下限を含みます。この交換レートは 現時点では保証されたものではないことに注意してください。

            -

            SideShift.ai の注文

            -

            「確認」(Confirm)の画面で、あなたは実際の SideShift.ai +

            Exolix の注文

            +

            「確認」(Confirm)の画面で、あなたは実際の Exolix の注文を見ることになります。この注文は制限時間内でのみ有効です。 あなたは送金(Spend)ボタンにカウントダウンが 表示されていることに気づくかもしれません。 交換レートは前の画面で表示されたものとは異なる可能性が有ります。

            -

            SideShift.ai のシークレットキー

            +

            Exolix のシークレットキー

            Monerujo はBTCとXMRのうち、XMRの方だけを取り扱います。 - SideShift.ai のシークレットキーは、 SideShift.ai のホームページにて + Exolix のシークレットキーは、 Exolix のホームページにて BTCの方の注文を追跡するのに使用できます。

            -

            SideShift.ai カウントダウン!

            +

            Exolix カウントダウン!

            一旦カウントダウンがゼロに到達すると、 あなたは一度前のステップに戻って「確認」(Confirm)の画面に戻って、 - もう一度 SideShift.ai から新しい見積もりを取得する必要があります。

            + もう一度 Exolix から新しい見積もりを取得する必要があります。

            ]]> BTCの送金 -

            SideShift.ai

            -

            SideShift.ai はモネロからビットコインに換金する交換所として +

            Exolix

            +

            Exolix はモネロからビットコインに換金する交換所として 機能するサードパーティ製のサービスです。私達は - SideShift.ai のAPIを使うことでビットコインの支払い機能を + Exolix のAPIを使うことでビットコインの支払い機能を Monerujoに組み込んでいます。 - https://sideshift.ai を確認して、これがあなたが使いたい + https://exolix.com を確認して、これがあなたが使いたい 機能であるかどうかをご自身で判断してください。 - Monerujoの開発チームは SideShift.ai とは無関係であり、 - SideShift.aiのサービスに関してあなたをサポートすることはできません。

            -

            SideShift.ai の交換レート

            -

            「数量」(Amount)の画面では SideShift.ai の現在の + Monerujoの開発チームは Exolix とは無関係であり、 + Exolixのサービスに関してあなたをサポートすることはできません。

            +

            Exolix の交換レート

            +

            「数量」(Amount)の画面では Exolix の現在の パラメータが表示されます。これらは現在の交換レートに加えて 送金可能なBTCの上限・下限を含みます。この交換レートは 現時点では保証されたものではないことに注意してください。

            -

            SideShift.ai の注文

            -

            「確認」(Confirm)の画面で、あなたは実際の SideShift.ai +

            Exolix の注文

            +

            「確認」(Confirm)の画面で、あなたは実際の Exolix の注文を見ることになります。この注文は制限時間内でのみ有効です。 あなたは送金(Spend)ボタンにカウントダウンが 表示されていることに気づくかもしれません。 交換レートは前の画面で表示されたものとは異なる可能性が有ります。

            -

            SideShift.ai のシークレットキー

            +

            Exolix のシークレットキー

            Monerujo はBTCとXMRのうち、XMRの方だけを取り扱います。 - SideShift.ai のシークレットキーは、 SideShift.ai のホームページにて + Exolix のシークレットキーは、 Exolix のホームページにて BTCの方の注文を追跡するのに使用できます。

            -

            SideShift.ai カウントダウン!

            +

            Exolix カウントダウン!

            一旦カウントダウンがゼロに到達すると、 あなたは一度前のステップに戻って「確認」(Confirm)の画面に戻って、 - もう一度 SideShift.ai から新しい見積もりを取得する必要があります。

            + もう一度 Exolix から新しい見積もりを取得する必要があります。

            ]]>
            あなたが入力したのは%1$sのアドレスです。
            - あなたはXMRを送金し、受け手は SideShift.ai のサービスを利用して%1$sを受取ります。 + あなたはXMRを送金し、受け手は %3$s のサービスを利用して%2$sを受取ります。 ]]>
            - SideShift.ai の注文 + %1$s の注文 %1$s %2$s 承認を待っています 支払いを待っています - SideShift.ai のエラー (%1$s) + %1$s のエラー (%2$s) %1$sが送金されました! 問い合わせ中 … %1$s から %2$s %4$s を送金することができます。
            - SideShift.ai での交換レートは現在%3$s %4$s/XMRです。 + %5$s での交換レートは現在%3$s %4$s/XMRです。 ]]>
            - 残高: %2$s %3$s (%1$s XMR) + 残高: %1$s XMR (~%2$s %3$s) ✔ ペイメントID組み込み済み 取引を準備しています - SideShift.ai の注文を作成しています - SideShift.ai の注文を問い合わせています + 注文を作成しています + 注文を問い合わせています モネロの取引を準備しています - SideShift.ai のパラメータを問い合わせています + パラメータを問い合わせています - SideShift.ai のエラー + エラー コード: %1$d タッチして再試行 私達はここで立ち往生のようです! - あーあ、 SideShift.ai は現在利用不能のようです! + あーあ、 %1$s は現在利用不能のようです! %1$s %3$s = %2$s XMR (レート: %1$s %2$s/XMR) - サポートと追跡については SideShift.ai をご覧ください - シークレットキー\nSideShift.ai - SideShift.ai のシークレットキー + サポートと追跡については %1$s をご覧ください + シークレットキー\n%1$s + %1$s のシークレットキー 支払先の %1$s アドレス 数量 @@ -362,7 +362,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -394,7 +394,7 @@ Please enter or scan a %1$s address.
            - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
            Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. タッチして詳細情報を見る Seed encryption (EXPERIMENTAL) diff --git a/app/src/main/res/values-nb/about.xml b/app/src/main/res/values-nb/about.xml index d4e480d2..270d9e84 100644 --- a/app/src/main/res/values-nb/about.xml +++ b/app/src/main/res/values-nb/about.xml @@ -34,8 +34,8 @@ rate through the public API of coinmarketcap.com. See their privacy policy at https://coinmarketcap.com/privacy for details on how data in your requests is collected.

            -

            If you use the app to pay to BTC addresses, you will be using the SideShift.ai service. - See their privacy policy at https://sideshift.ai/ for details. Monerujo send them the BTC +

            If you use the app to pay to BTC addresses, you will be using the Exolix service. + See their privacy policy at https://exolix.com/privacy for details. Monerujo send them the BTC destination address and amount. Your IP will also be collectable.

            App Permissions

              diff --git a/app/src/main/res/values-nb/help.xml b/app/src/main/res/values-nb/help.xml index 7644f541..ec57fc85 100644 --- a/app/src/main/res/values-nb/help.xml +++ b/app/src/main/res/values-nb/help.xml @@ -148,50 +148,50 @@
            • an OpenAlias for XMR or BTC
            • a BTC address
            • - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

              Å sende BTC

              -

              SideShift.ai

              -

              SideShift.ai er en tredjepartstjeneste som lar deg veksle Monero til Bitcoin. - Vi bruker SideShift.ai-APIen til å integrere BTC-betalinger i Monerujo. Sjekk ut - https://sideshift.ai og bestem for deg selv om dette er noe du vil bruke. Monerujo-utviklerne - er ikke assosierte med SideShift.ai og kan ikke hjelpe deg med deres tjeneste.

              -

              SideShift.ai vekslingskurs

              -

              På \"Mengde\" skjermen vil du bli vist de nåværende parametrene til SideShift.ai-tjenesten. Disse +

              Exolix

              +

              Exolix er en tredjepartstjeneste som lar deg veksle Monero til Bitcoin. + Vi bruker Exolix-APIen til å integrere BTC-betalinger i Monerujo. Sjekk ut + https://exolix.com og bestem for deg selv om dette er noe du vil bruke. Monerujo-utviklerne + er ikke assosierte med Exolix og kan ikke hjelpe deg med deres tjeneste.

              +

              Exolix vekslingskurs

              +

              På \"Mengde\" skjermen vil du bli vist de nåværende parametrene til Exolix-tjenesten. Disse inkluderer den nåværende vekslingskursen så vel som nedre og øvre BTC-grenser. Vær oppmerksom på at kursen ikke er garantert på dette punktet.

              -

              SideShift.ai ordre

              -

              På \"Bekreft\" skjermen, vil du se den faktiske SideShift.ai ordren. Denne ordren er gyldig for +

              Exolix ordre

              +

              På \"Bekreft\" skjermen, vil du se den faktiske Exolix ordren. Denne ordren er gyldig for en begrensa tid - du legger kanskje til en nedtelling på \"Bruk\" knappen. Veklingskursen kan være enn den veiledende kursen vist på de tidligere skjermene.

              -

              SideShift.ai hemmelig nøkkel

              -

              Fordi Monerujo bare håndterer XMR delen av transaksjonen din, kan din SideShift.ai hemmelige nøkkel - bli brukt til å spore BTC-transaksjonen på SideShift.ai sine hjemmesider.

              -

              SideShift.ai nedtelling!

              -

              Når nedtellinga når null, må du få en ny kvote fra SideShift.ai ved å gå tilbake til +

              Exolix hemmelig nøkkel

              +

              Fordi Monerujo bare håndterer XMR delen av transaksjonen din, kan din Exolix hemmelige nøkkel + bli brukt til å spore BTC-transaksjonen på Exolix sine hjemmesider.

              +

              Exolix nedtelling!

              +

              Når nedtellinga når null, må du få en ny kvote fra Exolix ved å gå tilbake til det tidligere steget og komme tilbake til \"Bekreft\" skjermen.

              ]]> Å sende BTC -

              SideShift.ai

              -

              SideShift.ai er en tredjepartstjeneste som lar deg veksle Monero til Bitcoin. - Vi bruker SideShift.ai-APIen til å integrere BTC-betalinger i Monerujo. Sjekk ut - https://sideshift.ai og bestem for deg selv om dette er noe du vil bruke. Monerujo-utviklerne - er ikke assosierte med SideShift.ai og kan ikke hjelpe deg med deres tjeneste.

              -

              SideShift.ai vekslingskurs

              -

              På \"Mengde\" skjermen vil du bli vist de nåværende parametrene til SideShift.ai-tjenesten. Disse +

              Exolix

              +

              Exolix er en tredjepartstjeneste som lar deg veksle Monero til Bitcoin. + Vi bruker Exolix-APIen til å integrere BTC-betalinger i Monerujo. Sjekk ut + https://exolix.com og bestem for deg selv om dette er noe du vil bruke. Monerujo-utviklerne + er ikke assosierte med Exolix og kan ikke hjelpe deg med deres tjeneste.

              +

              Exolix vekslingskurs

              +

              På \"Mengde\" skjermen vil du bli vist de nåværende parametrene til Exolix-tjenesten. Disse inkluderer den nåværende vekslingskursen så vel som nedre og øvre BTC-grenser. Vær oppmerksom på at kursen ikke er garantert på dette punktet.

              -

              SideShift.ai ordre

              -

              På \"Bekreft\" skjermen, vil du se den faktiske SideShift.ai ordren. Denne ordren er gyldig for +

              Exolix ordre

              +

              På \"Bekreft\" skjermen, vil du se den faktiske Exolix ordren. Denne ordren er gyldig for en begrensa tid - du legger kanskje til en nedtelling på \"Bruk\" knappen. Veklingskursen kan være enn den veiledende kursen vist på de tidligere skjermene.

              -

              SideShift.ai hemmelig nøkkel

              -

              Fordi Monerujo bare håndterer XMR delen av transaksjonen din, kan din SideShift.ai hemmelige nøkkel - bli brukt til å spore BTC-transaksjonen på SideShift.ai sine hjemmesider.

              -

              SideShift.ai nedtelling!

              -

              Når nedtellinga når null, må du få en ny kvote fra SideShift.ai ved å gå tilbake til +

              Exolix hemmelig nøkkel

              +

              Fordi Monerujo bare håndterer XMR delen av transaksjonen din, kan din Exolix hemmelige nøkkel + bli brukt til å spore BTC-transaksjonen på Exolix sine hjemmesider.

              +

              Exolix nedtelling!

              +

              Når nedtellinga når null, må du få en ny kvote fra Exolix ved å gå tilbake til det tidligere steget og komme tilbake til \"Bekreft\" skjermen.

              ]]>
              diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index c3708547..dbe4d42a 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -35,47 +35,47 @@ Du skrev inn en %1$s addresse.
              - Du vil sende XMR og mottakeren vil få %1$s gjennom SideShift.ai tjenesten. + Du vil sende XMR og mottakeren vil få %2$s gjennom %3$s tjenesten. ]]>
              - SideShift.ai Ordre + %1$s Ordre %1$s %2$s Bekreftelse venter Betaling venter - SideShift.ai error (%1$s) + %1$s error (%2$s) %1$s sendt! Spør … Du kan sende %1$s — %2$s %4$s.
              - SideShift.ai gir deg en vekslingskurs på %3$s %4$s/XMR akkurat nå. + %5$s gir deg en vekslingskurs på %3$s %4$s/XMR akkurat nå. ]]>
              - Saldo: %2$s %3$s (%1$s XMR) + Saldo: %1$s XMR (~%2$s %3$s) ✔ Betalings ID integrert Forbereder din transaksjon - Lager SideShift.ai ordre - Spør etter SideShift.ai ordre + Lager ordre + Spør etter ordre Forbereder Monero transaksjon - Spør etter SideShift.ai parametre + Spør etter parametre - SideShift.ai ERROR + ERROR Kode: %1$d Trykk for å prøve igjen Nå sitter vi fast her! - Ops, det ser ikke ut til at SideShift.ai er tilgjengelig for øyeblikket! + Ops, det ser ikke ut til at %1$s er tilgjengelig for øyeblikket! %1$s %3$s = %2$s XMR (Rate: %1$s %2$s/XMR) - Besøk SideShift.ai for støtte og sporing - Hemmelig nøkkel\nSideShift.ai - SideShift.ai Hemmelig nøkkel + Besøk %1$s for støtte og sporing + Hemmelig nøkkel\n%1$s + %1$s Hemmelig nøkkel %1$s destinasjonsadresse Mengde @@ -360,7 +360,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -392,7 +392,7 @@ Please enter or scan a %1$s address.
              - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
              Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-nl/about.xml b/app/src/main/res/values-nl/about.xml index 6697d6a4..e17bd7e7 100644 --- a/app/src/main/res/values-nl/about.xml +++ b/app/src/main/res/values-nl/about.xml @@ -27,8 +27,8 @@

              Verder worden er geen persoonlijke gegevens verzameld door de app.

              Als je de optionele wisselkoersfunctie gebruikt, haalt monerujo de wisselkoers op via de openbare API van coinmarketcap.com. Zie het privacybeleid op https://coinmarketcap.com/privacy voor meer informatie over hoe de gegevens in je aanvragen worden verzameld.

              -

              Als je de app gebruikt om naar BTC-adressen te betalen, maak je gebruik van de service SideShift.ai. - Zie hun privacybeleid op https://sideshift.ai/ voor meer informatie. Monerujo verzendt het BTC-adres en -bedrag van de bestemming naar SideShift.ai. Je IP-adres kan ook worden bewaard.

              +

              Als je de app gebruikt om naar BTC-adressen te betalen, maak je gebruik van de service Exolix. + Zie hun privacybeleid op https://exolix.com/privacy voor meer informatie. Monerujo verzendt het BTC-adres en -bedrag van de bestemming naar Exolix. Je IP-adres kan ook worden bewaard.

              App-machtigingen

              • INTERNET: Verbinding maken met het Monero-netwerk via een Monero-node
              • diff --git a/app/src/main/res/values-nl/help.xml b/app/src/main/res/values-nl/help.xml index a150953c..eafb2c23 100644 --- a/app/src/main/res/values-nl/help.xml +++ b/app/src/main/res/values-nl/help.xml @@ -117,35 +117,35 @@
              • an OpenAlias for XMR or BTC
              • a BTC address
              • - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

                BTC verzenden

                -

                SideShift.ai

                -

                SideShift.ai is een externe service waarmee je Monero kunt inwisselen voor Bitcoin. - We gebruiken de API van SideShift.ai om Bitcoin-betalingen te integreren in Monerujo. Neem eens een kijkje op https://sideshift.ai en besluit zelf of je dit wilt gebruiken. Het Monerujo-team is niet verbonden aan SideShift.ai en kan je niet helpen met deze service.

                -

                Wisselkoers SideShift.ai

                -

                Op het scherm \"Bedrag\" worden de huidige waarden voor het gebruik van SideShift.ai weergegeven. Hierbij staat de huidige wisselkoers, maar ook het maximale en minimale BTC-bedrag. Houd er rekening mee dat deze koers op dit moment nog niet wordt gegarandeerd.

                -

                SideShift.ai-opdracht

                -

                Op het scherm \"Bevestigen\" wordt de eigenlijke SideShift.ai-opdracht weergegeven. Deze opdracht is geldig voor een beperkte tijd. Er wordt afgeteld op de knop \"Uitgeven\". De wisselkoers kan hier anders zijn dan de schatting die op eerdere schermen is weergegeven.

                -

                Geheime sleutel SideShift.ai

                -

                Omdat Monerujo alleen het Monero-gedeelte van je transactie verwerkt, kun je je geheime sleutel voor SideShift.ai gebruiken om het Bitcoin-gedeelte van de opdracht te volgen op de SideShift.ai-website.

                -

                SideShift.ai telt af!

                -

                Als de knop heeft afgeteld naar nul, moet je een nieuw aanbod van SideShift.ai aanvragen. Ga daarvoor terug naar de vorige stap en open het scherm \"Bevestigen\" opnieuw.

                +

                Exolix

                +

                Exolix is een externe service waarmee je Monero kunt inwisselen voor Bitcoin. + We gebruiken de API van Exolix om Bitcoin-betalingen te integreren in Monerujo. Neem eens een kijkje op https://exolix.com en besluit zelf of je dit wilt gebruiken. Het Monerujo-team is niet verbonden aan Exolix en kan je niet helpen met deze service.

                +

                Wisselkoers Exolix

                +

                Op het scherm \"Bedrag\" worden de huidige waarden voor het gebruik van Exolix weergegeven. Hierbij staat de huidige wisselkoers, maar ook het maximale en minimale BTC-bedrag. Houd er rekening mee dat deze koers op dit moment nog niet wordt gegarandeerd.

                +

                Exolix-opdracht

                +

                Op het scherm \"Bevestigen\" wordt de eigenlijke Exolix-opdracht weergegeven. Deze opdracht is geldig voor een beperkte tijd. Er wordt afgeteld op de knop \"Uitgeven\". De wisselkoers kan hier anders zijn dan de schatting die op eerdere schermen is weergegeven.

                +

                Geheime sleutel Exolix

                +

                Omdat Monerujo alleen het Monero-gedeelte van je transactie verwerkt, kun je je geheime sleutel voor Exolix gebruiken om het Bitcoin-gedeelte van de opdracht te volgen op de Exolix-website.

                +

                Exolix telt af!

                +

                Als de knop heeft afgeteld naar nul, moet je een nieuw aanbod van Exolix aanvragen. Ga daarvoor terug naar de vorige stap en open het scherm \"Bevestigen\" opnieuw.

                ]]> BTC verzenden -

                SideShift.ai

                -

                SideShift.ai is een externe service waarmee je Monero kunt inwisselen voor Bitcoin. - We gebruiken de API van SideShift.ai om Bitcoin-betalingen te integreren in Monerujo. Neem eens een kijkje op https://sideshift.ai en besluit zelf of je dit wilt gebruiken. Het Monerujo-team is niet verbonden aan SideShift.ai en kan je niet helpen met deze service.

                -

                Wisselkoers SideShift.ai

                -

                Op het scherm \"Bedrag\" worden de huidige waarden voor het gebruik van SideShift.ai weergegeven. Hierbij staat de huidige wisselkoers, maar ook het maximale en minimale BTC-bedrag. Houd er rekening mee dat deze koers op dit moment nog niet wordt gegarandeerd.

                -

                SideShift.ai-opdracht

                -

                Op het scherm \"Bevestigen\" wordt de eigenlijke SideShift.ai-opdracht weergegeven. Deze opdracht is geldig voor een beperkte tijd. Er wordt afgeteld op de knop \"Uitgeven\". De wisselkoers kan hier anders zijn dan de schatting die op eerdere schermen is weergegeven.

                -

                Geheime sleutel SideShift.ai

                -

                Omdat Monerujo alleen het Monero-gedeelte van je transactie verwerkt, kun je je geheime sleutel voor SideShift.ai gebruiken om het Bitcoin-gedeelte van de opdracht te volgen op de SideShift.ai-website.

                -

                SideShift.ai telt af!

                -

                Als de knop heeft afgeteld naar nul, moet je een nieuw aanbod van SideShift.ai aanvragen. Ga daarvoor terug naar de vorige stap en open het scherm \"Bevestigen\" opnieuw.

                +

                Exolix

                +

                Exolix is een externe service waarmee je Monero kunt inwisselen voor Bitcoin. + We gebruiken de API van Exolix om Bitcoin-betalingen te integreren in Monerujo. Neem eens een kijkje op https://exolix.com en besluit zelf of je dit wilt gebruiken. Het Monerujo-team is niet verbonden aan Exolix en kan je niet helpen met deze service.

                +

                Wisselkoers Exolix

                +

                Op het scherm \"Bedrag\" worden de huidige waarden voor het gebruik van Exolix weergegeven. Hierbij staat de huidige wisselkoers, maar ook het maximale en minimale BTC-bedrag. Houd er rekening mee dat deze koers op dit moment nog niet wordt gegarandeerd.

                +

                Exolix-opdracht

                +

                Op het scherm \"Bevestigen\" wordt de eigenlijke Exolix-opdracht weergegeven. Deze opdracht is geldig voor een beperkte tijd. Er wordt afgeteld op de knop \"Uitgeven\". De wisselkoers kan hier anders zijn dan de schatting die op eerdere schermen is weergegeven.

                +

                Geheime sleutel Exolix

                +

                Omdat Monerujo alleen het Monero-gedeelte van je transactie verwerkt, kun je je geheime sleutel voor Exolix gebruiken om het Bitcoin-gedeelte van de opdracht te volgen op de Exolix-website.

                +

                Exolix telt af!

                +

                Als de knop heeft afgeteld naar nul, moet je een nieuw aanbod van Exolix aanvragen. Ga daarvoor terug naar de vorige stap en open het scherm \"Bevestigen\" opnieuw.

                ]]>
                Je hebt een %1$s-adres ingevoerd.
                - Je verzendt XMR en de ontvanger krijgt %1$s via SideShift.ai. + Je verzendt XMR en de ontvanger krijgt %2$s via %3$s. ]]>
                - SideShift.ai-opdracht + %1$s-opdracht %1$s %2$s Wacht op bevestiging Wacht op betaling - Fout bij SideShift.ai (%1$s) + Fout bij %1$s (%2$s) %1$s verzonden! Aanvragen… Je kunt %1$s — %2$s %4$s verzenden.
                - SideShift.ai biedt nu een wisselkoers van %3$s %4$s/XMR aan. + %5$s biedt nu een wisselkoers van %3$s %4$s/XMR aan. ]]>
                - Saldo: %2$s %3$s (%1$s XMR) + Saldo: %1$s XMR (~%2$s %3$s) ✔ Betalings-ID geïntegreerd Transactie wordt voorbereid - SideShift.ai-opdracht maken - SideShift.ai-opdracht aanvragen + Opdracht maken + Opdracht aanvragen Monero-transactie voorbereiden - SideShift.ai-parameters aanvragen + Parameters aanvragen - FOUT BIJ SideShift.ai + FOUT Code: %1$d Opnieuw proberen Nu zitten we vast… - Oeps, SideShift.ai is op dit moment niet beschikbaar. + Oeps, %1$s is op dit moment niet beschikbaar. %1$s %3$s = %2$s XMR (Koers: %1$s %2$s/XMR) - Ga naar SideShift.ai voor hulp en traceren - Geheime sleutel\nSideShift.ai - Geheime sleutel SideShift.ai + Ga naar %1$s voor hulp en traceren + Geheime sleutel\n%1$s + Geheime sleutel %1$s %1$s-doeladres Bedrag @@ -361,7 +361,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -393,7 +393,7 @@ Please enter or scan a %1$s address.
                - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
                Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-pt-rBR/about.xml b/app/src/main/res/values-pt-rBR/about.xml index f59ba870..8f0ae6c2 100755 --- a/app/src/main/res/values-pt-rBR/about.xml +++ b/app/src/main/res/values-pt-rBR/about.xml @@ -35,7 +35,7 @@ detalhes de como as requisições são coletadas.

                Se você usar nosso aplicativo para fazer pagamentos em BTC, você estará - usando o serviço SideShift.ai. Verifique sua política de privacidade em https://sideshift.ai/ + usando o serviço Exolix. Verifique sua política de privacidade em https://exolix.com/privacy para detalhes. O monerujo envia o endereço de destino e valor ao serviço. Seu IP também pode ser coletado.

                Permissões do aplicativo

                diff --git a/app/src/main/res/values-pt-rBR/help.xml b/app/src/main/res/values-pt-rBR/help.xml index a4d386ad..01920c7b 100755 --- a/app/src/main/res/values-pt-rBR/help.xml +++ b/app/src/main/res/values-pt-rBR/help.xml @@ -159,50 +159,50 @@
              • um OpenAlias para XMR ou BTC
              • um endereço BTC
              • - Observe que o envio de BTC é processado pelo serviço SideShift.ai (veja https://sideshift.ai para detalhes). + Observe que o envio de BTC é processado pelo serviço Exolix (veja https://exolix.com para detalhes). Consulte a seção sobre envio de BTC abaixo.

                Enviando BTC

                -

                SideShift.ai

                -

                SideShift.ai é um serviço terceiro que age como casa de câmbio de Monero para Bitcoin. - Nós usamos a API do SideShift.ai para integrar pagamentos em Bitcoin direto na carteira Monerujo. Consulte https://sideshift.ai - e decide por sua própria conta se este é um serviço que você quer usar. A equipe Monerujo não está associada com o SideShift.ai +

                Exolix

                +

                Exolix é um serviço terceiro que age como casa de câmbio de Monero para Bitcoin. + Nós usamos a API do Exolix para integrar pagamentos em Bitcoin direto na carteira Monerujo. Consulte https://exolix.com + e decide por sua própria conta se este é um serviço que você quer usar. A equipe Monerujo não está associada com o Exolix e não podemos ajudá-lo caso algo não funcione no serviço.

                -

                Cotação SideShift.ai

                -

                Na tela que exibe o valor da transação você poderá consultar os parâmetros do SideShift.ai. +

                Cotação Exolix

                +

                Na tela que exibe o valor da transação você poderá consultar os parâmetros do Exolix. Nos quais estão incluídos a cotação, assim como os limites máximos e mínimos de envio de BTC. Note que nesse momento a cotação ainda não é garantida.

                -

                Ordem SideShift.ai

                -

                Na tela de confirmação você verá a ordem criada no SideShift.ai. A ordem é válida somente por +

                Ordem Exolix

                +

                Na tela de confirmação você verá a ordem criada no Exolix. A ordem é válida somente por um período limitado - você pode observar uma contagem regressiva no botão de confirmação. A cotação pode ser diferente do que estava indicado na tela anterior.

                -

                Chave secreta do SideShift.ai

                +

                Chave secreta do Exolix

                Como o Monerujo somente lida com a parte da transação que é em Monero, você pode usar sua chave secreta do - SideShift.ai para rastrear a parte da transação que é em Bitcoin no website do SideShift.ai.

                -

                Contagem regressiva do SideShift.ai

                -

                Quando o contador chega a zero será preciso iniciar uma nova ordem e solicitar uma nova cotação ao SideShift.ai. Volte para a tela + Exolix para rastrear a parte da transação que é em Bitcoin no website do Exolix.

                +

                Contagem regressiva do Exolix

                +

                Quando o contador chega a zero será preciso iniciar uma nova ordem e solicitar uma nova cotação ao Exolix. Volte para a tela anterior e faça o processo novamente.

                ]]> Enviando BTC -

                SideShift.ai

                -

                SideShift.ai é um serviço terceiro que age como casa de câmbio de Monero para Bitcoin. - Nós usamos a API do SideShift.ai para integrar pagamentos em Bitcoin direto na carteira Monerujo. Consulte https://sideshift.ai - e decide por sua própria conta se este é um serviço que você quer usar. A equipe Monerujo não está associada com o SideShift.ai +

                Exolix

                +

                Exolix é um serviço terceiro que age como casa de câmbio de Monero para Bitcoin. + Nós usamos a API do Exolix para integrar pagamentos em Bitcoin direto na carteira Monerujo. Consulte https://exolix.com + e decide por sua própria conta se este é um serviço que você quer usar. A equipe Monerujo não está associada com o Exolix e não podemos ajudá-lo caso algo não funcione no serviço.

                -

                Cotação SideShift.ai

                -

                Na tela que exibe o valor da transação você poderá consultar os parâmetros do SideShift.ai. +

                Cotação Exolix

                +

                Na tela que exibe o valor da transação você poderá consultar os parâmetros do Exolix. Nos quais estão incluídos a cotação, assim como os limites máximos e mínimos de envio de BTC. Note que nesse momento a cotação ainda não é garantida.

                -

                Ordem SideShift.ai

                -

                Na tela de confirmação você verá a ordem criada no SideShift.ai. A ordem é válida somente por +

                Ordem Exolix

                +

                Na tela de confirmação você verá a ordem criada no Exolix. A ordem é válida somente por um período limitado - você pode observar uma contagem regressiva no botão de confirmação. A cotação pode ser diferente do que estava indicado na tela anterior.

                -

                Chave secreta do SideShift.ai

                +

                Chave secreta do Exolix

                Como o Monerujo somente lida com a parte da transação que é em Monero, você pode usar sua chave secreta do - SideShift.ai para rastrear a parte da transação que é em Bitcoin no website do SideShift.ai.

                -

                Contagem regressiva do SideShift.ai

                -

                Quando o contador chega a zero será preciso iniciar uma nova ordem e solicitar uma nova cotação ao SideShift.ai. Volte para a tela + Exolix para rastrear a parte da transação que é em Bitcoin no website do Exolix.

                +

                Contagem regressiva do Exolix

                +

                Quando o contador chega a zero será preciso iniciar uma nova ordem e solicitar uma nova cotação ao Exolix. Volte para a tela anterior e faça o processo novamente.

                ]]>
                diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2d129751..44051b0c 100755 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -35,48 +35,48 @@ Você colocou um endereço %1$s.
                - Você enviará XMR e o destinatário receberá %1$s via o serviço SideShift.ai + Você enviará XMR e o destinatário receberá %2$s via o serviço %3$s ]]>
                - Ordem no SideShift.ai + Ordem no %1$s %1$s %2$s Confirmação Pendente Pagamento Pendente - Erro SideShift.ai (%1$s) + Erro %1$s (%2$s) %1$s Enviado! Consultando … Você pode enviar %1$s — %2$s %4$s.
                - SideShift.ai enviou a cotação de %3$s %4$s/XMR neste momento. + %5$s enviou a cotação de %3$s %4$s/XMR neste momento. ]]>
                - Saldo: %2$s %3$s (%1$s XMR) + Saldo: %1$s XMR (~%2$s %3$s) ✔ ID do pagamento integrado Preparando sua transação - Criando a ordem no SideShift.ai - Atualizando a ordem no SideShift.ai + Criando a ordem + Atualizando a ordem Preparando a transação em Monero - Consultando os parâmetros no SideShift.ai + Consultando os parâmetros - ERRO SideShift.ai + ERRO Código: %1$d Toque aqui para tentar novamente Opa, estamos travados aqui! - Hm, parece que o SideShift.ai não está disponível no momento + Hm, parece que o %1$s não está disponível no momento %1$s %3$s = %2$s XMR (Cotação: %1$s %2$s/XMR) - Visite SideShift.ai para suporte & rastreio da ordem - Chave secreta\nSideShift.ai - Chave secreta SideShift.ai + Visite %1$s para suporte & rastreio da ordem + Chave secreta\n%1$s + Chave secreta %1$s Endereço %1$s de destino Valor @@ -353,7 +353,7 @@ aqui. Mantenha sua semente em segurança 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. Enviar Cripto - A Monerujo possui o SideShift.ai integrado. Basta colar ou escanear um endereço BTC, LTC, ETH, DASH ou DOGE e você estará enviando cripto, mas gastando em XMR. + A Monerujo possui o exchange integrado. Basta colar ou escanear um endereço BTC, LTC, ETH, TRXUSDT ou SOL e você estará enviando cripto, mas gastando em XMR. "Nós", do seu jeito Os nós conectam você à rede Monero. Escolha entre nós públicos ou seja completamente "cypherpunk" e utilize seu próprio nó. Enviar usando a digital @@ -385,7 +385,7 @@ aqui. Favor inserir ou escanear um endereço %1$s.
                - Você enviará XMR e o destinatário irá receber %2$s através do serviço SideShift.ai. + Você enviará XMR e o destinatário irá receber %2$s através do serviço %3$s. ]]>
                Necessário Tor \u00A0ESPERANDO PELO NÓ\u00A0 "Permitir inicializações em segundo plano" nas opções do Orbot para usar o Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Encriptação da Semente (EXPERIMENTAL) Senha de dedução da semente (opcional) diff --git a/app/src/main/res/values-pt/about.xml b/app/src/main/res/values-pt/about.xml index 4e254ec1..aa7b3078 100644 --- a/app/src/main/res/values-pt/about.xml +++ b/app/src/main/res/values-pt/about.xml @@ -35,8 +35,8 @@ Confirme a política de privacidade deste serviço em https://www.kraken.com/legal/privacy para mais detalhes em como estes pedidos são processados (especialmente a secção "Informação que recolhemos automaticament").

                -

                Se utilizar esta app para pagar em BTC, você estará a utilizar o serviço SideShift.ai. - Veja a sua política de privacidade em https://sideshift.ai/ para mais detalhes. O monerujo envia +

                Se utilizar esta app para pagar em BTC, você estará a utilizar o serviço Exolix. + Veja a sua política de privacidade em https://exolix.com/privacy para mais detalhes. O monerujo envia para este serviço a quantidade e o endereço de destino das BTC. O seu IP vai ser registado.

                Permissões da app

                  diff --git a/app/src/main/res/values-pt/help.xml b/app/src/main/res/values-pt/help.xml index 86fbd010..4becd73d 100644 --- a/app/src/main/res/values-pt/help.xml +++ b/app/src/main/res/values-pt/help.xml @@ -146,54 +146,54 @@
                • Um OpenAlias para XMR ou BTC
                • um endereço de BTC
                • - Não deixar de notar que, enviar BTC é processado através do serviço SideShift.ai (ver https://sideshift.ai + Não deixar de notar que, enviar BTC é processado através do serviço Exolix (ver https://exolix.com para detalhes). Ver a secção enviar BTC.

                  Enviar BTC

                  -

                  SideShift.ai

                  -

                  SideShift.ai é um serviço de terceiros que funciona como intercâmbio de Monero para Bitcoin. - Nós utilizamos a API do SideShift.ai para integrar pagamentos de Bitcoin no Monerujo. Por favor - vai a https://sideshift.ai e decide por ti próprio se queres utilizar este serviço. A equipa - do Monerujo não está associada com o SideShift.ai e não te pode ajudar com este serviço.

                  -

                  Taxa de câmbio SideShift.ai

                  -

                  No ecrã de \"Quantidade\" vais ver os parâmetros actuais do serviço SideShift.ai. Estes +

                  Exolix

                  +

                  Exolix é um serviço de terceiros que funciona como intercâmbio de Monero para Bitcoin. + Nós utilizamos a API do Exolix para integrar pagamentos de Bitcoin no Monerujo. Por favor + vai a https://exolix.com e decide por ti próprio se queres utilizar este serviço. A equipa + do Monerujo não está associada com o Exolix e não te pode ajudar com este serviço.

                  +

                  Taxa de câmbio Exolix

                  +

                  No ecrã de \"Quantidade\" vais ver os parâmetros actuais do serviço Exolix. Estes incluem a taxa de câmbio assim como os limites superiores e inferiores em BTC. Nota que esta taxa ainda não é garantido.

                  -

                  Pedido SideShift.ai

                  -

                  No ecrão de \"Confirmação\", vais ver o pedido actual SideShift.ai. Este pedido é válido +

                  Pedido Exolix

                  +

                  No ecrão de \"Confirmação\", vais ver o pedido actual Exolix. Este pedido é válido por um período limitado de tempo - podes reparar que exite uma contagem decrescente no botão de \"Enviar\". A taxa de câmbio pode ser diferente da taxa indicativa mostrada nos ecrãs anteriores.

                  -

                  Chave Secreta SideShift.ai

                  -

                  Como o Monerujo só controla a parte Monero da transacção, a chave secreta SideShift.ai +

                  Chave Secreta Exolix

                  +

                  Como o Monerujo só controla a parte Monero da transacção, a chave secreta Exolix pode ser utilizada para monitorar a parte Bitcoin da transacção na página pricipal do - SideShift.ai.

                  -

                  Contagem decrescente SideShift.ai!

                  -

                  Quando a contagem chega a zero, precisas de obter uma nova taxa de câmbio do SideShift.ai + Exolix.

                  +

                  Contagem decrescente Exolix!

                  +

                  Quando a contagem chega a zero, precisas de obter uma nova taxa de câmbio do Exolix indo ao passo anterior e depois voltando ao ecrã de \"Confirmar\".

                  ]]> Enviar BTC -

                  SideShift.ai

                  -

                  SideShift.ai é um serviço de terceiros que funciona como intercâmbio de Monero para Bitcoin. - Nós utilizamos a API do SideShift.ai para integrar pagamentos de Bitcoin no Monerujo. Por favor - vai a https://sideshift.ai e decide por ti próprio se queres utilizar este serviço. A equipa - do Monerujo não está associada com o SideShift.ai e não te pode ajudar com este serviço.

                  -

                  Taxa de câmbio SideShift.ai

                  -

                  No ecrã de \"Quantidade\" vais ver os parâmetros actuais do serviço SideShift.ai. Estes +

                  Exolix

                  +

                  Exolix é um serviço de terceiros que funciona como intercâmbio de Monero para Bitcoin. + Nós utilizamos a API do Exolix para integrar pagamentos de Bitcoin no Monerujo. Por favor + vai a https://exolix.com e decide por ti próprio se queres utilizar este serviço. A equipa + do Monerujo não está associada com o Exolix e não te pode ajudar com este serviço.

                  +

                  Taxa de câmbio Exolix

                  +

                  No ecrã de \"Quantidade\" vais ver os parâmetros actuais do serviço Exolix. Estes incluem a taxa de câmbio assim como os limites superiores e inferiores em BTC. Nota que esta taxa ainda não é garantido.

                  -

                  Pedido SideShift.ai

                  -

                  No ecrão de \"Confirmação\", vais ver o pedido actual SideShift.ai. Este pedido é válido +

                  Pedido Exolix

                  +

                  No ecrão de \"Confirmação\", vais ver o pedido actual Exolix. Este pedido é válido por um período limitado de tempo - podes reparar que exite uma contagem decrescente no botão de \"Enviar\". A taxa de câmbio pode ser diferente da taxa indicativa mostrada nos ecrãs anteriores.

                  -

                  Chave Secreta SideShift.ai

                  -

                  Como o Monerujo só controla a parte Monero da transacção, a chave secreta SideShift.ai +

                  Chave Secreta Exolix

                  +

                  Como o Monerujo só controla a parte Monero da transacção, a chave secreta Exolix pode ser utilizada para monitorar a parte Bitcoin da transacção na página pricipal do - SideShift.ai.

                  -

                  Contagem decrescente SideShift.ai!

                  -

                  Quando a contagem chega a zero, precisas de obter uma nova taxa de câmbio do SideShift.ai + Exolix.

                  +

                  Contagem decrescente Exolix!

                  +

                  Quando a contagem chega a zero, precisas de obter uma nova taxa de câmbio do Exolix indo ao passo anterior e depois voltando ao ecrã de \"Confirmar\".

                  ]]>
                  diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e53a74dd..544bb265 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -35,48 +35,48 @@ Introduziu um endereço %1$s.
                  - Vai enviar em XMR e o destinatário vai receber %1$s através do serviço SideShift.ai + Vai enviar em XMR e o destinatário vai receber %2$s através do serviço %3$s ]]>
                  - SideShift.ai Order + %1$s Order %1$s %2$s Confirmação Pendente Pagamento Pendente - Erro SideShift.ai (%1$s) + Erro %1$s (%2$s) %1$s Enviadas! A comunicar … Pode enviar %1$s — %2$s %4$s.
                  - SideShift.ai está com uma taxa de conversão de %3$s %4$s/XMR neste momento. + %5$s está com uma taxa de conversão de %3$s %4$s/XMR neste momento. ]]>
                  - Saldo: %2$s %3$s (%1$s XMR) + Saldo: %1$s XMR (~%2$s %3$s) ✔ ID do pagamento integrado A preparar a transacção - A criar um pedido SideShift.ai - A actualizar o pedido SideShift.ai + A criar um pedido + A actualizar o pedido A preparar a transacção Monero - A obter os parâmetros SideShift.ai + A obter os parâmetros - ERRO SideShift.ai + ERRO Código: %1$d Toca para voltar a tentar Agora estamos emperrados aqui! - Ups, SideShift.ai não parece estar disponível neste momento! + Ups, %1$s não parece estar disponível neste momento! %1$s %3$s = %2$s XMR (Rácio: %1$s %2$s/XMR) - Vai a SideShift.ai para suporte & seguimento - Chave secreta\nSideShift.ai - SideShift.ai Chave secreta + Vai a %1$s para suporte & seguimento + Chave secreta\n%1$s + %1$s Chave secreta Endereço %1$s de destino Quantidade @@ -364,7 +364,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -396,7 +396,7 @@ Please enter or scan a %1$s address.
                  - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
                  Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-ro/about.xml b/app/src/main/res/values-ro/about.xml index ffb56883..0db82630 100644 --- a/app/src/main/res/values-ro/about.xml +++ b/app/src/main/res/values-ro/about.xml @@ -35,8 +35,8 @@ Vizualizează politica de confidențialitate la adresa https://www.kraken.com/legal/privacy pentru a vedea cum este procesată informația (În special secțiunea "Information We Collect Automatically").

                  În cazul in care folosești aplicația pentru a face o plată către o adresă de portofel BTC, - vei folosi serviciul oferit de SideShift.ai. - Vizualizează politica lor de confidențialitate la adresa https://sideshift.ai/ pentru detalii. Monerujo le va trimite lor + vei folosi serviciul oferit de Exolix. + Vizualizează politica lor de confidențialitate la adresa https://exolix.com/privacy pentru detalii. Monerujo le va trimite lor adresa de destinație și suma BTC. Adresa ta de IP poate fi colectată.

                  Permisiunile aplicației

                    diff --git a/app/src/main/res/values-ro/help.xml b/app/src/main/res/values-ro/help.xml index e2d42d9c..b970b9ea 100644 --- a/app/src/main/res/values-ro/help.xml +++ b/app/src/main/res/values-ro/help.xml @@ -166,50 +166,50 @@
                  • un OpenAlias pentru XMR sau BTC
                  • o adresă BTC
                  • - Atenție, transferul BTC este procesat de serviciul SideShift.ai (vezi https://sideshift.ai + Atenție, transferul BTC este procesat de serviciul Exolix (vezi https://exolix.com pentru detalii). Vezi mai jos secțiunea Transfer BTC.

                    Transfer BTC

                    -

                    SideShift.ai

                    -

                    SideShift.ai este un serviciu terță parte care acționează ca un schimb valutar între Monero și Bitcoin. - Noi folosim API-ul SideShift.ai pentru a integra plățile Bitcoin în Monerujo. Vezi - https://sideshift.ai și decide singur dacă acesta este un serviciu pe care dorești să îl folosești. Echipa Monerujo - nu este asociată în niciun fel cu SideShift.ai și nu te poate ajuta cu serviciile oferite de ei.

                    -

                    Rata de schimb a SideShift.ai

                    -

                    Pe ecranul cu \"Suma\" vor fi afișați parametrii serviciului SideShift.ai. Aceștia includ cursul de +

                    Exolix

                    +

                    Exolix este un serviciu terță parte care acționează ca un schimb valutar între Monero și Bitcoin. + Noi folosim API-ul Exolix pentru a integra plățile Bitcoin în Monerujo. Vezi + https://exolix.com și decide singur dacă acesta este un serviciu pe care dorești să îl folosești. Echipa Monerujo + nu este asociată în niciun fel cu Exolix și nu te poate ajuta cu serviciile oferite de ei.

                    +

                    Rata de schimb a Exolix

                    +

                    Pe ecranul cu \"Suma\" vor fi afișați parametrii serviciului Exolix. Aceștia includ cursul de schimb actual, precum și limitele superioare și inferioare ale BTC. Reține că aceste rate de schimb nu sunt garantate în acest moment.

                    -

                    Ordin SideShift.ai

                    -

                    Pe ecranul cu \"Confirm\", vei vedea ordinul actual al SideShift.ai. Acest ordin este valabil pentru +

                    Ordin Exolix

                    +

                    Pe ecranul cu \"Confirm\", vei vedea ordinul actual al Exolix. Acest ordin este valabil pentru un timp limitat - este posibil să observi o numărătoare inversă pe butonul \"Consum\". Rata de schimb poate fi diferită de cea indicată pe ecranele anterioare.

                    -

                    Cheia secretă SideShift.ai

                    -

                    Din moment ce Monerujo gestionează numai partea Monero din tranzacția ta, cheia secretă a SideShift.ai - poate fi folosită pentru a urmări partea Bitcoin a comenzii tale de pe site-ul SideShift.ai.

                    -

                    Numerotarea inversă SideShift.ai

                    -

                    În momentul în care numerotarea inversă ajunge la zero, va trebui să obții o nouă cotație de la SideShift.ai mergând +

                    Cheia secretă Exolix

                    +

                    Din moment ce Monerujo gestionează numai partea Monero din tranzacția ta, cheia secretă a Exolix + poate fi folosită pentru a urmări partea Bitcoin a comenzii tale de pe site-ul Exolix.

                    +

                    Numerotarea inversă Exolix

                    +

                    În momentul în care numerotarea inversă ajunge la zero, va trebui să obții o nouă cotație de la Exolix mergând înapoi la pasul anterior, apoi revenind la ecranul \"Confirm\".

                    ]]> Transfer BTC -

                    SideShift.ai

                    -

                    SideShift.ai este un serviciu terță parte care acționează ca un schimb valutar între Monero și Bitcoin. - Noi folosim API-ul SideShift.ai pentru a integra plățile Bitcoin în Monerujo. Vezi - https://sideshift.ai și decide singur dacă acesta este un serviciu pe care dorești să îl folosești. Echipa Monerujo - nu este asociată în niciun fel cu SideShift.ai și nu te poate ajuta cu serviciile oferite de ei.

                    -

                    Rata de schimb a SideShift.ai

                    -

                    Pe ecranul cu \"Suma\" vor fi afișați parametrii serviciului SideShift.ai. Aceștia includ cursul de +

                    Exolix

                    +

                    Exolix este un serviciu terță parte care acționează ca un schimb valutar între Monero și Bitcoin. + Noi folosim API-ul Exolix pentru a integra plățile Bitcoin în Monerujo. Vezi + https://exolix.com și decide singur dacă acesta este un serviciu pe care dorești să îl folosești. Echipa Monerujo + nu este asociată în niciun fel cu Exolix și nu te poate ajuta cu serviciile oferite de ei.

                    +

                    Rata de schimb a Exolix

                    +

                    Pe ecranul cu \"Suma\" vor fi afișați parametrii serviciului Exolix. Aceștia includ cursul de schimb actual, precum și limitele superioare și inferioare ale BTC. Reține că aceste rate de schimb nu sunt garantate în acest moment.

                    -

                    Ordin SideShift.ai

                    -

                    Pe ecranul cu \"Confirm\", vei vedea ordinul actual al SideShift.ai. Acest ordin este valabil pentru +

                    Ordin Exolix

                    +

                    Pe ecranul cu \"Confirm\", vei vedea ordinul actual al Exolix. Acest ordin este valabil pentru un timp limitat - este posibil să observi o numărătoare inversă pe butonul \"Consum\". Rata de schimb poate fi diferită de cea indicată pe ecranele anterioare.

                    -

                    Cheia secretă SideShift.ai

                    -

                    Din moment ce Monerujo gestionează numai partea Monero din tranzacția ta, cheia secretă a SideShift.ai - poate fi folosită pentru a urmări partea Bitcoin a comenzii tale de pe site-ul SideShift.ai.

                    -

                    Numerotarea inversă SideShift.ai

                    -

                    În momentul în care numerotarea inversă ajunge la zero, va trebui să obții o nouă cotație de la SideShift.ai mergând +

                    Cheia secretă Exolix

                    +

                    Din moment ce Monerujo gestionează numai partea Monero din tranzacția ta, cheia secretă a Exolix + poate fi folosită pentru a urmări partea Bitcoin a comenzii tale de pe site-ul Exolix.

                    +

                    Numerotarea inversă Exolix

                    +

                    În momentul în care numerotarea inversă ajunge la zero, va trebui să obții o nouă cotație de la Exolix mergând înapoi la pasul anterior, apoi revenind la ecranul \"Confirm\".

                    ]]>
                    diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index f5231822..af6f84a5 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -34,48 +34,48 @@ Ai introdus o adresă de %1$s.
                    - Vei trimite XMR și destinatarul va primi %1$s folosind serviciul SideShift.ai. + Vei trimite XMR și destinatarul va primi %2$s folosind serviciul %3$s. ]]>
                    - Ordin SideShift.ai + Ordin %1$s %1$s %2$s Confirmare în așteptare Plată în așteptare - Eroare SideShift.ai (%1$s) + Eroare %1$s (%2$s) %1$s trimis! Interogare … Poți trimite %1$s — %2$s %4$s.
                    - SideShift.ai îți oferă un curs de %3$s %4$s/XMR în acest moment. + %5$s îți oferă un curs de %3$s %4$s/XMR în acest moment. ]]>
                    - Balanță: %2$s %3$s (%1$s XMR) + Balanță: %1$s XMR (~%2$s %3$s) ✔ Payment ID integrat Se pregătește tranzacția - Creearea ordinului SideShift.ai - Interogare ordin SideShift.ai + Creearea ordinului + Interogare ordin Pregătirea tranzacției Monero - Interogare parametrii SideShift.ai + Interogare parametrii - EROARE SideShift.ai + EROARE Cod: %1$d Atinge pentru reîncercare Pff.. ne-am blocat acum! - Oh, serviciul SideShift.ai este momentan indisponibil! + Oh, serviciul %1$s este momentan indisponibil! %1$s %3$s = %2$s XMR (Rată: %1$s %2$s/XMR) - Vizitează SideShift.ai pentru suport & interogare - Cheia secretă \nSideShift.ai - Cheia secretă SideShift.ai + Vizitează %1$s pentru suport & interogare + Cheia secretă \n%1$s + Cheia secretă %1$s Destinație adresă %1$s Sumă @@ -360,7 +360,7 @@ Păstrează semnătura ta în singuranță Semnătura oferă accces deplin celui ce o are. Dacă o pierzi, nu te putem ajuta să o recuperezi și pierzi dulcii tăi moneroj. Trimite Cripto - Monerujo are integrat serviciul SideShift.ai. Doar inserează sau scanează o adresă BTC, LTC, ETH, DASH sau DOGE și vei trimite aceste monede cu XMR. + Monerujo are integrat serviciul exchange. Doar inserează sau scanează o adresă BTC, LTC, ETH, TRXUSDT sau SOL și vei trimite aceste monede cu XMR. Noduri, cum îți dorești Nodurile te conectează la rețeaua Monero. Alege între noduri publice sau fii un cypherpunk și pornește unul propriu. Trimite cu amprentă @@ -392,7 +392,7 @@ Te rugăm să introduci sau scanezi o adresă %1$s.
                    - Vei trimite XMR și destinatarul va primi %2$s folosind serviciul SideShift.ai. + Vei trimite XMR și destinatarul va primi %2$s folosind serviciul %3$s. ]]>
                    Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-ru/about.xml b/app/src/main/res/values-ru/about.xml index 6841f31f..bbf8e78a 100644 --- a/app/src/main/res/values-ru/about.xml +++ b/app/src/main/res/values-ru/about.xml @@ -34,8 +34,8 @@ Перейдите по адресу https://coinmarketcap.com/privacy для получения подробной информации о том, как собираются ваши персональные данные в запросах.

                    Если вы используете приложение для оплаты по адресам BTC, - вы будете использовать сервис SideShift.ai. Их политика конфиденциальности подробно - изложена на вебсайте https://sideshift.ai/. Monerujo отправляет им адрес + вы будете использовать сервис Exolix. Их политика конфиденциальности подробно + изложена на вебсайте https://exolix.com/privacy. Monerujo отправляет им адрес назначения BTC и сумму. Ваш IP также указывается.

                    Разрешения, необходимые приложению

                      diff --git a/app/src/main/res/values-ru/help.xml b/app/src/main/res/values-ru/help.xml index 664b9daf..da2c0635 100644 --- a/app/src/main/res/values-ru/help.xml +++ b/app/src/main/res/values-ru/help.xml @@ -151,52 +151,52 @@
                    • OpenAlias для XMR или BTC
                    • BTC адрес
                    • - Обращаем ваше внимание, что отправка BTC выполняется через сервис SideShift.ai (посетите https://sideshift.ai + Обращаем ваше внимание, что отправка BTC выполняется через сервис Exolix (посетите https://exolix.com для получения доп. информации). Ознакомьтесь с разделом об отправке BTC ниже.

                      Отправка BTC

                      -

                      SideShift.ai

                      -

                      SideShift.ai является сторонним сервисом, который помогает осуществлять обмен Monero на Bitcoin. - Мы используем API службы SideShift.ai для включения платежей с использованием Bitcoin в Monerujo. - Пожалуйста, посетите https://sideshift.ai, и решите, хотите ли вы использовать эту возможность. - Команда Monerujo не связана с SideShift.ai и не может помочь вам в работе с этой службой.

                      -

                      Курс обмена SideShift.ai

                      -

                      На экране \"Сумма\" отображаются текущие параметры службы SideShift.ai. +

                      Exolix

                      +

                      Exolix является сторонним сервисом, который помогает осуществлять обмен Monero на Bitcoin. + Мы используем API службы Exolix для включения платежей с использованием Bitcoin в Monerujo. + Пожалуйста, посетите https://exolix.com, и решите, хотите ли вы использовать эту возможность. + Команда Monerujo не связана с Exolix и не может помочь вам в работе с этой службой.

                      +

                      Курс обмена Exolix

                      +

                      На экране \"Сумма\" отображаются текущие параметры службы Exolix. Здесь также отображается обменный курс, верхний и нижний предел BTC. Необходимо отметить, что на данном этапе курс не гарантируется.

                      -

                      Заказ SideShift.ai

                      -

                      На экране \"Подтверждение\" можно увидеть фактический заказ SideShift.ai. Этот заказ +

                      Заказ Exolix

                      +

                      На экране \"Подтверждение\" можно увидеть фактический заказ Exolix. Этот заказ действителен в течение ограниченного времени. Обратный отсчёт можно увидеть на кнопке траты \"Трата\". Курс обмена может отличаться от того, что был показан на предыдущих экранах.

                      -

                      Секретный ключ SideShift.ai

                      +

                      Секретный ключ Exolix

                      Так как Monerujo отвечает за ту часть транзакции, которая связана с Monero, для отслеживания вашего заказа, которая связана с Bitcoin, можно использовать секретный ключ на домашней странице - SideShift.ai.

                      -

                      Обратный отсчёт SideShift.ai

                      -

                      Как только обратный отсчёт достигнет нулевой точки, вам понадобится получить от SideShift.ai новое + Exolix.

                      +

                      Обратный отсчёт Exolix

                      +

                      Как только обратный отсчёт достигнет нулевой точки, вам понадобится получить от Exolix новое предложение, вернувшись к предыдущему шагу, а затем к экрану \"Подтверждение\".

                      ]]> Отправка BTC -

                      SideShift.ai

                      -

                      SideShift.ai является сторонним сервисом, который помогает осуществлять обмен Monero на Bitcoin. - Мы используем API службы SideShift.ai для включения платежей с использованием Bitcoin в Monerujo. - Пожалуйста, посетите https://sideshift.ai, и решите, хотите ли вы использовать эту возможность. - Команда Monerujo не связана с SideShift.ai и не может помочь вам в работе с этой службой.

                      -

                      Курс обмена SideShift.ai

                      -

                      На экране \"Сумма\" отображаются текущие параметры службы SideShift.ai. +

                      Exolix

                      +

                      Exolix является сторонним сервисом, который помогает осуществлять обмен Monero на Bitcoin. + Мы используем API службы Exolix для включения платежей с использованием Bitcoin в Monerujo. + Пожалуйста, посетите https://exolix.com, и решите, хотите ли вы использовать эту возможность. + Команда Monerujo не связана с Exolix и не может помочь вам в работе с этой службой.

                      +

                      Курс обмена Exolix

                      +

                      На экране \"Сумма\" отображаются текущие параметры службы Exolix. Здесь также отображается обменный курс, верхний и нижний предел BTC. Необходимо отметить, что на данном этапе курс не гарантируется.

                      -

                      Заказ SideShift.ai

                      -

                      На экране \"Подтверждение\" можно увидеть фактический заказ SideShift.ai. Этот заказ +

                      Заказ Exolix

                      +

                      На экране \"Подтверждение\" можно увидеть фактический заказ Exolix. Этот заказ действителен в течение ограниченного времени. Обратный отсчёт можно увидеть на кнопке траты \"Трата\". Курс обмена может отличаться от того, что был показан на предыдущих экранах.

                      -

                      Секретный ключ SideShift.ai

                      +

                      Секретный ключ Exolix

                      Так как Monerujo отвечает за ту часть транзакции, которая связана с Monero, для отслеживания вашего заказа, которая связана с Bitcoin, можно использовать секретный ключ на домашней странице - SideShift.ai.

                      -

                      Обратный отсчёт SideShift.ai

                      -

                      Как только обратный отсчёт достигнет нулевой точки, вам понадобится получить от SideShift.ai новое + Exolix.

                      +

                      Обратный отсчёт Exolix

                      +

                      Как только обратный отсчёт достигнет нулевой точки, вам понадобится получить от Exolix новое предложение, вернувшись к предыдущему шагу, а затем к экрану \"Подтверждение\".

                      ]]>
                      diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 996270f4..5db97bf2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -35,49 +35,49 @@ Вы ввели %1$s адрес.
                      - Отправляйте XMR, получатель получит %1$s, используя сервис SideShift.ai + Отправляйте XMR, получатель получит %2$s, используя сервис %3$s ]]>
                      - Заказ SideShift.ai + Заказ %1$s %1$s %2$s Ожидание подтверждения Ожидание платежа - Ошибка SideShift.ai (%1$s) + Ошибка %1$s (%2$s) %1$s успешно отправлены! Запрос … Вы можете отправить %1$s — %2$s %4$s.
                      - SideShift.ai устанавливает курс обмена %3$s %4$s/XMR в данный момент. + %5$s устанавливает курс обмена %3$s %4$s/XMR в данный момент. ]]>
                      - Баланс: %2$s %3$s (%1$s XMR) + Баланс: %1$s XMR (~%2$s %3$s) ✔ Интегрированный ID платежа Подготовка транзакции - Создание заказа SideShift.ai - Запрос заказа SideShift.ai + Создание заказа + Запрос заказа Подготовка транзакции Monero - Запрос параметров SideShift.ai + Запрос параметров - SideShift.ai ОШИБКА + ОШИБКА Код: %1$d Нажмите, чтобы повторить попытку Теперь мы застряли здесь! - Ой-ой! Кажется SideShift.ai недоступен в данный момент! + Ой-ой! Кажется %1$s недоступен в данный момент! %1$s %3$s = %2$s XMR (Курс: %1$s %2$s/XMR) - Посетите SideShift.ai для получения помощи & - Секретный ключ\nSideShift.ai - SideShift.ai секретный ключ + Посетите %1$s для получения помощи & + Секретный ключ\n%1$s + %1$s секретный ключ Адрес получателя %1$s Сумма @@ -365,7 +365,7 @@ Храните свои ключи в безопасности Секретная фраза дает полный доступ к кошельку. Если вы её потеряете, мы не сможем её восстановить и вы потеряете ваши moneroj. Отправка других криптовалют - Monerujo имеет поддержку SideShift.ai. Просто вставьте (или просканируйте) адрес BTC, LTC, ETH, DASH или DOGE и вы будете отправлять эти криптовалюты, тратя XMR. + Monerujo имеет поддержку exchange. Просто вставьте (или просканируйте) адрес BTC, LTC, ETH, TRXUSDT или SOL и вы будете отправлять эти криптовалюты, тратя XMR. Узлы, узлы, узлы… Узлы позволяют подключаться к сети Monero. Выбирайте между общедоступными узлами или используйте свой собственный для безопасности IP адреса. Отправка с помощью отпечатка пальца @@ -397,7 +397,7 @@ Введите или просканируйте адрес %1$s.
                      - Вы отправите XMR, а получатель получит %2$s с помощью серсива SideShift.ai. + Вы отправите XMR, а получатель получит %2$s с помощью серсива %3$s. ]]>
                      Необходим Tor \u00A0ОЖИДАНИЕ УЗЛА\u00A0 Необходимо выбрать "Allow Background Starts" в настройках Orbot для использования Tor! - SideShift.ai не поддерживает Tor.\nОтключите Tor для обмена XMR. + %1$s не поддерживает Tor.\nОтключите Tor для обмена XMR. Шифрование фразы (ЭКСПЕРЕМЕНТАЛЬНО) Смещение фразы (необязательно) diff --git a/app/src/main/res/values-sk/about.xml b/app/src/main/res/values-sk/about.xml index ff6e9ede..e5755b60 100644 --- a/app/src/main/res/values-sk/about.xml +++ b/app/src/main/res/values-sk/about.xml @@ -27,8 +27,8 @@

                      Iné osobné data nie sú zbierané a spracovávané.

                      Pokiaľ používaš (voliteľnú) funkciu zmenárne, monerujo vyhľadá výmenný kurz cez verejné API portálu coinmarketcap.com. Pre viac detailov pozri zásady ochrany osobných údajov na https://coinmarketcap.com/privacy kde je uvedené aké dáta zbierajú

                      -

                      Pokiaľ používaš aplikáciu pre platby na BTC adresy, využívaš služby SideShift.ai. - Pre viac detailov pozri zásady ochrany osobných údajov na https://sideshift.ai/ . Monerujo im posiela cieľovú BTC +

                      Pokiaľ používaš aplikáciu pre platby na BTC adresy, využívaš služby Exolix. + Pre viac detailov pozri zásady ochrany osobných údajov na https://exolix.com/privacy . Monerujo im posiela cieľovú BTC addresu príjemcu a posielané množstvo. Tvoju IP bude tiež možné zaznamenať.

                      Povolenia

                        diff --git a/app/src/main/res/values-sk/help.xml b/app/src/main/res/values-sk/help.xml index 7d4910a7..ea75b84d 100644 --- a/app/src/main/res/values-sk/help.xml +++ b/app/src/main/res/values-sk/help.xml @@ -153,46 +153,46 @@
                      • OpenAlias pre XMR či BTC
                      • BTC adresu
                      • - Nezabúdajte, že posielanie BTC prebieha cez službu SideShift.ai (detaily na https://sideshift.ai). Pozri sekciu nižšie o posielaní BTC

                        + Nezabúdajte, že posielanie BTC prebieha cez službu Exolix (detaily na https://exolix.com). Pozri sekciu nižšie o posielaní BTC

                        Posielanie BTC

                        -

                        SideShift.ai

                        -

                        SideShift.ai je služba tretej strany, ktorá umožňuje zámenu z Monero na Bitcoin. - Používame SideShift.ai API na integráciu Bitcoin platieb do Monerujo. Prosím mrkni na - https://sideshift.ai a rozhodni sa sám, či je to naozaj služba, ktorú chceš používať. - Tím Monerujo nie je nijako spojený so službou SideShift.ai a teda nemôže pomôcť s prípadnými problémami s touto službou.

                        -

                        SideShift.ai Výmenný Kurz

                        -

                        Na obrazovke \"Množstvo\" uvidíš aktuálne parametre služby SideShift.ai, vrátane aktuálneho kurzu BTC, hornej a dolnej hranice. +

                        Exolix

                        +

                        Exolix je služba tretej strany, ktorá umožňuje zámenu z Monero na Bitcoin. + Používame Exolix API na integráciu Bitcoin platieb do Monerujo. Prosím mrkni na + https://exolix.com a rozhodni sa sám, či je to naozaj služba, ktorú chceš používať. + Tím Monerujo nie je nijako spojený so službou Exolix a teda nemôže pomôcť s prípadnými problémami s touto službou.

                        +

                        Exolix Výmenný Kurz

                        +

                        Na obrazovke \"Množstvo\" uvidíš aktuálne parametre služby Exolix, vrátane aktuálneho kurzu BTC, hornej a dolnej hranice. Podotýkame, že tento kurz nie je garantovaný.

                        -

                        SideShift.ai Objednávka

                        -

                        Na obrazovke \"Potvrdiť\", uvidíš aktuálnu objednávku v SideShift.ai. Táto objednávka je platná iba obmedzený čas - ako si môžeš všimnúť odpočítavanie na tlačítku \"Minúť\". +

                        Exolix Objednávka

                        +

                        Na obrazovke \"Potvrdiť\", uvidíš aktuálnu objednávku v Exolix. Táto objednávka je platná iba obmedzený čas - ako si môžeš všimnúť odpočítavanie na tlačítku \"Minúť\". Výmenný kurz sa môže líšiť od toho, ktorý bol na predošlých obrazovkách.

                        -

                        SideShift.ai Tajný Kľúč

                        +

                        Exolix Tajný Kľúč

                        Keďže Monerujo dbá len na tú časť transakcie, ktorá pracuje s Monero, - tento SideShift.ai Tajný Kľúč sa môže využívať na sledovanie Bitcoinovej časti transakcie a objednávky - na domovskej stránke SideShift.ai

                        -

                        SideShift.ai Odpočítavanie!

                        -

                        Akonáhle odpočítavanie dosiahne nulu, budeš potrebovať nový kľúč z SideShift.ai návratom na predchádzajúci krok a obrazovku \"Potvrdiť\" .

                        + tento Exolix Tajný Kľúč sa môže využívať na sledovanie Bitcoinovej časti transakcie a objednávky + na domovskej stránke Exolix

                        +

                        Exolix Odpočítavanie!

                        +

                        Akonáhle odpočítavanie dosiahne nulu, budeš potrebovať nový kľúč z Exolix návratom na predchádzajúci krok a obrazovku \"Potvrdiť\" .

                        ]]> Posielanie BTC -

                        SideShift.ai

                        -

                        SideShift.ai je služba tretej strany, ktorá umožňuje zámenu z Monero na Bitcoin. - Používame SideShift.ai API na integráciu Bitcoin platieb do Monerujo. Prosím mrkni na - https://sideshift.ai a rozhodni sa sám, či je to naozaj služba, ktorú chceš používať. - Tím Monerujo nie je nijako spojený so službou SideShift.ai a teda nemôže pomôcť s prípadnými problémami s touto službou.

                        -

                        SideShift.ai Výmenný Kurz

                        -

                        Na obrazovke \"Množstvo\" uvidíš aktuálne parametre služby SideShift.ai, vrátane aktuálneho kurzu BTC, hornej a dolnej hranice. +

                        Exolix

                        +

                        Exolix je služba tretej strany, ktorá umožňuje zámenu z Monero na Bitcoin. + Používame Exolix API na integráciu Bitcoin platieb do Monerujo. Prosím mrkni na + https://exolix.com a rozhodni sa sám, či je to naozaj služba, ktorú chceš používať. + Tím Monerujo nie je nijako spojený so službou Exolix a teda nemôže pomôcť s prípadnými problémami s touto službou.

                        +

                        Exolix Výmenný Kurz

                        +

                        Na obrazovke \"Množstvo\" uvidíš aktuálne parametre služby Exolix, vrátane aktuálneho kurzu BTC, hornej a dolnej hranice. Podotýkame, že tento kurz nie je garantovaný.

                        -

                        SideShift.ai Objednávka

                        -

                        Na obrazovke \"Potvrdiť\", uvidíš aktuálnu objednávku v SideShift.ai. Táto objednávka je platná iba obmedzený čas - ako si môžeš všimnúť odpočítavanie na tlačítku \"Minúť\". +

                        Exolix Objednávka

                        +

                        Na obrazovke \"Potvrdiť\", uvidíš aktuálnu objednávku v Exolix. Táto objednávka je platná iba obmedzený čas - ako si môžeš všimnúť odpočítavanie na tlačítku \"Minúť\". Výmenný kurz sa môže líšiť od toho, ktorý bol na predošlých obrazovkách.

                        -

                        SideShift.ai Tajný Kľúč

                        +

                        Exolix Tajný Kľúč

                        Keďže Monerujo dbá len na tú časť transakcie, ktorá pracuje s Monero, - tento SideShift.ai Tajný Kľúč sa môže využívať na sledovanie Bitcoinovej časti transakcie a objednávky - na domovskej stránke SideShift.ai

                        -

                        SideShift.ai Odpočítavanie!

                        -

                        Akonáhle odpočítavanie dosiahne nulu, budeš potrebovať nový kľúč z SideShift.ai návratom na predchádzajúci krok a obrazovku \"Potvrdiť\" .

                        + tento Exolix Tajný Kľúč sa môže využívať na sledovanie Bitcoinovej časti transakcie a objednávky + na domovskej stránke Exolix

                        +

                        Exolix Odpočítavanie!

                        +

                        Akonáhle odpočítavanie dosiahne nulu, budeš potrebovať nový kľúč z Exolix návratom na predchádzajúci krok a obrazovku \"Potvrdiť\" .

                        ]]>
                        Vložil si %1$s adresu.
                        - Pošleš XMR a adresát dostane %1$s cez službu SideShift.ai. + Pošleš XMR a adresát dostane %2$s cez službu %3$s. ]]>
                        - SideShift.ai Objednávka + %1$s Objednávka %1$s %2$s Čaká na Potvrdenie Čakajúca Platba - SideShift.ai Chyba (%1$s) + %1$s Chyba (%2$s) %1$s Odoslané! Zisťujem … Môžeš poslať %1$s — %2$s %4$s.
                        - SideShift.ai ti dáva výmenný kurz of %3$s %4$s/XMR práve teraz. + %5$s ti dáva výmenný kurz of %3$s %4$s/XMR práve teraz. ]]>
                        - Zostatok: %2$s %3$s (%1$s XMR) + Zostatok: %1$s XMR (~%2$s %3$s) ✔ Payment ID integrované Pripravujem transakciu - Vytváram objednávku na SideShift.ai - Pýtam sa na objednávku SideShift.ai + Vytváram objednávku + Pýtam sa na objednávku Pripravujem Monero transakciu - Posielam SideShift.ai parametre + Posielam parametre - CHYBA SideShift.ai + CHYBA Kód chyby: %1$d Klepni pre opakovanie Uviazli sme tu! - Myslím, že služba SideShift.ai nie je momentálne dostupná! + Myslím, že služba %1$s nie je momentálne dostupná! %1$s %3$s = %2$s XMR (Kurz: %1$s %2$s/XMR) - Navštív SideShift.ai pre podporu & tracking - Tajný kľúč\nSideShift.ai - SideShift.ai Tajný kľúč + Navštív %1$s pre podporu & tracking + Tajný kľúč\n%1$s + %1$s Tajný kľúč Cieľová %1$s Adresa Čiastka @@ -362,7 +362,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -394,7 +394,7 @@ Please enter or scan a %1$s address.
                        - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
                        Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-sr/about.xml b/app/src/main/res/values-sr/about.xml index 46992513..2ba6a2ea 100644 --- a/app/src/main/res/values-sr/about.xml +++ b/app/src/main/res/values-sr/about.xml @@ -34,8 +34,8 @@ rate through the public API of coinmarketcap.com. See their privacy policy at https://coinmarketcap.com/privacy for details on how data in your requests is collected.

                        -

                        If you use the app to pay to BTC addresses, you will be using the SideShift.ai service. - See their privacy policy at https://sideshift.ai/ for details. Monerujo send them the BTC +

                        If you use the app to pay to BTC addresses, you will be using the Exolix service. + See their privacy policy at https://exolix.com/privacy for details. Monerujo send them the BTC destination address and amount. Your IP will also be collectable.

                        App Permissions

                          diff --git a/app/src/main/res/values-sr/help.xml b/app/src/main/res/values-sr/help.xml index 8625bb9a..feda23f3 100644 --- a/app/src/main/res/values-sr/help.xml +++ b/app/src/main/res/values-sr/help.xml @@ -160,50 +160,50 @@
                        • an OpenAlias for XMR or BTC
                        • a BTC address
                        • - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

                          Sending BTC

                          -

                          SideShift.ai

                          -

                          SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin. - We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out - https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo - Team is not associated with SideShift.ai and cannot help you with their service.

                          -

                          SideShift.ai Exchange Rate

                          -

                          On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These +

                          Exolix

                          +

                          Exolix is a third party service which acts as an exchange from Monero to Bitcoin. + We use the Exolix API to integrate Bitcoin payments into Monerujo. Please check out + https://exolix.com and decide for yourself if this is something you want to use. The Monerujo + Team is not associated with Exolix and cannot help you with their service.

                          +

                          Exolix Exchange Rate

                          +

                          On the \"Amount\" screen you will be shown the current parameters of the Exolix service. These include the current exchange rate as well as upper and lower BTC limits. Note that this rate is not guaranteed at this point.

                          -

                          SideShift.ai Order

                          -

                          On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for +

                          Exolix Order

                          +

                          On the \"Confirm\" screen, you will see the actual Exolix order. This order is valid for a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may be different to the indicative one shown on previous screens.

                          -

                          SideShift.ai Secret Key

                          -

                          Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key - can be used to track the Bitcoin part of your order on the SideShift.ai homepage.

                          -

                          SideShift.ai Countdown!

                          -

                          Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the +

                          Exolix Secret Key

                          +

                          Since Monerujo only handles the Monero part of your transaction your Exolix secret key + can be used to track the Bitcoin part of your order on the Exolix homepage.

                          +

                          Exolix Countdown!

                          +

                          Once the countdown reaches zero, you need to get a new quote from Exolix by going back to the previous step and then coming back to the \"Confirm\" screen.

                          ]]> Sending BTC -

                          SideShift.ai

                          -

                          SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin. - We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out - https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo - Team is not associated with SideShift.ai and cannot help you with their service.

                          -

                          SideShift.ai Exchange Rate

                          -

                          On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These +

                          Exolix

                          +

                          Exolix is a third party service which acts as an exchange from Monero to Bitcoin. + We use the Exolix API to integrate Bitcoin payments into Monerujo. Please check out + https://exolix.com and decide for yourself if this is something you want to use. The Monerujo + Team is not associated with Exolix and cannot help you with their service.

                          +

                          Exolix Exchange Rate

                          +

                          On the \"Amount\" screen you will be shown the current parameters of the Exolix service. These include the current exchange rate as well as upper and lower BTC limits. Note that this rate is not guaranteed at this point.

                          -

                          SideShift.ai Order

                          -

                          On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for +

                          Exolix Order

                          +

                          On the \"Confirm\" screen, you will see the actual Exolix order. This order is valid for a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may be different to the indicative one shown on previous screens.

                          -

                          SideShift.ai Secret Key

                          -

                          Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key - can be used to track the Bitcoin part of your order on the SideShift.ai homepage.

                          -

                          SideShift.ai Countdown!

                          -

                          Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the +

                          Exolix Secret Key

                          +

                          Since Monerujo only handles the Monero part of your transaction your Exolix secret key + can be used to track the Bitcoin part of your order on the Exolix homepage.

                          +

                          Exolix Countdown!

                          +

                          Once the countdown reaches zero, you need to get a new quote from Exolix by going back to the previous step and then coming back to the \"Confirm\" screen.

                          ]]>
                          diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index bb33ca36..5ab6d0be 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -35,48 +35,48 @@ Ubacio/la si %1$s adresu.
                          - You'će poslati XMR a primalac će dobiti %1$s koristeći SideShift.ai servis. + You'će poslati XMR a primalac će dobiti %2$s koristeći %3$s servis. ]]>
                          - SideShift.ai Nalog + %1$s Nalog %1$s %2$s Potvrda u toku Plaćanje u toku - SideShift.ai Greška (%1$s) + %1$s Greška (%2$s) %1$s Poslato! Ispitivanje … Možeš poslati %1$s — %2$s %4$s.
                          - SideShift.ai daje ti devizni kurs od %3$s %4$s/XMR trenutno. + %5$s daje ti devizni kurs od %3$s %4$s/XMR trenutno. ]]>
                          - Stanje: %2$s %3$s (%1$s XMR) + Stanje: %1$s XMR (~%2$s %3$s) ✔ ID plaćanja integrisan Priprema tvoje transakcije - Kreiranje SideShift.ai Nalog - Ispitivanje SideShift.ai Nalog + Kreiranje Nalog + Ispitivanje Nalog Pripremanje Monero transakcije - Ispitivanje SideShift.ai parametara + Ispitivanje parametara - SideShift.ai GREŠKA + GREŠKA Kod: %1$d Takni za novi pokušaj Sada se zaglavismo! - Uh, SideShift.ai izgleda da sad nije dostupan! + Uh, %1$s izgleda da sad nije dostupan! %1$s %3$s = %2$s XMR (Rate: %1$s %2$s/XMR) - Poseti SideShift.ai za bekap & praćenje - Tajna šifra\nSideShift.ai - SideShift.ai Tajna šifra + Poseti %1$s za bekap & praćenje + Tajna šifra\n%1$s + %1$s Tajna šifra Odredište %1$s adrese Suma @@ -360,7 +360,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -392,7 +392,7 @@ Please enter or scan a %1$s address.
                          - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
                          Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-sv/about.xml b/app/src/main/res/values-sv/about.xml index d0e1a703..f40701e9 100644 --- a/app/src/main/res/values-sv/about.xml +++ b/app/src/main/res/values-sv/about.xml @@ -34,8 +34,8 @@ Läs deras sekretesspolicy på https://www.kraken.com/legal/privacy för detaljer om hur data i dina begär är samlade (speciellt sektionen "Information We Collect Automatically").

                          -

                          Om du använder appen för att skicka pengar till BTC-adresser, behöver du använda tjänsten SideShift.ai. - Läs deras sekretesspolicy för detaljer på https://sideshift.ai/. Monerujo skickar de BTC- +

                          Om du använder appen för att skicka pengar till BTC-adresser, behöver du använda tjänsten Exolix. + Läs deras sekretesspolicy för detaljer på https://exolix.com/privacy. Monerujo skickar de BTC- destination adressen och mängden. Din IP kan även samlas.

                          App-behörigheter

                            diff --git a/app/src/main/res/values-sv/help.xml b/app/src/main/res/values-sv/help.xml index 851c6462..57297a63 100644 --- a/app/src/main/res/values-sv/help.xml +++ b/app/src/main/res/values-sv/help.xml @@ -136,50 +136,50 @@
                          • an OpenAlias for XMR or BTC
                          • a BTC address
                          • - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

                            Skicka BTC

                            -

                            SideShift.ai

                            -

                            SideShift.ai är en tredjeparts tjänst som byter ut Monero mot Bitcoin. Vi använder SideShift.ai API:n - för att integrera Bitcoin betalningar i Monerujo. Vänligen besök https://sideshift.ai och bestäm +

                            Exolix

                            +

                            Exolix är en tredjeparts tjänst som byter ut Monero mot Bitcoin. Vi använder Exolix API:n + för att integrera Bitcoin betalningar i Monerujo. Vänligen besök https://exolix.com och bestäm för dig själv om det är någonting du vill använda. Monerujo laget är inte associerad med - SideShift.ai och kan inte hjälpa dig med deras tjänst.

                            -

                            SideShift.ai Växelkurs

                            -

                            På \"Mängd\"skärmen ser du de nuvarande parametrarna av SideShift.ai tjänsten. Dessa innehåller den + Exolix och kan inte hjälpa dig med deras tjänst.

                            +

                            Exolix Växelkurs

                            +

                            På \"Mängd\"skärmen ser du de nuvarande parametrarna av Exolix tjänsten. Dessa innehåller den nuvarande växelkursen samt de övre och lägre BTC gränserna. Vänligen notera att denna kursen inte är garanterad just nu.

                            -

                            SideShift.ai Beställning

                            -

                            På \"Bekräfta\" skärmen, kommer du att se den faktiska SideShift.ai beställningen. Den här beställningen +

                            Exolix Beställning

                            +

                            På \"Bekräfta\" skärmen, kommer du att se den faktiska Exolix beställningen. Den här beställningen är giltig under en begränsad tid - du kan se en nedräkning på \"Spendera\" knappen. Växelkursen kan vara annorlunda från den indikativa, visad på tidigare skärmar..

                            -

                            SideShift.ai Privatnyckel

                            -

                            Eftersom att Monerujo bara tar hand om Monero delen av din transaktion, kan din SideShift.ai - privatnyckel användas för att spåra Bitcoin delen av din beställning på SideShift.ai sidan.

                            -

                            SideShift.ai Nedräkning!

                            -

                            När nedräkningen når noll, behöver du skaffa ett nytt kostnadsförslag från SideShift.ai genom att gå +

                            Exolix Privatnyckel

                            +

                            Eftersom att Monerujo bara tar hand om Monero delen av din transaktion, kan din Exolix + privatnyckel användas för att spåra Bitcoin delen av din beställning på Exolix sidan.

                            +

                            Exolix Nedräkning!

                            +

                            När nedräkningen når noll, behöver du skaffa ett nytt kostnadsförslag från Exolix genom att gå tillbaka till den tidigare skärmen och sedan gå till \"Bekräfta\"skärmen.

                            ]]> Skicka BTC -

                            SideShift.ai

                            -

                            SideShift.ai är en tredjeparts tjänst som byter ut Monero mot Bitcoin. Vi använder SideShift.ai API:n - för att integrera Bitcoin betalningar i Monerujo. Vänligen besök https://sideshift.ai och bestäm +

                            Exolix

                            +

                            Exolix är en tredjeparts tjänst som byter ut Monero mot Bitcoin. Vi använder Exolix API:n + för att integrera Bitcoin betalningar i Monerujo. Vänligen besök https://exolix.com och bestäm för dig själv om det är någonting du vill använda. Monerujo laget är inte associerad med - SideShift.ai och kan inte hjälpa dig med deras tjänst.

                            -

                            SideShift.ai Växelkurs

                            -

                            På \"Mängd\"skärmen ser du de nuvarande parametrarna av SideShift.ai tjänsten. Dessa innehåller den + Exolix och kan inte hjälpa dig med deras tjänst.

                            +

                            Exolix Växelkurs

                            +

                            På \"Mängd\"skärmen ser du de nuvarande parametrarna av Exolix tjänsten. Dessa innehåller den nuvarande växelkursen samt de övre och lägre BTC gränserna. Vänligen notera att denna kursen inte är garanterad just nu.

                            -

                            SideShift.ai Beställning

                            -

                            På \"Bekräfta\" skärmen, kommer du att se den faktiska SideShift.ai beställningen. Den här beställningen +

                            Exolix Beställning

                            +

                            På \"Bekräfta\" skärmen, kommer du att se den faktiska Exolix beställningen. Den här beställningen är giltig under en begränsad tid - du kan se en nedräkning på \"Spendera\" knappen. Växelkursen kan vara annorlunda från den indikativa, visad på tidigare skärmar..

                            -

                            SideShift.ai Privatnyckel

                            -

                            Eftersom att Monerujo bara tar hand om Monero delen av din transaktion, kan din SideShift.ai - privatnyckel användas för att spåra Bitcoin delen av din beställning på SideShift.ai sidan.

                            -

                            SideShift.ai Nedräkning!

                            -

                            När nedräkningen når noll, behöver du skaffa ett nytt kostnadsförslag från SideShift.ai genom att gå +

                            Exolix Privatnyckel

                            +

                            Eftersom att Monerujo bara tar hand om Monero delen av din transaktion, kan din Exolix + privatnyckel användas för att spåra Bitcoin delen av din beställning på Exolix sidan.

                            +

                            Exolix Nedräkning!

                            +

                            När nedräkningen når noll, behöver du skaffa ett nytt kostnadsförslag från Exolix genom att gå tillbaka till den tidigare skärmen och sedan gå till \"Bekräfta\"skärmen.

                            ]]>
                            diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9061d8c7..bc5f7398 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -35,48 +35,48 @@ Du har angivit en %1$s-adress.
                            - Du kommer att skicka XMR och mottagaren får %1$s via tjänsten SideShift.ai. + Du kommer att skicka XMR och mottagaren får %2$s via tjänsten %3$s. ]]>
                            - SideShift.ai-beställning + %1$s-beställning %1$s %2$s Väntar på bekräftelse Väntar på betalning - SideShift.ai-fel (%1$s) + %1$s-fel (%2$s) %1$s skickades! Frågar … Du kan skicka %1$s — %2$s %4$s.
                            - SideShift.ai ger dig just nu en växelkurs på %3$s %4$s/XMR. + %5$s ger dig just nu en växelkurs på %3$s %4$s/XMR. ]]>
                            - Saldo: %2$s %3$s (%1$s XMR) + Saldo: %1$s XMR (~%2$s %3$s) ✔ Betalnings-ID integrerat Förbereder din transaktion - Skapar SideShift.ai-beställning - Frågar SideShift.ai-beställningen + Skapar beställning + Frågar beställningen Förbereder Monero-transaktion - Frågar SideShift.ai-parametrar + Frågar parametrar - SideShift.ai-FEL + FEL Kod: %1$d Tryck för att försöka igen Nu har vi kört fast! - Åh nej, SideShift.ai verkar inte vara tillgänglig just nu! + Åh nej, %1$s verkar inte vara tillgänglig just nu! %1$s %3$s = %2$s XMR (Kurs: %1$s %2$s/XMR) - Besök SideShift.ai för support & spårning - Hemlig nyckel\nSideShift.ai - SideShift.ai hemlig nyckel + Besök %1$s för support & spårning + Hemlig nyckel\n%1$s + %1$s hemlig nyckel Måladress för %1$s Belopp @@ -352,7 +352,7 @@ Håll dina seed i säkert förvar. Seed ger full åtkomst till den som har den. Om du förlorar det, kan vi inte hjälpa dig och du förlorar dina kära moneroj. Skicka krypto - Monerujo har SideShift.ai support inbyggt. Bara klistra in eller scanna en BTC, LTC, ETH, DASH or DOGE address och du skickar dessa krypto genom att spendera XMR. + Monerujo har exchange support inbyggt. Bara klistra in eller scanna en BTC, LTC, ETH, TRXUSDT or SOL address och du skickar dessa krypto genom att spendera XMR. Noder, på ditt sätt. Noder ansluter dig till Monero-nätverket. Välj mellan offentliga noder eller gå all-in "cypherpunk" med din egen. Skicka med fingeravtryck @@ -384,7 +384,7 @@ Please enter or scan a %1$s address.
                            - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
                            Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-ta/about.xml b/app/src/main/res/values-ta/about.xml index 8ce3c82f..feb61607 100644 --- a/app/src/main/res/values-ta/about.xml +++ b/app/src/main/res/values-ta/about.xml @@ -30,8 +30,8 @@

                            நீங்கள் மாற்றுகை (விரும்பினால்) செயல்பாட்டைப் பயன்படுத்தும்போது, monerujo ஆனது coinmarketcap.com இன் பொது API மூலம் மாற்றுகை விலையைக் கொணர்கிறது. உங்கள் கோரலில் உள்ள தரவு எவ்வாறு சேகரிக்கப்படுகிறது என்பதை அறிந்துகொள்ள https://coinmarketcap.com/privacy என்னும் அவர்கள் தனியுரிமை கொள்கை பக்கத்தைப் பார்க்கவும்.

                            -

                            இந்த செயலியை ஒரு BTC முகவரிக்குப் பணம் செலுத்தப் பயன்படுத்தினால், நீங்கள் அதற்கு SideShift.ai சேவையைப் பயன்படுத்த நேரிடும். - மேலும் விவரங்களுக்கு https://sideshift.ai/ என்னும் தளத்தில் அவர்கள் தனியுரிமை கொள்கையைக் காணவும். BTC சேருமிட முகவரி மற்றும் தொகையை +

                            இந்த செயலியை ஒரு BTC முகவரிக்குப் பணம் செலுத்தப் பயன்படுத்தினால், நீங்கள் அதற்கு Exolix சேவையைப் பயன்படுத்த நேரிடும். + மேலும் விவரங்களுக்கு https://exolix.com/privacy என்னும் தளத்தில் அவர்கள் தனியுரிமை கொள்கையைக் காணவும். BTC சேருமிட முகவரி மற்றும் தொகையை Monerujo அவர்களுக்கு அனுப்புகிறது. உங்கள் IP முகவரியும் சேகரிக்கப்படலாம்.

                            செயலி அனுமதிகள்

                              diff --git a/app/src/main/res/values-ta/help.xml b/app/src/main/res/values-ta/help.xml index 03ea448a..48e71ccc 100644 --- a/app/src/main/res/values-ta/help.xml +++ b/app/src/main/res/values-ta/help.xml @@ -169,50 +169,50 @@
                            • XMR அல்லது BTC க்கான ஓப்பன் அளியாஸ்
                            • ஒரு BTC முகவரி
                            • - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

                              BTC ஐ அனுப்புதல்

                              -

                              SideShift.ai

                              -

                              SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin. - We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out - https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo - Team is not associated with SideShift.ai and cannot help you with their service.

                              -

                              SideShift.ai Exchange Rate

                              -

                              On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These +

                              Exolix

                              +

                              Exolix is a third party service which acts as an exchange from Monero to Bitcoin. + We use the Exolix API to integrate Bitcoin payments into Monerujo. Please check out + https://exolix.com and decide for yourself if this is something you want to use. The Monerujo + Team is not associated with Exolix and cannot help you with their service.

                              +

                              Exolix Exchange Rate

                              +

                              On the \"Amount\" screen you will be shown the current parameters of the Exolix service. These include the current exchange rate as well as upper and lower BTC limits. Note that this rate is not guaranteed at this point.

                              -

                              SideShift.ai Order

                              -

                              On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for +

                              Exolix Order

                              +

                              On the \"Confirm\" screen, you will see the actual Exolix order. This order is valid for a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may be different to the indicative one shown on previous screens.

                              -

                              SideShift.ai Secret Key

                              -

                              Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key - can be used to track the Bitcoin part of your order on the SideShift.ai homepage.

                              -

                              SideShift.ai Countdown!

                              -

                              Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the +

                              Exolix Secret Key

                              +

                              Since Monerujo only handles the Monero part of your transaction your Exolix secret key + can be used to track the Bitcoin part of your order on the Exolix homepage.

                              +

                              Exolix Countdown!

                              +

                              Once the countdown reaches zero, you need to get a new quote from Exolix by going back to the previous step and then coming back to the \"Confirm\" screen.

                              ]]> BTC ஐ அனுப்புதல் -

                              SideShift.ai

                              -

                              SideShift.ai is a third party service which acts as an exchange from Monero to Bitcoin. - We use the SideShift.ai API to integrate Bitcoin payments into Monerujo. Please check out - https://sideshift.ai and decide for yourself if this is something you want to use. The Monerujo - Team is not associated with SideShift.ai and cannot help you with their service.

                              -

                              SideShift.ai Exchange Rate

                              -

                              On the \"Amount\" screen you will be shown the current parameters of the SideShift.ai service. These +

                              Exolix

                              +

                              Exolix is a third party service which acts as an exchange from Monero to Bitcoin. + We use the Exolix API to integrate Bitcoin payments into Monerujo. Please check out + https://exolix.com and decide for yourself if this is something you want to use. The Monerujo + Team is not associated with Exolix and cannot help you with their service.

                              +

                              Exolix Exchange Rate

                              +

                              On the \"Amount\" screen you will be shown the current parameters of the Exolix service. These include the current exchange rate as well as upper and lower BTC limits. Note that this rate is not guaranteed at this point.

                              -

                              SideShift.ai Order

                              -

                              On the \"Confirm\" screen, you will see the actual SideShift.ai order. This order is valid for +

                              Exolix Order

                              +

                              On the \"Confirm\" screen, you will see the actual Exolix order. This order is valid for a limited time - you may notice a countdown on the \"Spend\" button. The exchange rate may be different to the indicative one shown on previous screens.

                              -

                              SideShift.ai Secret Key

                              -

                              Since Monerujo only handles the Monero part of your transaction your SideShift.ai secret key - can be used to track the Bitcoin part of your order on the SideShift.ai homepage.

                              -

                              SideShift.ai Countdown!

                              -

                              Once the countdown reaches zero, you need to get a new quote from SideShift.ai by going back to the +

                              Exolix Secret Key

                              +

                              Since Monerujo only handles the Monero part of your transaction your Exolix secret key + can be used to track the Bitcoin part of your order on the Exolix homepage.

                              +

                              Exolix Countdown!

                              +

                              Once the countdown reaches zero, you need to get a new quote from Exolix by going back to the previous step and then coming back to the \"Confirm\" screen.

                              ]]>
                              diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 14aa7b5c..7e68e1a1 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -36,48 +36,48 @@ நீங்கள் %1$s முகவரியை உள்ளிட்டுள்ளீர்கள்.
                              - நீங்கள் XMR ஐ அனுப்புவீர்கள், SideShift.ai சேவையின் மூலம் பெறுநர் %1$s ஐ பெற்றுக்கொள்வார். + நீங்கள் XMR ஐ அனுப்புவீர்கள், %3$s சேவையின் மூலம் பெறுநர் %2$s ஐ பெற்றுக்கொள்வார். ]]>
                              - SideShift.ai அமைவி + %1$s அமைவி %1$s %2$s உறுதிப்படுத்தல் நிலுவையில் உள்ளது பணம் செலுத்தல் நிலுவையில் உள்ளது - SideShift.ai பிழை (%1$s) + %1$s பிழை (%2$s) %1$s அனுப்பப்பட்டது! … ஐ வினவுகிறது நீங்கள் %1$s — %2$s %4$s ஐ அனுப்பலாம்.
                              - SideShift.ai ஆனது %3$s %4$s/XMR என்னும் இப்போதைய மாற்று மதிப்பை உங்களுக்கு அளிக்கிறது. + %5$s ஆனது %3$s %4$s/XMR என்னும் இப்போதைய மாற்று மதிப்பை உங்களுக்கு அளிக்கிறது. ]]>
                              - இருப்பு: %2$s %3$s (%1$s XMR) + இருப்பு: %1$s XMR (~%2$s %3$s) ✔ ஒருங்கிணைந்த பணம் செலுத்தல் ID உங்கள் பரிமாற்றத்தை தயார் செய்கிறது - SideShift.ai அமைவியை உருவாக்குகிறது - SideShift.ai அமைவியை வினவுகிறது + அமைவியை உருவாக்குகிறது + அமைவியை வினவுகிறது மோனேரோ பரிமாற்றத்தை தயார் செய்கிறது - SideShift.ai அளவுருக்களை வினவுகிறது + அளவுருக்களை வினவுகிறது - SideShift.ai பிழை + பிழை குறியீடு: %1$d மீண்டும் முயல தொடவும் இப்போது நாம் இங்கு மாட்டிக்கொண்டோம்! - அச்சச்சோ, SideShift.ai இப்போது கிடைப்பதற்கு வாய்ப்பு இருப்பதாக தெரியவில்லையே! + அச்சச்சோ, %1$s இப்போது கிடைப்பதற்கு வாய்ப்பு இருப்பதாக தெரியவில்லையே! %1$s %3$s = %2$s XMR (விலை: %1$s %2$s/XMR) - ஆதரவு & சுவடுபற்றிச் செல்லலுக்கு SideShift.ai பக்கத்தை பார்க்கவும் - இரகசிய திறவுகோல்\nSideShift.ai - SideShift.ai இரகசிய திறவுகோல் + ஆதரவு & சுவடுபற்றிச் செல்லலுக்கு %1$s பக்கத்தை பார்க்கவும் + இரகசிய திறவுகோல்\n%1$s + %1$s இரகசிய திறவுகோல் சேருமிட %1$s முகவரி தொகை @@ -362,7 +362,7 @@ விதையை பாதுகாப்பாக வைக்கவும் இந்த விதை அதை வைத்திருப்பவருக்கு முழு அணுகலை வழங்குகிறது. இதை நீங்கள் துலைத்து விட்டால், இதை மீட்க எங்களால் உங்களுக்கு உதவ இயலாது. உங்கள் மனம் கவர்ந்த மொனேரொக்களை இழக்க நேரிடும். கிரிப்டோவை அனுப்பவும் - Monerujo இனுள் SideShift.ai க்கான ஆதரவு உட்பொதிந்துள்ளது. வெறும் BTC, LTC, ETH, DASH அல்லது DOGE க்கான முகவரியை ஒட்டுவதன் மூலம் அல்லது வருடுவதன் மூலம் உங்களால் XMR ஐ செலவழித்து இந்தவகை கிரிப்டோக்களாக அனுப்ப இயலும். + Monerujo இனுள் exchange க்கான ஆதரவு உட்பொதிந்துள்ளது. வெறும் BTC, LTC, ETH, TRXUSDT அல்லது SOL க்கான முகவரியை ஒட்டுவதன் மூலம் அல்லது வருடுவதன் மூலம் உங்களால் XMR ஐ செலவழித்து இந்தவகை கிரிப்டோக்களாக அனுப்ப இயலும். கணுக்கள், இது உங்கள் வழி கணுக்கள் உங்களை மொனேரொ வலையமைப்போடு இணைக்கிறது. பொது கணுக்களை பயன்படுத்துகிறீர்களா அல்லது முழுவதுமாக உங்கள் சொந்த கணுவை பயன்படுத்த போகிறீர்களா என்பதை முடிவு செய்யவும். விரல்பதிவை கொண்டு அனுப்பவும் @@ -394,7 +394,7 @@ %1$s முகவரியை உள்ளிடவும் அல்லது வருடவும்.
                              - நீங்கள் XMR ஐ அனுப்புவீர்கள், இது SideShift.ai சேவை மூலம் %2$s வாக பெறுநர் பெற்றுக்கொள்வார். + நீங்கள் XMR ஐ அனுப்புவீர்கள், இது %3$s சேவை மூலம் %2$s வாக பெறுநர் பெற்றுக்கொள்வார். ]]>
                              Tor தேவைப்படுகிறது \u00A0கணுவிற்காக காத்திருக்கிறது\u00A0 Tor ஐ பயன்படுத்தவும் Orbot அமைப்பில் உள்ள "பின்னனி துவக்கத்தை அனுமதிக்கவும்"! - SideShift.ai ஆனது Tor ஐ ஆதரிப்பதில்லை.\nXMR ஐ இடமாற்ற Tor ஐ முடக்கவும். + %1$s ஆனது Tor ஐ ஆதரிப்பதில்லை.\nXMR ஐ இடமாற்ற Tor ஐ முடக்கவும். விதை மறையீடு (சோதனைவழி) விதை ஈடுசெய் சொற்றொடர் (விரும்பினால்) diff --git a/app/src/main/res/values-uk/about.xml b/app/src/main/res/values-uk/about.xml index 698fd60d..e57a4c27 100644 --- a/app/src/main/res/values-uk/about.xml +++ b/app/src/main/res/values-uk/about.xml @@ -34,8 +34,8 @@ Перейдіть за адресою https://coinmarketcap.com/privacy для отримання детальної інформації про те, як збираються ваші персональні дані в запитах.

                              Якщо ви використовуєте додаток для оплати за адресами BTC, - ви будете використовувати сервіс SideShift.ai. Їх політика конфіденційності детально - викладена на веб-сайті https://sideshift.ai/. Monerujo відправляє їм адресу + ви будете використовувати сервіс Exolix. Їх політика конфіденційності детально + викладена на веб-сайті https://exolix.com/privacy. Monerujo відправляє їм адресу призначення BTC і суму. Ваш IP також вказується.

                              Дозволи, необхідні додатку

                                diff --git a/app/src/main/res/values-uk/help.xml b/app/src/main/res/values-uk/help.xml index 5216f575..683fe833 100644 --- a/app/src/main/res/values-uk/help.xml +++ b/app/src/main/res/values-uk/help.xml @@ -151,53 +151,53 @@
                              • an OpenAlias for XMR or BTC
                              • a BTC address
                              • - Please note, that sending BTC is processed through the SideShift.ai service (see https://sideshift.ai + Please note, that sending BTC is processed through the Exolix service (see https://exolix.com for details). See the section on sending BTC below.

                                Відправлення BTC

                                -

                                SideShift.ai

                                -

                                SideShift.ai є стороннім сервісом, який допомагає здійснювати обмін Monero на Bitcoin. - Ми використовуємо API служби SideShift.ai для включення платежів із впровадженням Bitcoin в Monerujo. - Будь ласка, Відвідайте https://sideshift.ai, і виріште, чи хочете ви використовувати цю можливість. - Команда Monerujo НЕ пов\'язана з SideShift.ai і не може допомогти вам в роботі з цією службою.

                                -

                                Курс обміну SideShift.ai

                                -

                                На екрані \"Сума\" відображаються поточні параметри служби SideShift.ai. +

                                Exolix

                                +

                                Exolix є стороннім сервісом, який допомагає здійснювати обмін Monero на Bitcoin. + Ми використовуємо API служби Exolix для включення платежів із впровадженням Bitcoin в Monerujo. + Будь ласка, Відвідайте https://exolix.com, і виріште, чи хочете ви використовувати цю можливість. + Команда Monerujo НЕ пов\'язана з Exolix і не може допомогти вам в роботі з цією службою.

                                +

                                Курс обміну Exolix

                                +

                                На екрані \"Сума\" відображаються поточні параметри служби Exolix. Тут також відображається обмінний курс, верхня і нижня межа BTC. Необхідно відзначити, що на даному етапі курс не гарантується.

                                -

                                Заявка SideShift.ai

                                -

                                На екрані \"Підтвердження\" можна побачити заявку SideShift.ai. Це заявка +

                                Заявка Exolix

                                +

                                На екрані \"Підтвердження\" можна побачити заявку Exolix. Це заявка дійсна протягом обмеженого часу. Зворотний відлік можна побачити на кнопці витрати \"Витрата\". Курс обміну може відрізнятися від того, що був показаний на попередніх екранах.

                                -

                                Секретний ключ SideShift.ai

                                +

                                Секретний ключ Exolix

                                Так як Monerujo відповідає за ту частину транзакції, яка пов$apos;язана з Monero, для відстеження вашого замовлення, яка пов$apos;язана з Bitcoin, можна використовувати секретний ключ на домашній сторінці - SideShift.ai.

                                -

                                Зворотній відлік SideShift.ai

                                -

                                Як тільки зворотний відлік досягне нульової точки, вам знадобиться отримати від SideShift.ai нову + Exolix.

                                +

                                Зворотній відлік Exolix

                                +

                                Як тільки зворотний відлік досягне нульової точки, вам знадобиться отримати від Exolix нову заявку по обміну, повернувшись до попереднього кроку, а потім до екрану \"Підтвердження\".

                                ]]> Відправлення BTC -

                                SideShift.ai

                                -

                                SideShift.ai є стороннім сервісом, який допомагає здійснювати обмін Monero на Bitcoin. - Ми використовуємо API служби SideShift.ai для включення платежів із впровадженням Bitcoin в Monerujo. - Будь ласка, Відвідайте https://sideshift.ai, і виріште, чи хочете ви використовувати цю можливість. - Команда Monerujo НЕ пов\'язана з SideShift.ai і не може допомогти вам в роботі з цією службою.

                                -

                                Курс обміну SideShift.ai

                                -

                                На екрані \"Сума\" відображаються поточні параметри служби SideShift.ai. +

                                Exolix

                                +

                                Exolix є стороннім сервісом, який допомагає здійснювати обмін Monero на Bitcoin. + Ми використовуємо API служби Exolix для включення платежів із впровадженням Bitcoin в Monerujo. + Будь ласка, Відвідайте https://exolix.com, і виріште, чи хочете ви використовувати цю можливість. + Команда Monerujo НЕ пов\'язана з Exolix і не може допомогти вам в роботі з цією службою.

                                +

                                Курс обміну Exolix

                                +

                                На екрані \"Сума\" відображаються поточні параметри служби Exolix. Тут також відображається обмінний курс, верхня і нижня межа BTC. Необхідно відзначити, що на даному етапі курс не гарантується.

                                -

                                Заявка SideShift.ai

                                -

                                На екрані \"Підтвердження\" можна побачити заявку SideShift.ai. Це заявка +

                                Заявка Exolix

                                +

                                На екрані \"Підтвердження\" можна побачити заявку Exolix. Це заявка дійсна протягом обмеженого часу. Зворотний відлік можна побачити на кнопці витрати \"Витрата\". Курс обміну може відрізнятися від того, що був показаний на попередніх екранах.

                                -

                                Секретний ключ SideShift.ai

                                +

                                Секретний ключ Exolix

                                Так як Monerujo відповідає за ту частину транзакції, яка пов$apos;язана з Monero, для відстеження вашого замовлення, яка пов$apos;язана з Bitcoin, можна використовувати секретний ключ на домашній сторінці - SideShift.ai.

                                -

                                Зворотній відлік SideShift.ai

                                -

                                Як тільки зворотний відлік досягне нульової точки, вам знадобиться отримати від SideShift.ai нову + Exolix.

                                +

                                Зворотній відлік Exolix

                                +

                                Як тільки зворотний відлік досягне нульової точки, вам знадобиться отримати від Exolix нову заявку по обміну, повернувшись до попереднього кроку, а потім до екрану \"Підтвердження\".

                                ]]>
                                diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 55d6d358..4078907e 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -35,49 +35,49 @@ Ви ввели %1$s адресу.
                                - Надсилайте XMR, одержувач отримає %1$s, використовуючи сервіс SideShift.ai + Надсилайте XMR, одержувач отримає %2$s, використовуючи сервіс %3$s ]]>
                                - Заявка SideShift.ai + Заявка %1$s %1$s %2$s Очікування підтвердження Очікування платежу - Помилка SideShift.ai (%1$s) + Помилка %1$s (%2$s) %1$s успішно відправлені! Запит … Ви можете відправити %1$s — %2$s %4$s.
                                - SideShift.ai встановлює курс обміну %3$s %4$s/XMR в даний момент. + %5$s встановлює курс обміну %3$s %4$s/XMR в даний момент. ]]>
                                - Баланс: %2$s %3$s (%1$s XMR) + Баланс: %1$s XMR (~%2$s %3$s) ✔ Інтегрований ID платежу Підготовка транзакції - Створення заявки SideShift.ai - Запит заявки SideShift.ai + Створення заявки + Запит заявки Підготовка транзакції Monero - Запит параметрів SideShift.ai + Параметри запиту - SideShift.ai ПОМИЛКА + ПОМИЛКА Код: %1$d Натисніть, щоб повторити спробу Тепер ми застрягли тут! - Ой ой! Здається SideShift.ai недоступний в даний момент! + Ой ой! Здається %1$s недоступний в даний момент! %1$s %3$s = %2$s XMR (Курс: %1$s %2$s/XMR) - Відвідайте SideShift.ai для отримання допомоги & - Секретний ключ\nSideShift.ai - SideShift.ai секретний ключ + Відвідайте %1$s для отримання допомоги & + Секретний ключ\n%1$s + %1$s секретний ключ Адреса отримувача %1$s Сума @@ -365,7 +365,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -397,7 +397,7 @@ Please enter or scan a %1$s address.
                                - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
                                Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) diff --git a/app/src/main/res/values-zh-rCN/about.xml b/app/src/main/res/values-zh-rCN/about.xml index 6832d172..cef24d0b 100644 --- a/app/src/main/res/values-zh-rCN/about.xml +++ b/app/src/main/res/values-zh-rCN/about.xml @@ -24,8 +24,8 @@

                                如果您使用交易的功能(可选),monerujo將通过coinmarketcap.com的公开 API 获取当前汇率。如果您想了解被收集的信息如何被使用,请访问 https://coinmarketcap.com/privacy 查看他们的隐私政策。

                                -

                                如果您想使用该App支付款项至比特币地址,您将使用 SideShift.ai 所提供的服务。Monerujo - 将发送比特币的目标地址以及金额信息至SideShift.ai,您的IP在此时也可能会被收集。请访问 https://sideshift.ai/ +

                                如果您想使用该App支付款项至比特币地址,您将使用 Exolix 所提供的服务。Monerujo + 将发送比特币的目标地址以及金额信息至Exolix,您的IP在此时也可能会被收集。请访问 https://exolix.com/privacy 查看他们的隐私政策。

                                应用程序权限

                                  diff --git a/app/src/main/res/values-zh-rCN/help.xml b/app/src/main/res/values-zh-rCN/help.xml index 12d6493d..53671dcd 100644 --- a/app/src/main/res/values-zh-rCN/help.xml +++ b/app/src/main/res/values-zh-rCN/help.xml @@ -133,41 +133,41 @@
                                • 门罗或比特币的OpenAlias
                                • 一个比特币地址
                                • - 请注意,如果你发往的是比特币地址,那么钱包将自动使用SideShift.ai的服务(详情可查看 https://sideshift.ai + 请注意,如果你发往的是比特币地址,那么钱包将自动使用Exolix的服务(详情可查看 https://exolix.com ). 查看下面关于发送比特币的信息。

                                  发送BTC

                                  -

                                  SideShift.ai

                                  -

                                  SideShift.ai 是一个可以将门罗币转换为比特币的第三方服务。 - 我们利用SideShift.ai的API将其服务整合至Monerujo中。请参阅 https://sideshift.ai 后自行决定是否使用。 - Monerujo开发团队与SideShift.ai无任何关联,无法为你解决其服务的问题。

                                  -

                                  SideShift.ai 汇率

                                  -

                                  在 \"金额\" 的页面中你将看到 SideShift.ai 服务的参数。包含了汇率以及BTC金额的上下限。 +

                                  Exolix

                                  +

                                  Exolix 是一个可以将门罗币转换为比特币的第三方服务。 + 我们利用Exolix的API将其服务整合至Monerujo中。请参阅 https://exolix.com 后自行决定是否使用。 + Monerujo开发团队与Exolix无任何关联,无法为你解决其服务的问题。

                                  +

                                  Exolix 汇率

                                  +

                                  在 \"金额\" 的页面中你将看到 Exolix 服务的参数。包含了汇率以及BTC金额的上下限。 请注意这个时刻显示的汇率并不一定是最终的汇率。

                                  -

                                  SideShift.ai 订单

                                  -

                                  在 \"确认\" 的页面中,你将可以看到正式的SideShift.ai订单。这订单仅在一段时间內有效。 +

                                  Exolix 订单

                                  +

                                  在 \"确认\" 的页面中,你将可以看到正式的Exolix订单。这订单仅在一段时间內有效。 你可以在 \"发送\" 的按钮上看到倒数计时。这时的汇率可能与前一个页面显示的不同。

                                  -

                                  SideShift.ai 私钥

                                  -

                                  Monerujo仅处理交易中门罗币的部分,你可以在SideShift.ai的首页上,通过SideShift.ai密钥查询比特币部分的信息。

                                  -

                                  SideShift.ai 倒数计时!

                                  -

                                  当倒数计时结束的时候,你将需要回到上一步,重新向SideShift.ai寻求汇率报价后,再回到\"确认\"页面。

                                  +

                                  Exolix 私钥

                                  +

                                  Monerujo仅处理交易中门罗币的部分,你可以在Exolix的首页上,通过Exolix密钥查询比特币部分的信息。

                                  +

                                  Exolix 倒数计时!

                                  +

                                  当倒数计时结束的时候,你将需要回到上一步,重新向Exolix寻求汇率报价后,再回到\"确认\"页面。

                                  ]]> 发送BTC -

                                  SideShift.ai

                                  -

                                  SideShift.ai 是一个可以将门罗币转换为比特币的第三方服务。 - 我们利用SideShift.ai的API将其服务整合至Monerujo中。请参阅 https://sideshift.ai 后自行决定是否使用。 - Monerujo开发团队与SideShift.ai无任何关联,无法为你解决其服务的问题。

                                  -

                                  SideShift.ai 汇率

                                  -

                                  在 \"金额\" 的页面中你将看到 SideShift.ai 服务的参数。包含了汇率以及BTC金额的上下限。 +

                                  Exolix

                                  +

                                  Exolix 是一个可以将门罗币转换为比特币的第三方服务。 + 我们利用Exolix的API将其服务整合至Monerujo中。请参阅 https://exolix.com 后自行决定是否使用。 + Monerujo开发团队与Exolix无任何关联,无法为你解决其服务的问题。

                                  +

                                  Exolix 汇率

                                  +

                                  在 \"金额\" 的页面中你将看到 Exolix 服务的参数。包含了汇率以及BTC金额的上下限。 请注意这个时刻显示的汇率并不一定是最终的汇率。

                                  -

                                  SideShift.ai 订单

                                  -

                                  在 \"确认\" 的页面中,你将可以看到正式的SideShift.ai订单。这订单仅在一段时间內有效。 +

                                  Exolix 订单

                                  +

                                  在 \"确认\" 的页面中,你将可以看到正式的Exolix订单。这订单仅在一段时间內有效。 你可以在 \"发送\" 的按钮上看到倒数计时。这时的汇率可能与前一个页面显示的不同。

                                  -

                                  SideShift.ai 私钥

                                  -

                                  Monerujo仅处理交易中门罗币的部分,你可以在SideShift.ai的首页上,通过SideShift.ai密钥查询比特币部分的信息。

                                  -

                                  SideShift.ai 倒数计时!

                                  -

                                  当倒数计时结束的时候,你将需要回到上一步,重新向SideShift.ai寻求汇率报价后,再回到\"确认\"页面。

                                  +

                                  Exolix 私钥

                                  +

                                  Monerujo仅处理交易中门罗币的部分,你可以在Exolix的首页上,通过Exolix密钥查询比特币部分的信息。

                                  +

                                  Exolix 倒数计时!

                                  +

                                  当倒数计时结束的时候,你将需要回到上一步,重新向Exolix寻求汇率报价后,再回到\"确认\"页面。

                                  ]]>
                                  已支持Ledger硬件钱包,点此了解更多 您输入了一个%1$s地址
                                  - 您发送的门罗币将通过SideShift.ai服务,转换为%1$s发送给对方。 + 您发送的门罗币将通过%3$s服务,转换为%2$s发送给对方。 ]]>
                                  - SideShift.ai订单 + %1$s订单 %1$s %2$s 等待确认中 等待支付中 - SideShift.ai错误(%1$s) + %1$s错误(%2$s) 成功发送%1$s! 查询中… 您可以发送%1$s — %2$s %4$s.
                                  - 此刻SideShift.ai的汇率是%3$s %4$s/XMR . + 此刻%5$s的汇率是%3$s %4$s/XMR . ]]>
                                  - 余额: %2$s %3$s (%1$s XMR) + 余额: %1$s XMR (~%2$s %3$s) ✔ 支付ID已集成 正在为您的交易做准备工作 - 创建SideShift.ai订单 - SideShift.ai订单查询中 + 创建订单 + 订单查询中 Monero交易准备中 - SideShift.ai参数查询中 - SideShift.ai错误 + 参数查询中 + 错误 代码: %1$d 再次尝试 我们遇到了困难! - 抱歉, SideShift.ai服务现在似乎不可用 + 抱歉, %1$s服务现在似乎不可用 %1$s %3$s = %2$s XMR (Rate: %1$s %2$s/XMR) - 访问SideShift.ai以获得更多支持 - 密钥\nSideShift.ai - SideShift.ai密钥 + 访问%1$s以获得更多支持 + 密钥\n%1$s + %1$s密钥 %1$s收款地址 金额 交易ID @@ -284,7 +284,7 @@ Keep your seed safe 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. Send Crypto - 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. + Monerujo has exchange support built-in. Just paste or scan a BTC, LTC, ETH, TRXUSDT or SOL address and you\'ll be sending these cryptos by spending XMR. Nodes, your way Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own. Send with fingerprint @@ -316,7 +316,7 @@ Please enter or scan a %1$s address.
                                  - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
                                  Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. 点击以查看详情 Seed encryption (EXPERIMENTAL) diff --git a/app/src/main/res/values-zh-rTW/about.xml b/app/src/main/res/values-zh-rTW/about.xml index 18860820..d0561699 100644 --- a/app/src/main/res/values-zh-rTW/about.xml +++ b/app/src/main/res/values-zh-rTW/about.xml @@ -25,8 +25,8 @@

                                  倘若您有使用匯兌的功能(可選用),monerujo 將透過 coinmarketcap.com 的公開 API 抓取目前的匯率。若欲了解您要求的資料會如何被收集及使用,請至 https://coinmarketcap.com/privacy 觀看他們的隱私權政策。

                                  -

                                  若您想使用本 App 支付款項至 BTC 位址,您將使用 SideShift.ai 所提供的服務。Monerujo - 將發送 BTC 目標位址以及金額至 SideShift.ai,您的 IP 在此時也可能會被收集。詳情請至 https://sideshift.ai/ +

                                  若您想使用本 App 支付款項至 BTC 位址,您將使用 Exolix 所提供的服務。Monerujo + 將發送 BTC 目標位址以及金額至 Exolix,您的 IP 在此時也可能會被收集。詳情請至 https://exolix.com/privacy 觀看他們的隱私權政策。

                                  應用程式權限

                                    diff --git a/app/src/main/res/values-zh-rTW/help.xml b/app/src/main/res/values-zh-rTW/help.xml index a1456905..091caefb 100644 --- a/app/src/main/res/values-zh-rTW/help.xml +++ b/app/src/main/res/values-zh-rTW/help.xml @@ -121,43 +121,43 @@
                                  • 指向 XMR 或 BTC 地址的 OpenAlias
                                  • BTC 地址
                                  • - 但請注意一件事情,發送 BTC 的功能是透過 SideShift.ai 服務實現的,請參考下方的「發送 BTC」說明 - (詳見 https://sideshift.ai 以了解更多)。

                                    + 但請注意一件事情,發送 BTC 的功能是透過 Exolix 服務實現的,請參考下方的「發送 BTC」說明 + (詳見 https://exolix.com 以了解更多)。

                                    發送 BTC

                                    -

                                    SideShift.ai

                                    -

                                    SideShift.ai 是一個可以將 XMR 轉換為 BTC 的第三方服務。 - 我們利用 SideShift.ai 的 API 將其服務整合至 Monerujo 中。請參閱 https://sideshift.ai 後自行決定是否使用。 - Monerujo 開發團隊與 SideShift.ai 並無相關,無法為你解決其服務上的問題

                                    -

                                    SideShift.ai 匯率

                                    -

                                    在「金額」的頁面中你將看到 SideShift.ai 服務的參數。包含了匯率以及 BTC 金額的上下限。 +

                                    Exolix

                                    +

                                    Exolix 是一個可以將 XMR 轉換為 BTC 的第三方服務。 + 我們利用 Exolix 的 API 將其服務整合至 Monerujo 中。請參閱 https://exolix.com 後自行決定是否使用。 + Monerujo 開發團隊與 Exolix 並無相關,無法為你解決其服務上的問題

                                    +

                                    Exolix 匯率

                                    +

                                    在「金額」的頁面中你將看到 Exolix 服務的參數。包含了匯率以及 BTC 金額的上下限。 請注意這個階段顯示的匯率並不是確定的。

                                    -

                                    SideShift.ai 訂單

                                    -

                                    在「確認」的頁面中,你將可以看到正式的 SideShift.ai 訂單。這訂單僅在一段時間內有效。 +

                                    Exolix 訂單

                                    +

                                    在「確認」的頁面中,你將可以看到正式的 Exolix 訂單。這訂單僅在一段時間內有效。 你可以在「發送」的按鈕上看到倒數計時。這時的匯率可能與前一個頁面顯示的不同

                                    -

                                    SideShift.ai 私鑰

                                    -

                                    由於 Monerujo 僅處理 Monero 的部分,你的 SideShift.ai 金鑰將可用在 SideShift.ai 的首頁上查詢追蹤 BTC 部分的交易狀況。

                                    -

                                    SideShift.ai 倒數計時!

                                    -

                                    當倒數計時歸零的時候,你將會需要回到上一步再回到「確認」頁面重新向 SideShift.ai 尋求匯率報價

                                    +

                                    Exolix 私鑰

                                    +

                                    由於 Monerujo 僅處理 Monero 的部分,你的 Exolix 金鑰將可用在 Exolix 的首頁上查詢追蹤 BTC 部分的交易狀況。

                                    +

                                    Exolix 倒數計時!

                                    +

                                    當倒數計時歸零的時候,你將會需要回到上一步再回到「確認」頁面重新向 Exolix 尋求匯率報價

                                    ]]> 發送 BTC -

                                    SideShift.ai

                                    -

                                    SideShift.ai 是一個可以將 XMR 轉換為 BTC 的第三方服務。 - 我們利用 SideShift.ai 的 API 將其服務整合至 Monerujo 中。請參閱 https://sideshift.ai 後自行決定是否使用。 - Monerujo 開發團隊與 SideShift.ai 並無相關,無法為你解決其服務上的問題

                                    -

                                    SideShift.ai 匯率

                                    -

                                    在「金額」的頁面中你將看到 SideShift.ai 服務的參數。包含了匯率以及 BTC 金額的上下限。 +

                                    Exolix

                                    +

                                    Exolix 是一個可以將 XMR 轉換為 BTC 的第三方服務。 + 我們利用 Exolix 的 API 將其服務整合至 Monerujo 中。請參閱 https://exolix.com 後自行決定是否使用。 + Monerujo 開發團隊與 Exolix 並無相關,無法為你解決其服務上的問題

                                    +

                                    Exolix 匯率

                                    +

                                    在「金額」的頁面中你將看到 Exolix 服務的參數。包含了匯率以及 BTC 金額的上下限。 請注意這個階段顯示的匯率並不是確定的。你也可以看到在多少金額之下可以直接發送 BTC,而不用等待 XMR 的確認。 - (詳見 SideShift.ai 的 FAQ 以了解更多)。請注意 SideShift.ai 並不額外收取手續費用,是不是很棒呢?

                                    -

                                    SideShift.ai 訂單

                                    -

                                    在「確認」的頁面中,你將可以看到正式的 SideShift.ai 訂單。這訂單僅在一段時間內有效。 + (詳見 Exolix 的 FAQ 以了解更多)。請注意 Exolix 並不額外收取手續費用,是不是很棒呢?

                                    +

                                    Exolix 訂單

                                    +

                                    在「確認」的頁面中,你將可以看到正式的 Exolix 訂單。這訂單僅在一段時間內有效。 你可以在「發送」的按鈕上看到倒數計時。這時的匯率可能與前一個頁面顯示的不同

                                    -

                                    SideShift.ai 私鑰

                                    -

                                    由於 Monerujo 僅處理 Monero 的部分,你的 SideShift.ai 金鑰將可用在 SideShift.ai 的首頁上查詢追蹤 BTC 部分的交易狀況。

                                    +

                                    Exolix 私鑰

                                    +

                                    由於 Monerujo 僅處理 Monero 的部分,你的 Exolix 金鑰將可用在 Exolix 的首頁上查詢追蹤 BTC 部分的交易狀況。

                                    請注意,此金鑰僅在交易發起的 24 小時內有效。

                                    -

                                    SideShift.ai 倒數計時!

                                    -

                                    當倒數計時歸零的時候,你將會需要回到上一步再回到「確認」頁面重新向 SideShift.ai 尋求匯率報價

                                    +

                                    Exolix 倒數計時!

                                    +

                                    當倒數計時歸零的時候,你將會需要回到上一步再回到「確認」頁面重新向 Exolix 尋求匯率報價

                                    ]]>
                                    你輸入了 %1$s 地址
                                    - 你將會發送 XMR 而收款方將會收到 %1$s (由 SideShift.ai 提供轉換) + 你將會發送 XMR 而收款方將會收到 %2$s (由 %3$s 提供轉換) ]]>
                                    - SideShift.ai 訂單 + %1$s 訂單 %1$s %2$s 等待確認中 等待付款中 - SideShift.ai 發生錯誤 (%1$s) + %1$s 發生錯誤 (%2$s) %1$s 已發送! 查詢中 … 你可發送 %1$s — %2$s %4$s.
                                    - SideShift.ai 提供的即時匯率為 %3$s %4$s/XMR. + %5$s 提供的即時匯率為 %3$s %4$s/XMR. ]]>
                                    - 餘額:%2$s %3$s (%1$s XMR) + 餘額:%1$s XMR (~%2$s %3$s) ✔ 已加入付款 ID 正在準備你的交易 - 建立 SideShift.ai 訂單 - 查詢 SideShift.ai 訂單 + 建立訂單 + 查詢訂單 正在準備 Monero 交易 - 正在查詢 SideShift.ai 參數 + 正在查詢參數 - SideShift.ai 發生錯誤 + 發生錯誤 錯誤代碼:%1$d 點選以重試 我們卡住了! - 不好,SideShift.ai 現在似乎無法提供服務! + 不好,%1$s 現在似乎無法提供服務! %1$s %3$s = %2$s XMR (匯率:%1$s %2$s/XMR) - 參訪 SideShift.ai 以獲得支援及追蹤交易 - 私鑰\nSideShift.ai - SideShift.ai 私鑰 + 參訪 %1$s 以獲得支援及追蹤交易 + 私鑰\n%1$s + %1$s 私鑰 目的地 %1$s 地址 金額 @@ -147,7 +147,7 @@ 公開地址 金鑰 查看金鑰已複製至剪貼簿! - SideShift.ai 金鑰已複製至剪貼簿! + 金鑰已複製至剪貼簿! 錢包地址已複製至剪貼簿! 交易 ID 已複製至剪貼簿! 因安全因素已停用複製功能! @@ -358,7 +358,7 @@ 保管好你的種子碼 種子碼提供任何人完整的權限。如果你遺失了種子碼,我們無法幫你找回它,且你將失去你心愛的 moneroj。 發送加密貨幣 - Monerujo 內建 SideShift.ai 服務。只要貼上或掃描 BTC、LTC、ETH、DASH 或 DOGE 地址,你就可以直接使用 XMR 來發送這些加密貨幣。 + Monerujo 內建 exchange 服務。只要貼上或掃描 BTC、LTC、ETH、TRXUSDT 或 SOL 地址,你就可以直接使用 XMR 來發送這些加密貨幣。 節點選擇,由你作主 你必須透過節點連線至 Monero 交易網路。選擇使用公共節點或是很密碼龐克式地使用你自己的節點。 使用指紋辨識發送交易 @@ -390,7 +390,7 @@ 請輸入或是掃描 %1$s 的地址。
                                    - 你'將會發送 XMR 而接受者將會收到由 SideShift.ai 服務兌換的 %2$s 。 + 你'將會發送 XMR 而接受者將會收到由 %3$s 服務兌換的 %2$s 。 ]]>
                                    Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. 點選以獲得詳細資訊 Seed encryption (EXPERIMENTAL) diff --git a/app/src/main/res/values/about.xml b/app/src/main/res/values/about.xml index f5de856d..3d34da6f 100644 --- a/app/src/main/res/values/about.xml +++ b/app/src/main/res/values/about.xml @@ -34,8 +34,8 @@ rate through the public API of coinmarketcap.com. See their privacy policy at https://coinmarketcap.com/privacy for details on how data in your requests is collected.

                                    -

                                    If you use the app to pay to BTC addresses, you will be using the SideShift.ai service. - See their privacy policy at https://sideshift.ai/ for details. Monerujo send them the BTC +

                                    If you use the app to pay to BTC addresses, you will be using the Exolix service. + See their privacy policy at https://exolix.com/privacy for details. Monerujo send them the BTC destination address and amount. Your IP will also be collectable.

                                    App Permissions

                                      diff --git a/app/src/main/res/values/help.xml b/app/src/main/res/values/help.xml index b25c7c3d..c46b3110 100644 --- a/app/src/main/res/values/help.xml +++ b/app/src/main/res/values/help.xml @@ -163,17 +163,7 @@

                                      Converting XMR

                                      Conversion into another crypto is processed through an external exchange service. Monerujo doesn\'t run or is associated with these third parties, therefore cannot help you with their service, but will provide you with the information required to get support from them.

                                      -

                                      Available XMR pairs

                                      -

                                      Monerujo supports conversion form XMR to the following coins: -

                                        -
                                      • Bitcoin (BTC)
                                      • -
                                      • Ethereum (ETH)
                                      • -
                                      • Litecoin (LTC)
                                      • -
                                      • Dash (DASH)
                                      • -
                                      • Dai (DAI) on Ethereum
                                      • -
                                      • Tether (USDT) on Ethereum
                                      • -
                                      - Just add a matching address or select the desired coin by picking on its icon.

                                      +

                                      Just add a matching address or select the desired coin by picking on its icon.

                                      ]]> You entered a %1$s address.
                                      - You'll send XMR and this address will receive %1$s using an exchange service. + You'll send XMR and this address will receive %2$s using the %3$s service. ]]>
                                      - Exchange Order + %1$s Order %1$s %2$s Confirmation Pending Payment Pending - Exchange Error (%1$s) + %1$s Error (%2$s) %1$s Sent! Querying … You can send %1$s — %2$s %4$s.
                                      - The exchange is giving you an exchange rate of %3$s %4$s/XMR right now. + %5$s is giving you an exchange rate of %3$s %4$s/XMR right now. ]]>
                                      - Balance: %2$s %3$s (%1$s XMR) + Balance: %1$s XMR (~%2$s %3$s) ✔ Payment ID integrated Preparing your transaction - Creating exchange Order - Querying exchange Order + Creating Order + Querying Order Preparing Monero Transaction - Querying exchange parameters + Querying parameters - Exchange service ERROR + ERROR Code: %1$d Touch to retry Now we\'re stuck here! - Uh-oh, the exchange service does not seem be available right now! + Uh-oh, %1$s does not seem be available right now! %1$s %3$s = %2$s XMR (Rate: %1$s %2$s/XMR) - Visit the exchange website for support & tracking - Order number\nExchange - Exchange order number + Visit the %1$s website for support & tracking + Order number\n%1$s + %1$s order number Destination %1$s Address Amount @@ -413,23 +413,13 @@ Please enter or scan a %1$s address.
                                      - You'll send XMR and the receiver will get %2$s using the SideShift.ai service. + You'll send XMR and the receiver will get %2$s using the %3$s service. ]]>
                                      Please enter or scan a Monero address. ]]> - - - Monero - Bitcoin - Dash - Dogecoin - Ethereum - Litecoin - - tx_transition_%1$s tx_transition subaddress_transition_%1$d @@ -461,7 +451,7 @@ Tor required \u00A0WAITING FOR NODE\u00A0 "Allow Background Starts" in Orbot Settings to use Tor! - SideShift.ai doesn\'t support Tor.\nDisable Tor to swap XMR. + %1$s doesn\'t support Tor.\nDisable Tor to swap XMR. Enable TOR Seed encryption (EXPERIMENTAL) diff --git a/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiCreateOrderTest.java b/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiCreateOrderTest.java deleted file mode 100644 index 6265540a..00000000 --- a/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiCreateOrderTest.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (c) 2017 m2049r et 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.service.shift.sideshift; - -import static org.junit.Assert.assertEquals; - -import com.m2049r.xmrwallet.service.shift.ShiftCallback; -import com.m2049r.xmrwallet.service.shift.ShiftException; -import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder; -import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; -import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl; -import com.m2049r.xmrwallet.util.NetCipherHelper; -import com.m2049r.xmrwallet.util.ServiceHelper; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.concurrent.TimeoutException; - -import okhttp3.OkHttpClient; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; - -public class SideShiftApiCreateOrderTest { - - private MockWebServer mockWebServer; - - private SideShiftApi xmrToApi; - - private Waiter waiter; - - @Mock - ShiftCallback mockOrderXmrToCallback; - - @Before - public void setUp() throws Exception { - mockWebServer = new MockWebServer(); - mockWebServer.start(); - - waiter = new Waiter(); - - MockitoAnnotations.initMocks(this); - NetCipherHelper.Request.mockClient = new OkHttpClient(); - xmrToApi = new SideShiftApiImpl(mockWebServer.url("/")); - ServiceHelper.ASSET = "btc"; // all tests run with BTC - } - - @After - public void tearDown() throws Exception { - mockWebServer.shutdown(); - ServiceHelper.ASSET = null; - } - - @Test - public void createOrder_shouldBePostMethod() - throws InterruptedException { - - xmrToApi.createOrder("01234567-89ab-cdef-0123-456789abcdef", "19y91nJyzXsLEuR7Nj9pc3o5SeHNc8A9RW", mockOrderXmrToCallback); - - RecordedRequest request = mockWebServer.takeRequest(); - assertEquals("POST", request.getMethod()); - } - - @Test - public void createOrder_shouldBeContentTypeJson() - throws InterruptedException { - - xmrToApi.createOrder("01234567-89ab-cdef-0123-456789abcdef", "19y91nJyzXsLEuR7Nj9pc3o5SeHNc8A9RW", mockOrderXmrToCallback); - - RecordedRequest request = mockWebServer.takeRequest(); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - } - - @Test - public void createOrder_shouldContainValidBody() - throws InterruptedException { - - final String validBody = "{\"settleAddress\":\"19y91nJyzXsLEuR7Nj9pc3o5SeHNc8A9RW\",\"type\":\"fixed\",\"quoteId\":\"01234567-89ab-cdef-0123-456789abcdef\"}"; - - xmrToApi.createOrder("01234567-89ab-cdef-0123-456789abcdef", "19y91nJyzXsLEuR7Nj9pc3o5SeHNc8A9RW", mockOrderXmrToCallback); - - RecordedRequest request = mockWebServer.takeRequest(); - String body = request.getBody().readUtf8(); - assertEquals(validBody, body); - } - - @Test - public void createOrder_wasSuccessfulShouldRespondWithOrder() - throws TimeoutException, InterruptedException { - final double btcAmount = 1.23456789; - final String btcAddress = "19y91nJyzXsLEuR7Nj9pc3o5SeHNc8A9RW"; - final double xmrAmount = 0.6; - final String quoteId = "01234567-89ab-cdef-0123-456789abcdef"; - final String orderId = "09090909090909090911"; - MockResponse jsonMockResponse = new MockResponse().setBody( - createMockCreateOrderResponse(btcAmount, btcAddress, xmrAmount, quoteId, orderId)); - mockWebServer.enqueue(jsonMockResponse); - xmrToApi.createOrder(quoteId, btcAddress, new ShiftCallback() { - @Override - public void onSuccess(final CreateOrder order) { - waiter.assertEquals(order.getBtcAmount(), btcAmount); - waiter.assertEquals(order.getBtcAddress(), btcAddress); - waiter.assertEquals(order.getQuoteId(), quoteId); - waiter.assertEquals(order.getOrderId(), orderId); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.fail(e); - waiter.resume(); - } - }); - waiter.await(); - } - - @Test - public void createOrder_wasNotSuccessfulShouldCallOnError() - throws TimeoutException, InterruptedException { - mockWebServer.enqueue(new MockResponse().setResponseCode(500)); - xmrToApi.createOrder("01234567-89ab-cdef-0123-456789abcdef", "19y91nJyzXsLEuR7Nj9pc3o5SeHNc8A9RW", new ShiftCallback() { - @Override - public void onSuccess(final CreateOrder order) { - waiter.fail(); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.assertTrue(e instanceof ShiftException); - waiter.assertTrue(((ShiftException) e).getCode() == 500); - waiter.resume(); - } - - }); - waiter.await(); - } - - @Test - public void createOrder_malformedAddressShouldCallOnError() - throws TimeoutException, InterruptedException { - mockWebServer.enqueue(new MockResponse(). - setResponseCode(500). - setBody("{\"error\":{\"message\":\"Invalid settleDestination\"}}")); - xmrToApi.createOrder("01234567-89ab-cdef-0123-456789abcdef", "xxx", new ShiftCallback() { - @Override - public void onSuccess(final CreateOrder order) { - waiter.fail(); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.assertTrue(e instanceof ShiftException); - ShiftException xmrEx = (ShiftException) e; - waiter.assertTrue(xmrEx.getCode() == 500); - waiter.assertNotNull(xmrEx.getError()); - waiter.assertEquals(xmrEx.getError().getErrorMsg(), "Invalid settleDestination"); - waiter.resume(); - } - - }); - waiter.await(); - } - - private String createMockCreateOrderResponse(final double btcAmount, final String btcAddress, - final double xmrAmount, - final String quoteId, final String orderId) { - - return "{\"createdAt\":\"1612705584613\"," + - "\"createdAtISO\":\"2021-02-07T13:46:24.613Z\"," + - "\"expiresAt\":\"1612706453080\"," + - "\"expiresAtISO\":\"2021-02-07T14:00:53.080Z\"," + - "\"depositAddress\":{" + - "\"address\":\"4Bh68jCUZGHbVu45zCVvtcMYesHuduwgajoQcdYRjUQcY6MNa8qd67vTfSNWdtrc33dDECzbPCJeQ8HbiopdeM7Ej8MBVLCYz6cVqy6utz\"," + - "\"paymentId\":\"dbe876f0374db1ff\"," + - "\"integratedAddress\":\"4Bh68jCUZGHbVu45zCVvtcMYesHuduwgajoQcdYRjUQcY6MNa8qd67vTfSNWdtrc33dDECzbPCJeQ8HbiopdeM7Ej8MBVLCYz6cVqy6utz\"" + - "}," + - "\"depositMethodId\":\"xmr\"," + - "\"id\":\"" + orderId + "\"," + - "\"orderId\":\"" + orderId + "\"," + - "\"settleAddress\":{" + - "\"address\":\"" + btcAddress + "\"" + - "}," + - "\"settleMethodId\":\"btc\"," + - "\"depositMax\":\"" + xmrAmount + "\"," + - "\"depositMin\":\"" + xmrAmount + "\"," + - "\"quoteId\":\"" + quoteId + "\"," + - "\"settleAmount\":\"" + btcAmount + "\"," + - "\"depositAmount\":\"" + xmrAmount + "\"," + - "\"deposits\":[]}"; - } -} \ No newline at end of file diff --git a/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiOrderParameterTest.java b/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiOrderParameterTest.java deleted file mode 100644 index abad4409..00000000 --- a/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiOrderParameterTest.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2017 m2049r et 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.service.shift.sideshift; - -import static org.junit.Assert.assertEquals; - -import com.m2049r.xmrwallet.service.shift.ShiftCallback; -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.sideshift.network.SideShiftApiImpl; -import com.m2049r.xmrwallet.util.NetCipherHelper; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.concurrent.TimeoutException; - -import okhttp3.OkHttpClient; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; - -public class SideShiftApiOrderParameterTest { - - private MockWebServer mockWebServer; - - private SideShiftApi xmrToApi; - - private Waiter waiter; - - @Mock - ShiftCallback mockParametersXmrToCallback; - - @Before - public void setUp() throws Exception { - mockWebServer = new MockWebServer(); - mockWebServer.start(); - - waiter = new Waiter(); - - MockitoAnnotations.initMocks(this); - NetCipherHelper.Request.mockClient = new OkHttpClient(); - xmrToApi = new SideShiftApiImpl(mockWebServer.url("/")); - } - - @After - public void tearDown() throws Exception { - mockWebServer.shutdown(); - } - - @Test - public void orderParameter_shouldBeGetMethod() - throws InterruptedException { - - xmrToApi.queryOrderParameters(mockParametersXmrToCallback); - - RecordedRequest request = mockWebServer.takeRequest(); - assertEquals("GET", request.getMethod()); - } - - @Test - public void orderParameter_wasSuccessfulShouldRespondWithParameters() - throws TimeoutException, InterruptedException { - final double rate = 0.015537; - final double upperLimit = 20.0; - final double lowerLimit = 0.001; - - MockResponse jsonMockResponse = new MockResponse().setBody( - createMockOrderParameterResponse(rate, upperLimit, lowerLimit)); - mockWebServer.enqueue(jsonMockResponse); - - xmrToApi.queryOrderParameters(new ShiftCallback() { - @Override - public void onSuccess(final QueryOrderParameters orderParameter) { - waiter.assertEquals(orderParameter.getLowerLimit(), lowerLimit); - waiter.assertEquals(orderParameter.getUpperLimit(), upperLimit); - waiter.assertEquals(orderParameter.getPrice(), rate); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.fail(e); - waiter.resume(); - } - }); - waiter.await(); - } - - @Test - public void orderParameter_wasNotSuccessfulShouldCallOnError() - throws TimeoutException, InterruptedException { - mockWebServer.enqueue(new MockResponse().setResponseCode(500)); - xmrToApi.queryOrderParameters(new ShiftCallback() { - @Override - public void onSuccess(final QueryOrderParameters orderParameter) { - waiter.fail(); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.assertTrue(e instanceof ShiftException); - waiter.assertTrue(((ShiftException) e).getCode() == 500); - waiter.resume(); - } - - }); - waiter.await(); - } - - @Test - public void orderParameter_SettleMethodInvalidShouldCallOnError() - throws TimeoutException, InterruptedException { - mockWebServer.enqueue(new MockResponse(). - setResponseCode(500). - setBody("{\"error\":{\"message\":\"Settle method not found\"}}")); - xmrToApi.queryOrderParameters(new ShiftCallback() { - @Override - public void onSuccess(final QueryOrderParameters orderParameter) { - waiter.fail(); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.assertTrue(e instanceof ShiftException); - ShiftException xmrEx = (ShiftException) e; - waiter.assertTrue(xmrEx.getCode() == 500); - waiter.assertNotNull(xmrEx.getError()); - waiter.assertEquals(xmrEx.getError().getErrorMsg(), "Settle method not found"); - waiter.resume(); - } - - }); - waiter.await(); - } - - private String createMockOrderParameterResponse( - final double rate, - final double upperLimit, - final double lowerLimit) { - return "{\n" + - " \"rate\": \"" + rate + "\",\n" + - " \"min\": \"" + lowerLimit + "\",\n" + - " \"max\": \"" + upperLimit + "\"\n" + - "}"; - } -} diff --git a/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiQueryOrderStatusTest.java b/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiQueryOrderStatusTest.java deleted file mode 100644 index fb15ad9b..00000000 --- a/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiQueryOrderStatusTest.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2017 m2049r et 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.service.shift.sideshift; - -import static org.junit.Assert.assertEquals; - -import com.m2049r.xmrwallet.service.shift.ShiftCallback; -import com.m2049r.xmrwallet.service.shift.ShiftException; -import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderStatus; -import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; -import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl; -import com.m2049r.xmrwallet.util.NetCipherHelper; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.concurrent.TimeoutException; - -import okhttp3.OkHttpClient; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; - -public class SideShiftApiQueryOrderStatusTest { - private MockWebServer mockWebServer; - - private SideShiftApi xmrToApi; - - private Waiter waiter; - - @Mock - ShiftCallback mockQueryXmrToCallback; - - @Before - public void setUp() throws Exception { - mockWebServer = new MockWebServer(); - mockWebServer.start(); - - waiter = new Waiter(); - - MockitoAnnotations.initMocks(this); - NetCipherHelper.Request.mockClient = new OkHttpClient(); - xmrToApi = new SideShiftApiImpl(mockWebServer.url("/")); - } - - @After - public void tearDown() throws Exception { - mockWebServer.shutdown(); - } - - @Test - public void orderStatus_shouldBePostMethod() - throws InterruptedException { - - xmrToApi.queryOrderStatus("09090909090909090911", mockQueryXmrToCallback); - - RecordedRequest request = mockWebServer.takeRequest(); - assertEquals("GET", request.getMethod()); - } - - @Test - public void orderStatus_wasSuccessfulShouldRespondWithOrder() - throws TimeoutException, InterruptedException { - - final String state = "settled"; - final String orderId = "09090909090909090911"; - - MockResponse jsonMockResponse = new MockResponse().setBody( - createMockQueryOrderResponse( - state, - orderId)); - mockWebServer.enqueue(jsonMockResponse); - - xmrToApi.queryOrderStatus(orderId, new ShiftCallback() { - @Override - public void onSuccess(final QueryOrderStatus orderStatus) { - waiter.assertEquals(orderStatus.getOrderId(), orderId); - waiter.assertEquals(orderStatus.getState(), QueryOrderStatus.State.SETTLED); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.fail(e); - waiter.resume(); - } - }); - waiter.await(); - } - - @Test - public void orderStatus_wasNotSuccessfulShouldCallOnError() - throws TimeoutException, InterruptedException { - mockWebServer.enqueue(new MockResponse().setResponseCode(500)); - xmrToApi.queryOrderStatus("09090909090909090911", new ShiftCallback() { - @Override - public void onSuccess(final QueryOrderStatus orderStatus) { - waiter.fail(); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.assertTrue(e instanceof ShiftException); - waiter.assertTrue(((ShiftException) e).getCode() == 500); - waiter.resume(); - } - - }); - waiter.await(); - } - - @Test - public void orderStatus_orderNotFoundShouldCallOnError() - throws TimeoutException, InterruptedException { - mockWebServer.enqueue(new MockResponse(). - setResponseCode(500). - setBody("{\"error\":{\"message\":\"Order not found\"}}")); - xmrToApi.queryOrderStatus("09090909090909090911", new ShiftCallback() { - @Override - public void onSuccess(final QueryOrderStatus orderStatus) { - waiter.fail(); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.assertTrue(e instanceof ShiftException); - ShiftException xmrEx = (ShiftException) e; - waiter.assertTrue(xmrEx.getCode() == 500); - waiter.assertNotNull(xmrEx.getError()); - waiter.assertEquals(xmrEx.getError().getErrorMsg(), "Order not found"); - waiter.resume(); - } - }); - waiter.await(); - } - - private String createMockQueryOrderResponse( - final String state, - final String orderId) { - return "{\"createdAt\":\"1612700947550\"," + - "\"createdAtISO\":\"2021-02-07T12:29:07.550Z\"," + - "\"expiresAt\":\"1612701817682\"," + - "\"expiresAtISO\":\"2021-02-07T12:43:37.682Z\"," + - "\"depositAddress\":" + - "{\"address\":\"4Bh68jCUZGHbVu45zCVvtcMYesHuduwgajoQcdYRjUQcY6MNa8qd67vTfSNWdtrc33dDECzbPCJeQ8HbiopdeM7Ej2DVsSohug9QxMJnN2\",\"paymentId\":\"3a151908242c6ed4\",\"integratedAddress\":\"4Bh68jCUZGHbVu45zCVvtcMYesHuduwgajoQcdYRjUQcY6MNa8qd67vTfSNWdtrc33dDECzbPCJeQ8HbiopdeM7Ej2DVsSohug9QxMJnN2\"}," + - "\"depositMethodId\":\"xmr\"," + - "\"id\":\"" + orderId + "\"," + - "\"orderId\":\"" + orderId + "\"," + - "\"settleAddress\":{\"address\":\"19y91nJyzXsLEuR7Nj9pc3o5SeHNc8A9RW\"}," + - "\"settleMethodId\":\"btc\"," + - "\"depositMax\":\"0.01\",\"depositMin\":\"0.01\"," + - "\"quoteId\":\"01234567-89ab-cdef-0123-456789abcdef\"," + - "\"settleAmount\":\"0.008108\"," + - "\"depositAmount\":\"0.01\"," + - "\"deposits\":[" + - "{\"createdAt\":\"1612701112634\",\"createdAtISO\":\"2021-02-07T12:31:52.634Z\"," + - "\"depositAmount\":\"0.01\"," + - "\"depositTx\":{\"type\":\"monero\",\"txHash\":\"a0b674f6033f5f5398dacea9dddedf8d12e35f46c29dfeaf5fac724d7c678fb7\",\"transferIndex\":0}," + - "\"depositId\":\"3e700e108fb31a4b1f7f\"," + - "\"id\":\"3e700e108fb31a4b1f7f\"," + - "\"status\":\"" + state + "\"," + - "\"refundAddress\":null,\"refundTx\":null," + - "\"settleAmount\":\"0.008108\"," + - "\"settleRate\":\"0.810756\"," + - "\"settleTx\":{\"type\":\"bitcoin\",\"txHash\":\"7bd5d0c3daac6a087ddf81411c8135fae55078334780debe47df775d596d4561\"}," + - "\"orderId\":\"" + orderId + "\"" + - "}" + // deposits[0] - "]" + // deposits - "}"; - } -} \ No newline at end of file diff --git a/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiRequestQuoteTest.java b/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiRequestQuoteTest.java deleted file mode 100644 index 0031cc9b..00000000 --- a/app/src/test/java/com/m2049r/xmrwallet/service/shift/sideshift/SideShiftApiRequestQuoteTest.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (c) 2017 m2049r et 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.service.shift.sideshift; - -import static org.junit.Assert.assertEquals; - -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.RequestQuote; -import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; -import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl; -import com.m2049r.xmrwallet.util.NetCipherHelper; -import com.m2049r.xmrwallet.util.ServiceHelper; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.concurrent.TimeoutException; - -import okhttp3.OkHttpClient; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; - -public class SideShiftApiRequestQuoteTest { - - private MockWebServer mockWebServer; - - private SideShiftApi xmrToApi; - - private Waiter waiter; - - @Mock - ShiftCallback mockXmrToCallback; - - @Before - public void setUp() throws Exception { - mockWebServer = new MockWebServer(); - mockWebServer.start(); - - waiter = new Waiter(); - - MockitoAnnotations.initMocks(this); - NetCipherHelper.Request.mockClient = new OkHttpClient(); - xmrToApi = new SideShiftApiImpl(mockWebServer.url("/")); - ServiceHelper.ASSET="btc"; // all tests run with BTC - } - - @After - public void tearDown() throws Exception { - mockWebServer.shutdown(); - ServiceHelper.ASSET = null; - } - - @Test - public void requestQuote_shouldBePostMethod() - throws InterruptedException { - - xmrToApi.requestQuote(1.01, mockXmrToCallback); - - RecordedRequest request = mockWebServer.takeRequest(); - assertEquals("POST", request.getMethod()); - } - - @Test - public void requestQuote_shouldBeContentTypeJson() - throws InterruptedException { - - xmrToApi.requestQuote(1.01, mockXmrToCallback); - - RecordedRequest request = mockWebServer.takeRequest(); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - } - - @Test - public void requestQuote_shouldContainValidBody() throws InterruptedException { - - final String validBody = "{\"settleAmount\":\"1.01\",\"settleMethod\":\"btc\",\"depositMethod\":\"xmr\"}"; - xmrToApi.requestQuote(1.01, mockXmrToCallback); - - RecordedRequest request = mockWebServer.takeRequest(); - String body = request.getBody().readUtf8(); - assertEquals(validBody, body); - } - - @Test - public void requestQuote_wasSuccessfulShouldRespondWithQuote() - throws TimeoutException, InterruptedException { - final double btcAmount = 1.01; - final double rate = 0.00397838; - final String uuid = "66fc0749-f320-4361-b0fb-7873576cba67"; - MockResponse jsonMockResponse = new MockResponse().setBody( - createMockRequestQuoteResponse(btcAmount, rate, uuid)); - mockWebServer.enqueue(jsonMockResponse); - - xmrToApi.requestQuote(btcAmount, new ShiftCallback() { - @Override - public void onSuccess(final RequestQuote quote) { - waiter.assertEquals(quote.getXmrAmount(), btcAmount / rate); - waiter.assertEquals(quote.getBtcAmount(), btcAmount); - waiter.assertEquals(quote.getId(), uuid); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.fail(e); - waiter.resume(); - } - }); - waiter.await(); - } - - @Test - public void requestQuote_wasNotSuccessfulShouldCallOnError() - throws TimeoutException, InterruptedException { - mockWebServer.enqueue(new MockResponse().setResponseCode(500)); - xmrToApi.requestQuote(1.01, new ShiftCallback() { - @Override - public void onSuccess(final RequestQuote quote) { - waiter.fail(); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.assertTrue(e instanceof ShiftException); - waiter.assertTrue(((ShiftException) e).getCode() == 500); - waiter.resume(); - } - - }); - waiter.await(); - } - - @Test - public void requestQuote_AmountTooHighShouldCallOnError() - throws TimeoutException, InterruptedException { - mockWebServer.enqueue(new MockResponse(). - setResponseCode(500). - setBody("{\"error\":{\"message\":\"Amount too high\"}}")); - xmrToApi.requestQuote(1000, new ShiftCallback() { - @Override - public void onSuccess(final RequestQuote quote) { - waiter.fail(); - waiter.resume(); - } - - @Override - public void onError(final Exception e) { - waiter.assertTrue(e instanceof ShiftException); - ShiftException xmrEx = (ShiftException) e; - waiter.assertTrue(xmrEx.getCode() == 500); - waiter.assertNotNull(xmrEx.getError()); - waiter.assertEquals(xmrEx.getError().getErrorType(), ShiftError.Error.SERVICE); - waiter.assertEquals(xmrEx.getError().getErrorMsg(), "Amount too high"); - waiter.resume(); - } - - }); - waiter.await(); - } - - private String createMockRequestQuoteResponse(final double btcAmount, final double rate, - final String uuid) { - - return "{\n" + - "\"createdAt\":\"2021-02-04T13:09:14.484Z\",\n" + - "\"settleAmount\":\"" + btcAmount + "\",\n" + - "\"depositMethod\":\"xmr\",\n" + - "\"expiresAt\":\"2021-02-04T13:24:14.484Z\",\n" + - "\"id\":\"" + uuid + "\",\n" + - "\"rate\":\"" + rate + "\",\n" + - "\"depositAmount\":\"" + (btcAmount / rate) + "\",\n" + - "\"settleMethod\":\"btc\"\n" + - "}"; - } -} \ No newline at end of file diff --git a/app/src/test/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidatorTest.java b/app/src/test/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidatorTest.java deleted file mode 100644 index 8402079f..00000000 --- a/app/src/test/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidatorTest.java +++ /dev/null @@ -1,139 +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.validator; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - - -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)); - } -} diff --git a/app/src/test/java/com/m2049r/xmrwallet/util/validator/EthAddressValidatorTest.java b/app/src/test/java/com/m2049r/xmrwallet/util/validator/EthAddressValidatorTest.java deleted file mode 100644 index 2be324b6..00000000 --- a/app/src/test/java/com/m2049r/xmrwallet/util/validator/EthAddressValidatorTest.java +++ /dev/null @@ -1,46 +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.validator; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - - -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 ")); - } -} diff --git a/external-libs/.gitignore b/external-libs/.gitignore index 4cc6b6d0..82df204c 100644 --- a/external-libs/.gitignore +++ b/external-libs/.gitignore @@ -3,3 +3,4 @@ /armeabi-v7a /x86 /x86_64 +/bak diff --git a/external-libs/android32.Dockerfile b/external-libs/android32.Dockerfile index 4514c360..e4146484 100644 --- a/external-libs/android32.Dockerfile +++ b/external-libs/android32.Dockerfile @@ -96,7 +96,7 @@ ARG OPENSSL_VERSION=3.0.5 ARG OPENSSL_HASH=aa7d8d9bef71ad6525c55ba11e5f4397889ce49c2c9349dcea6d3e4f0b024a7a # openssl explicitly demands to be built by a clang that has a "/prebuilt/" somewhere along its path, so use the prebuilt version, but make sure to specify the target android api RUN set -x \ - && curl -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ + && curl -LO https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ && echo "${OPENSSL_HASH} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c \ && tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \ && rm openssl-${OPENSSL_VERSION}.tar.gz \ diff --git a/external-libs/android32_x86.Dockerfile b/external-libs/android32_x86.Dockerfile index 4eb18e0a..e7129b1e 100644 --- a/external-libs/android32_x86.Dockerfile +++ b/external-libs/android32_x86.Dockerfile @@ -96,7 +96,7 @@ ARG OPENSSL_VERSION=3.0.5 ARG OPENSSL_HASH=aa7d8d9bef71ad6525c55ba11e5f4397889ce49c2c9349dcea6d3e4f0b024a7a # openssl explicitly demands to be built by a clang that has a "/prebuilt/" somewhere along its path, so use the prebuilt version, but make sure to specify the target android api RUN set -x \ - && curl -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ + && curl -LO https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ && echo "${OPENSSL_HASH} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c \ && tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \ && rm openssl-${OPENSSL_VERSION}.tar.gz \ diff --git a/external-libs/android64.Dockerfile b/external-libs/android64.Dockerfile index ffd9dd70..4c51378f 100644 --- a/external-libs/android64.Dockerfile +++ b/external-libs/android64.Dockerfile @@ -96,7 +96,7 @@ ARG OPENSSL_VERSION=3.0.5 ARG OPENSSL_HASH=aa7d8d9bef71ad6525c55ba11e5f4397889ce49c2c9349dcea6d3e4f0b024a7a # openssl explicitly demands to be built by a clang that has a "/prebuilt/" somewhere along its path, so use the prebuilt version, but make sure to specify the target android api RUN set -x \ - && curl -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ + && curl -LO https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ && echo "${OPENSSL_HASH} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c \ && tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \ && rm openssl-${OPENSSL_VERSION}.tar.gz \ diff --git a/external-libs/android64_x86.Dockerfile b/external-libs/android64_x86.Dockerfile index 60207e93..57ec3540 100644 --- a/external-libs/android64_x86.Dockerfile +++ b/external-libs/android64_x86.Dockerfile @@ -96,7 +96,7 @@ ARG OPENSSL_VERSION=3.0.5 ARG OPENSSL_HASH=aa7d8d9bef71ad6525c55ba11e5f4397889ce49c2c9349dcea6d3e4f0b024a7a # openssl explicitly demands to be built by a clang that has a "/prebuilt/" somewhere along its path, so use the prebuilt version, but make sure to specify the target android api RUN set -x \ - && curl -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ + && curl -LO https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ && echo "${OPENSSL_HASH} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c \ && tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \ && rm openssl-${OPENSSL_VERSION}.tar.gz \