From 6addd4a8c3dafed3bd72c6432202eed1dadedfa9 Mon Sep 17 00:00:00 2001 From: Victor Sima Date: Thu, 2 Mar 2023 17:04:36 -0500 Subject: [PATCH] Add seed recovery to settings --- .../activities/settings/SettingsActivity.java | 6 + ...minder.kt => FragmentRecoverSeedPhrase.kt} | 37 +- .../tools/animation/BRAnimator.java | 34 +- .../breadwallet/wallet/BRWalletManager.java | 118 +-- ...r.xml => fragment_recover_seed_phrase.xml} | 18 +- app/src/main/res/values/strings.xml | 909 +++++++++--------- 6 files changed, 542 insertions(+), 580 deletions(-) rename app/src/main/java/com/breadwallet/presenter/fragments/{FragmentBalanceSeedReminder.kt => FragmentRecoverSeedPhrase.kt} (73%) rename app/src/main/res/layout/{fragment_balance_seed_reminder.xml => fragment_recover_seed_phrase.xml} (89%) diff --git a/app/src/main/java/com/breadwallet/presenter/activities/settings/SettingsActivity.java b/app/src/main/java/com/breadwallet/presenter/activities/settings/SettingsActivity.java index 715783336..8aacc99bc 100644 --- a/app/src/main/java/com/breadwallet/presenter/activities/settings/SettingsActivity.java +++ b/app/src/main/java/com/breadwallet/presenter/activities/settings/SettingsActivity.java @@ -20,6 +20,7 @@ import com.breadwallet.presenter.activities.util.BRActivity; import com.breadwallet.presenter.entities.BRSettingsItem; import com.breadwallet.presenter.interfaces.BRAuthCompletion; +import com.breadwallet.tools.animation.BRAnimator; import com.breadwallet.tools.manager.BRSharedPrefs; import com.breadwallet.tools.security.AuthManager; import com.platform.APIClient; @@ -126,6 +127,11 @@ private void populateItems() { }, false)); + // recover seed phrase + items.add(new BRSettingsItem(getString(R.string.Settings_recover_seed), "", v -> { + BRAnimator.showBalanceSeedFragment(this); + }, false)); + /*Wipe Start_Recover Wallet*/ items.add(new BRSettingsItem(getString(R.string.Settings_wipe), "", v -> { Intent intent = new Intent(SettingsActivity.this, WipeActivity.class); diff --git a/app/src/main/java/com/breadwallet/presenter/fragments/FragmentBalanceSeedReminder.kt b/app/src/main/java/com/breadwallet/presenter/fragments/FragmentRecoverSeedPhrase.kt similarity index 73% rename from app/src/main/java/com/breadwallet/presenter/fragments/FragmentBalanceSeedReminder.kt rename to app/src/main/java/com/breadwallet/presenter/fragments/FragmentRecoverSeedPhrase.kt index 6d6c6c0e6..beef57a63 100644 --- a/app/src/main/java/com/breadwallet/presenter/fragments/FragmentBalanceSeedReminder.kt +++ b/app/src/main/java/com/breadwallet/presenter/fragments/FragmentRecoverSeedPhrase.kt @@ -1,7 +1,9 @@ package com.breadwallet.presenter.fragments +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,39 +12,28 @@ import android.widget.* import androidx.fragment.app.Fragment import com.breadwallet.R import com.breadwallet.tools.animation.BRAnimator -import com.breadwallet.tools.security.BRKeyStore -import com.breadwallet.tools.util.BRConstants -import com.breadwallet.tools.util.Bip39Reader import com.breadwallet.wallet.BRWalletManager -import java.util.* -import kotlin.math.log -class FragmentBalanceSeedReminder : Fragment() { +class FragmentRecoverSeedPhrase : Fragment() { private lateinit var backgroundLayout: ScrollView private lateinit var signalLayout: LinearLayout private lateinit var showSeedButton: Button - private lateinit var currentBalanceTextView: TextView private lateinit var seedPhraseTextView: TextView private lateinit var closeButton: View - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - - val rootView = inflater.inflate(R.layout.fragment_balance_seed_reminder, container, false) + val rootView = inflater.inflate(R.layout.fragment_recover_seed_phrase, container, false) backgroundLayout = rootView.findViewById(R.id.background_layout) signalLayout = rootView.findViewById(R.id.signal_layout) signalLayout = rootView.findViewById(R.id.signal_layout) as LinearLayout - currentBalanceTextView = rootView.findViewById(R.id.current_balance) seedPhraseTextView = rootView.findViewById(R.id.seed_phrase) closeButton = rootView.findViewById(R.id.close_button) showSeedButton = rootView.findViewById(R.id.show_seed_button) -// signalLayout.layoutTransition = BRAnimator.getDefaultTransition() - return rootView } @@ -66,28 +57,32 @@ class FragmentBalanceSeedReminder : Fragment() { observer.removeOnGlobalLayoutListener(this) } BRAnimator.animateBackgroundDim(backgroundLayout, false) - BRAnimator.animateSignalSlide(signalLayout, false) { -// val bundle = arguments -// if (bundle?.getString("url") != null) setUrl(bundle.getString("url")) - } + BRAnimator.animateSignalSlide(signalLayout, false) {} } }) setListeners() fetchWalletInfo() } + fun fetchWalletInfo() { val walletManager = BRWalletManager.getInstance() - val balance = walletManager.getBalance(requireContext()) - currentBalanceTextView.text = "$balance" seedPhraseTextView.text = walletManager.getSeedPhrase(requireContext()) + seedPhraseTextView.setOnClickListener { + if (it.visibility != View.VISIBLE) return@setOnClickListener + val clipboardManager = + requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipData = ClipData.newPlainText("seed phrase", seedPhraseTextView.text) + clipboardManager.setPrimaryClip(clipData) + } } private fun animateClose() { BRAnimator.animateBackgroundDim(backgroundLayout, true) BRAnimator.animateSignalSlide(signalLayout, true) { close() } } + private fun close() { - if(activity != null && activity?.isFinishing != true) { + if (activity != null && activity?.isFinishing != true) { activity?.onBackPressed() } } diff --git a/app/src/main/java/com/breadwallet/tools/animation/BRAnimator.java b/app/src/main/java/com/breadwallet/tools/animation/BRAnimator.java index bf6cb86f2..ce5981ca8 100644 --- a/app/src/main/java/com/breadwallet/tools/animation/BRAnimator.java +++ b/app/src/main/java/com/breadwallet/tools/animation/BRAnimator.java @@ -18,7 +18,6 @@ import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.view.animation.OvershootInterpolator; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -29,12 +28,11 @@ import com.breadwallet.R; import com.breadwallet.presenter.activities.BreadActivity; import com.breadwallet.presenter.activities.LoginActivity; -import com.breadwallet.presenter.activities.camera.CameraActivity; import com.breadwallet.presenter.activities.camera.ScanQRActivity; import com.breadwallet.presenter.customviews.BRDialogView; import com.breadwallet.presenter.entities.TxItem; import com.breadwallet.presenter.fragments.DynamicDonationFragment; -import com.breadwallet.presenter.fragments.FragmentBalanceSeedReminder; +import com.breadwallet.presenter.fragments.FragmentRecoverSeedPhrase; import com.breadwallet.presenter.fragments.FragmentBuy; import com.breadwallet.presenter.fragments.FragmentGreetings; import com.breadwallet.presenter.fragments.FragmentMenu; @@ -79,33 +77,21 @@ public static void showBalanceSeedFragment(@NonNull FragmentActivity app) { Timber.d("timber: fetched info"); androidx.fragment.app.FragmentManager fragmentManager = app.getSupportFragmentManager(); - FragmentBalanceSeedReminder fragmentBalanceSeedReminder = (FragmentBalanceSeedReminder) fragmentManager.findFragmentByTag(FragmentBalanceSeedReminder.class.getName()); - if (fragmentBalanceSeedReminder != null) { - fragmentBalanceSeedReminder.fetchWalletInfo(); + FragmentRecoverSeedPhrase fragmentRecoverSeedPhrase = (FragmentRecoverSeedPhrase) fragmentManager.findFragmentByTag(FragmentRecoverSeedPhrase.class.getName()); + if (fragmentRecoverSeedPhrase != null) { + fragmentRecoverSeedPhrase.fetchWalletInfo(); Timber.d("timber: fetched info"); return; } - try { - fragmentBalanceSeedReminder = new FragmentBalanceSeedReminder(); - fragmentManager.beginTransaction() - .setCustomAnimations(0, 0, 0, R.animator.plain_300) - .add(android.R.id.content, fragmentBalanceSeedReminder, FragmentBalanceSeedReminder.class.getName()) - .addToBackStack(FragmentBalanceSeedReminder.class.getName()).commit(); - } finally { - } + fragmentRecoverSeedPhrase = new FragmentRecoverSeedPhrase(); + fragmentManager.beginTransaction() + .setCustomAnimations(0, 0, 0, R.animator.plain_300) + .add(android.R.id.content, fragmentRecoverSeedPhrase, FragmentRecoverSeedPhrase.class.getName()) + .addToBackStack(FragmentRecoverSeedPhrase.class.getName()).commit(); + } -// app.getSupportFragmentManager().beginTransaction() -// .setCustomAnimations(0, 0, 0, R.animator.plain_300) -// .add(android.R.id.content, new FragmentBalanceSeedReminder(), FragmentBalanceSeedReminder.class.getName()) -// .addToBackStack(FragmentBalanceSeedReminder.class.getName()) -// .commit(); - - - - - } public static void showSendFragment(FragmentActivity app, final String bitcoinUrl) { if (app == null) { Timber.i("timber: showSendFragment: app is null"); diff --git a/app/src/main/java/com/breadwallet/wallet/BRWalletManager.java b/app/src/main/java/com/breadwallet/wallet/BRWalletManager.java index dea5b24ab..159f42486 100644 --- a/app/src/main/java/com/breadwallet/wallet/BRWalletManager.java +++ b/app/src/main/java/com/breadwallet/wallet/BRWalletManager.java @@ -19,7 +19,6 @@ import android.widget.Toast; import androidx.annotation.WorkerThread; -import androidx.fragment.app.FragmentActivity; import com.breadwallet.BreadApp; import com.breadwallet.R; @@ -55,8 +54,6 @@ import com.breadwallet.tools.util.Utils; import com.platform.entities.WalletInfo; -import org.jetbrains.annotations.Nullable; - import java.math.BigDecimal; import java.security.SecureRandom; import java.util.ArrayList; @@ -494,77 +491,68 @@ public void initWallet(final Context ctx) { BRWalletManager m = BRWalletManager.getInstance(); final BRPeerManager pm = BRPeerManager.getInstance(); - // int currentBalance = (int) m.getBalance(); - // Timber.i("timber: wallet manager balance %d", currentBalance); - - BRAnimator.showBalanceSeedFragment((FragmentActivity) ctx); - Timber.d("timber: Showing seed fragment"); -// if (m.isCreated() && pm.isCreated()) { -// BRAnimator.showBalanceSeedFragment((FragmentActivity) ctx); -// Timber.i("timber: Showing seed fragment"); -// } - if (!m.isCreated()) { - List transactions = TransactionDataSource.getInstance(ctx).getAllTransactions(); - int transactionsCount = transactions.size(); - if (transactionsCount > 0) { - m.createTxArrayWithCount(transactionsCount); - for (BRTransactionEntity entity : transactions) { - m.putTransaction(entity.getBuff(), entity.getBlockheight(), entity.getTimestamp()); - } + if (!m.isCreated()) { + List transactions = TransactionDataSource.getInstance(ctx).getAllTransactions(); + int transactionsCount = transactions.size(); + if (transactionsCount > 0) { + m.createTxArrayWithCount(transactionsCount); + for (BRTransactionEntity entity : transactions) { + m.putTransaction(entity.getBuff(), entity.getBlockheight(), entity.getTimestamp()); } + } - byte[] pubkeyEncoded = BRKeyStore.getMasterPublicKey(ctx); - if (Utils.isNullOrEmpty(pubkeyEncoded)) { - Timber.i("timber: initWallet: pubkey is missing"); - return; - } - //Save the first address for future check - m.createWallet(transactionsCount, pubkeyEncoded); - String firstAddress = BRWalletManager.getFirstAddress(pubkeyEncoded); - BRSharedPrefs.putFirstAddress(ctx, firstAddress); - FeeManager feeManager = FeeManager.getInstance(); - if (feeManager.isRegularFee()) { - Fee fees = feeManager.getFees(); - BRWalletManager.getInstance().setFeePerKb(fees.regular); - } + byte[] pubkeyEncoded = BRKeyStore.getMasterPublicKey(ctx); + if (Utils.isNullOrEmpty(pubkeyEncoded)) { + Timber.i("timber: initWallet: pubkey is missing"); + return; + } + //Save the first address for future check + m.createWallet(transactionsCount, pubkeyEncoded); + String firstAddress = BRWalletManager.getFirstAddress(pubkeyEncoded); + BRSharedPrefs.putFirstAddress(ctx, firstAddress); + FeeManager feeManager = FeeManager.getInstance(); + if (feeManager.isRegularFee()) { + Fee fees = feeManager.getFees(); + BRWalletManager.getInstance().setFeePerKb(fees.regular); } + } - if (!pm.isCreated()) { - List blocks = MerkleBlockDataSource.getInstance(ctx).getAllMerkleBlocks(); - List peers = PeerDataSource.getInstance(ctx).getAllPeers(); - final int blocksCount = blocks.size(); - final int peersCount = peers.size(); - if (blocksCount > 0) { - pm.createBlockArrayWithCount(blocksCount); - for (BRMerkleBlockEntity entity : blocks) { - pm.putBlock(entity.getBuff(), entity.getBlockHeight()); - } + if (!pm.isCreated()) { + List blocks = MerkleBlockDataSource.getInstance(ctx).getAllMerkleBlocks(); + List peers = PeerDataSource.getInstance(ctx).getAllPeers(); + final int blocksCount = blocks.size(); + final int peersCount = peers.size(); + if (blocksCount > 0) { + pm.createBlockArrayWithCount(blocksCount); + for (BRMerkleBlockEntity entity : blocks) { + pm.putBlock(entity.getBuff(), entity.getBlockHeight()); } - if (peersCount > 0) { - pm.createPeerArrayWithCount(peersCount); - for (BRPeerEntity entity : peers) { - pm.putPeer(entity.getAddress(), entity.getPort(), entity.getTimeStamp()); - } + } + if (peersCount > 0) { + pm.createPeerArrayWithCount(peersCount); + for (BRPeerEntity entity : peers) { + pm.putPeer(entity.getAddress(), entity.getPort(), entity.getTimeStamp()); } - Timber.d("timber: blocksCount before connecting: %s", blocksCount); - Timber.d("timber: peersCount before connecting: %s", peersCount); + } + Timber.d("timber: blocksCount before connecting: %s", blocksCount); + Timber.d("timber: peersCount before connecting: %s", peersCount); - int walletTime = BRKeyStore.getWalletCreationTime(ctx); + int walletTime = BRKeyStore.getWalletCreationTime(ctx); - Timber.d("timber: initWallet: walletTime: %s", walletTime); - pm.create(walletTime, blocksCount, peersCount); - BRPeerManager.getInstance().updateFixedPeer(ctx); - } + Timber.d("timber: initWallet: walletTime: %s", walletTime); + pm.create(walletTime, blocksCount, peersCount); + BRPeerManager.getInstance().updateFixedPeer(ctx); + } - pm.connect(); - if (BRSharedPrefs.getStartHeight(ctx) == 0) { - BRExecutor.getInstance().forLightWeightBackgroundTasks().execute(new Runnable() { - @Override - public void run() { - BRSharedPrefs.putStartHeight(ctx, BRPeerManager.getCurrentBlockHeight()); - } - }); - } + pm.connect(); + if (BRSharedPrefs.getStartHeight(ctx) == 0) { + BRExecutor.getInstance().forLightWeightBackgroundTasks().execute(new Runnable() { + @Override + public void run() { + BRSharedPrefs.putStartHeight(ctx, BRPeerManager.getCurrentBlockHeight()); + } + }); + } } finally { diff --git a/app/src/main/res/layout/fragment_balance_seed_reminder.xml b/app/src/main/res/layout/fragment_recover_seed_phrase.xml similarity index 89% rename from app/src/main/res/layout/fragment_balance_seed_reminder.xml rename to app/src/main/res/layout/fragment_recover_seed_phrase.xml index 86a1c3d7a..32b12f2f4 100644 --- a/app/src/main/res/layout/fragment_balance_seed_reminder.xml +++ b/app/src/main/res/layout/fragment_recover_seed_phrase.xml @@ -85,23 +85,10 @@ android:layout_width="match_parent" android:layout_height="240dp" android:orientation="vertical"> - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fc50d2b0d..94eb6e966 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,437 +1,437 @@ - - - Website - - Made by the Litewallet Team of the Litecoin Foundation\n%1$s - - %1$s - - Privacy Policy - - Instagram - - Terms of Use - - About - - Twitter - - Close - - Support Center - - Loading Wallet - - My Litewallet - - It looks like you are using a third-party keyboard, which can record what you type and steal your Paper Key. Please switch to the default Android keyboard for extra protection. - - Error - - There is a problem with your Android OS keystore, please contact litewallet@litecoinfoundation.net - - Your Litewallet encrypted data was recently invalidated because your Android lock screen was disabled. - - Android KeyStore Error - - No internet connection found. Check your connection and try again. - - Warning - - Addresses Copied - - All wallet addresses successfully copied. - - Paper Key Set - - Awesome! - - PIN Set - - Send failed - - Send Confirmation - - Money Sent! - - Fingerprint recognized - - JSON Serialization Error - - Wallet not ready - - Unable to retrieve API token - - Cancel - - Ignore - - menu - - No - - OK - - receive - - send - - Settings - - Submit - - Yes - - Amount to Send: - - Network Fee: - - Processing time: This transaction is predicted to complete in %1$s. - - Send - - Confirmation - - To - - Total Cost: - - To make sure everything was written down correctly, please enter the following words from your paper key. - - Word #%1$s - - Litecoin Display Unit - - Exchange Rate - - This device isn\'t configured to send email with the iOS mail app. - - Email Unavailable - - Litewallet can not be authenticated due to a bug in your version of Android. [Please tap here for more information.] - - This device isn\'t configured to send messages. - - Messaging Unavailable - - Fingerprint not recognized. Please try again. - - Economy - - 10+ minutes - - This option is not recommended for time-sensitive transactions. - - Estimated Delivery: %1$s - - Regular - - 2.5 - 5+ minutes - - Processing Speed - - Checking private key balance... - - Send %1$s from this private key into your wallet? The Litecoin network will receive a fee of %2$s. - - This private key is already in your wallet. - - This private key is empty. - - Transaction fees would cost more than the funds available on this private key. - - Not a valid private key - - Error signing transaction - - Import - - Importing Wallet - - Wallet to be imported - - Importing a wallet transfers all the money from your other wallet into your Litewallet using a single transaction. - - This private key is password protected. - - password - - Your Litewallet - - Scan Private Key - - Success - - Successfully imported wallet. - - Import Wallet - - Unlocking Key - - Importing a wallet does not include transaction history or other details. - - Wrong password, please try again. - - - Ignore - - DEVICE SECURITY COMPROMISED\n Any \'jailbreak\' app can access keychain data and steal your Litecoin! Wipe this wallet immediately and restore on a secure device. - - DEVICE SECURITY COMPROMISED\n Any \'jailbreak\' app can access keychain data and steal your Litecoin. Please only use Litewallet on a non-jailbroken device. - - WARNING - - Location services are disabled. - - Litewallet does not have permission to access location services. - - You created your wallet on %1$s - - Your wallet name only appears in your account transaction history and cannot be seen by anyone else. - - Wallet Name - - Manage Wallet - - Buy - - Lock Wallet - - Security Center - - Settings - - Customer support - - Create New Wallet - - Menu - - Recover Wallet - - Switch to Automatic Mode - - Connected - - Enter Node IP address and port (optional) - - Enter Node - - Switch to Manual Mode - - Current Primary Node - - Not Connected - - Node Connection Status - - Litecoin Nodes - - Bad Payment Request - - Unsupported or corrupted document - - missing certificate - - request expired - - Couldn\'t make payment - - Litecoin payments can\'t be less than %1$s. - - Litecoin transaction outputs can\'t be less than %1$s. - - unsupported signature type - - untrusted certificate - - A device passcode is needed to safeguard your wallet. Go to settings and turn passcode on. - - Turn device passcode on - - A device screen lock is needed to safeguard your wallet. Go to \"Settings\" > \"Security\" > \"Screen lock\" and enable to continue. - - Screen lock disabled - - Your Paper Key must be saved in case you ever lose or change your phone. Tap here to continue. - - Action Required - - Your wallet may be out of sync. This can often be fixed by rescanning the blockchain. - - Transaction Rejected - - Help improve Litewallet by sharing your anonymous data with us - - Share Anonymous Data - - Tap here to enable Touch ID - - Tap here to enable fingerprint authentication - - Enable Touch ID - - Enable Fingerprint Authentication - - PIN - - Litewallet has upgraded to using a 6-digit PIN. Tap here to upgrade. - - Upgrade PIN - - Turn on notifications to receive special messages from Litewallet in the future. - - Push Notifications - - Off - - On - - Notifications - - Copied to clipboard. - - Email - - Request an Amount - - Share - - Text Message - - Receive - - Done - - Recover Wallet - - Reset PIN - - Enter Paper Key - - Recover your Litewallet with your paper key. - - The paper key you entered is invalid. Please double-check each word and try again. - - Left Arrow - - Next - - Tap here for more information. - - Right Arrow - - Enter the paper key for the wallet you want to recover. - - To reset your PIN, enter the words from your paper key into the boxes below. - - Please enter an amount first. - - Request an Amount - - Sync - - You will not be able to send money while syncing. - - Sync with Blockchain? - - 20-45 minutes - - If a transaction shows as completed on the Litecoin network but not in your Litewallet. - - You repeatedly get an error saying your transaction was rejected. - - Start Sync - - You will not be able to send money while syncing with the blockchain. - - Sync Blockchain - - Estimated time - - When to Sync? - - Camera Flash - - complete - - pending - - received - - sent - - Enable all security features for maximum protection. - - The only way to access your Litecoin if you lose or upgrade your phone. - - Paper Key - - Protects your Litewallet from unauthorized users. - - 6-Digit PIN - - Security Center - - Conveniently unlock your Litewallet and send money up to a set limit. - - Touch ID - - Fingerprint Authentication - - Amount - - Balance: %1$s - - Allow camera access in \"Settings\" > \"Apps\" > \"Litewallet\" > \"Permissions\" - - Litewallet is not allowed to access the camera - - Go to Settings to allow camera access. - - Litewallet is not allowed to access the camera - - The destination is your own address. You cannot send to yourself. - - Could not create transaction. - - Memo - - Pasteboard is empty - - Network Fee: %1$s - - Payee identity isn\'t certified. - - The destination address is not a valid Litecoin address. - - Pasteboard does not contain a valid Litecoin address. - - Invalid Address - - Sending is disabled during a full rescan. - - Loading Request - - Please enter the recipient\'s address. - - Please enter an amount to send. - - Paste - - Could not publish transaction. - - Could not load payment request - - Scan - - Send - - Send - - Enter a Litecoin address + + + Website + + Made by the Litewallet Team of the Litecoin Foundation\n%1$s + + %1$s + + Privacy Policy + + Instagram + + Terms of Use + + About + + Twitter + + Close + + Support Center + + Loading Wallet + + My Litewallet + + It looks like you are using a third-party keyboard, which can record what you type and steal your Paper Key. Please switch to the default Android keyboard for extra protection. + + Error + + There is a problem with your Android OS keystore, please contact litewallet@litecoinfoundation.net + + Your Litewallet encrypted data was recently invalidated because your Android lock screen was disabled. + + Android KeyStore Error + + No internet connection found. Check your connection and try again. + + Warning + + Addresses Copied + + All wallet addresses successfully copied. + + Paper Key Set + + Awesome! + + PIN Set + + Send failed + + Send Confirmation + + Money Sent! + + Fingerprint recognized + + JSON Serialization Error + + Wallet not ready + + Unable to retrieve API token + + Cancel + + Ignore + + menu + + No + + OK + + receive + + send + + Settings + + Submit + + Yes + + Amount to Send: + + Network Fee: + + Processing time: This transaction is predicted to complete in %1$s. + + Send + + Confirmation + + To + + Total Cost: + + To make sure everything was written down correctly, please enter the following words from your paper key. + + Word #%1$s + + Litecoin Display Unit + + Exchange Rate + + This device isn\'t configured to send email with the iOS mail app. + + Email Unavailable + + Litewallet can not be authenticated due to a bug in your version of Android. [Please tap here for more information.] + + This device isn\'t configured to send messages. + + Messaging Unavailable + + Fingerprint not recognized. Please try again. + + Economy + + 10+ minutes + + This option is not recommended for time-sensitive transactions. + + Estimated Delivery: %1$s + + Regular + + 2.5 - 5+ minutes + + Processing Speed + + Checking private key balance... + + Send %1$s from this private key into your wallet? The Litecoin network will receive a fee of %2$s. + + This private key is already in your wallet. + + This private key is empty. + + Transaction fees would cost more than the funds available on this private key. + + Not a valid private key + + Error signing transaction + + Import + + Importing Wallet + + Wallet to be imported + + Importing a wallet transfers all the money from your other wallet into your Litewallet using a single transaction. + + This private key is password protected. + + password + + Your Litewallet + + Scan Private Key + + Success + + Successfully imported wallet. + + Import Wallet + + Unlocking Key + + Importing a wallet does not include transaction history or other details. + + Wrong password, please try again. + + + Ignore + + DEVICE SECURITY COMPROMISED\n Any \'jailbreak\' app can access keychain data and steal your Litecoin! Wipe this wallet immediately and restore on a secure device. + + DEVICE SECURITY COMPROMISED\n Any \'jailbreak\' app can access keychain data and steal your Litecoin. Please only use Litewallet on a non-jailbroken device. + + WARNING + + Location services are disabled. + + Litewallet does not have permission to access location services. + + You created your wallet on %1$s + + Your wallet name only appears in your account transaction history and cannot be seen by anyone else. + + Wallet Name + + Manage Wallet + + Buy + + Lock Wallet + + Security Center + + Settings + + Customer support + + Create New Wallet + + Menu + + Recover Wallet + + Switch to Automatic Mode + + Connected + + Enter Node IP address and port (optional) + + Enter Node + + Switch to Manual Mode + + Current Primary Node + + Not Connected + + Node Connection Status + + Litecoin Nodes + + Bad Payment Request + + Unsupported or corrupted document + + missing certificate + + request expired + + Couldn\'t make payment + + Litecoin payments can\'t be less than %1$s. + + Litecoin transaction outputs can\'t be less than %1$s. + + unsupported signature type + + untrusted certificate + + A device passcode is needed to safeguard your wallet. Go to settings and turn passcode on. + + Turn device passcode on + + A device screen lock is needed to safeguard your wallet. Go to \"Settings\" > \"Security\" > \"Screen lock\" and enable to continue. + + Screen lock disabled + + Your Paper Key must be saved in case you ever lose or change your phone. Tap here to continue. + + Action Required + + Your wallet may be out of sync. This can often be fixed by rescanning the blockchain. + + Transaction Rejected + + Help improve Litewallet by sharing your anonymous data with us + + Share Anonymous Data + + Tap here to enable Touch ID + + Tap here to enable fingerprint authentication + + Enable Touch ID + + Enable Fingerprint Authentication + + PIN + + Litewallet has upgraded to using a 6-digit PIN. Tap here to upgrade. + + Upgrade PIN + + Turn on notifications to receive special messages from Litewallet in the future. + + Push Notifications + + Off + + On + + Notifications + + Copied to clipboard. + + Email + + Request an Amount + + Share + + Text Message + + Receive + + Done + + Recover Wallet + + Reset PIN + + Enter Paper Key + + Recover your Litewallet with your paper key. + + The paper key you entered is invalid. Please double-check each word and try again. + + Left Arrow + + Next + + Tap here for more information. + + Right Arrow + + Enter the paper key for the wallet you want to recover. + + To reset your PIN, enter the words from your paper key into the boxes below. + + Please enter an amount first. + + Request an Amount + + Sync + + You will not be able to send money while syncing. + + Sync with Blockchain? + + 20-45 minutes + + If a transaction shows as completed on the Litecoin network but not in your Litewallet. + + You repeatedly get an error saying your transaction was rejected. + + Start Sync + + You will not be able to send money while syncing with the blockchain. + + Sync Blockchain + + Estimated time + + When to Sync? + + Camera Flash + + complete + + pending + + received + + sent + + Enable all security features for maximum protection. + + The only way to access your Litecoin if you lose or upgrade your phone. + + Paper Key + + Protects your Litewallet from unauthorized users. + + 6-Digit PIN + + Security Center + + Conveniently unlock your Litewallet and send money up to a set limit. + + Touch ID + + Fingerprint Authentication + + Amount + + Balance: %1$s + + Allow camera access in \"Settings\" > \"Apps\" > \"Litewallet\" > \"Permissions\" + + Litewallet is not allowed to access the camera + + Go to Settings to allow camera access. + + Litewallet is not allowed to access the camera + + The destination is your own address. You cannot send to yourself. + + Could not create transaction. + + Memo + + Pasteboard is empty + + Network Fee: %1$s + + Payee identity isn\'t certified. + + The destination address is not a valid Litecoin address. + + Pasteboard does not contain a valid Litecoin address. + + Invalid Address + + Sending is disabled during a full rescan. + + Loading Request + + Please enter the recipient\'s address. + + Please enter an amount to send. + + Paste + + Could not publish transaction. + + Could not load payment request + + Scan + + Send + + Send + + Enter a Litecoin address Enter a .crypto, .wallet, .zil, .nft, .blockchain,\n.bitcoin, .coin, .888, .dao, or .x domain. @@ -480,6 +480,7 @@ Wallet Start/Recover Another Wallet + Recover Seed Phrase Help improve Litewallet by sharing your anonymous data with us. This does not include any financial information. We respect your financial privacy. @@ -723,10 +724,10 @@ This option virtually guarantees acceptance of your transaction though you are paying a premium. - Simplex + Simplex "• Get Litecoin in 5 mins!\n• Buy Litecoin via credit card\n• Passport or State ID" - Moonpay + Moonpay "• Buy LTC with many fiat pairs\n• Pay with multiple methods\n• Global payment provider" Bitrefill @@ -788,28 +789,28 @@ Balance - - "- Registration & Login\n- Available card balance\n- Reset password\n- No transfer to Litewallet\n- US Only" - - "Litecoin Card currently has limited functionality in Litewallet." - - "Visit litecoin.getblockcard.com for full access" - - "Litecoin Card Beta" - 1 LTC = %1$s - Current LTC value in %1$s - Languages - Close + + "- Registration & Login\n- Available card balance\n- Reset password\n- No transfer to Litewallet\n- US Only" + + "Litecoin Card currently has limited functionality in Litewallet." + + "Visit litecoin.getblockcard.com for full access" + + "Litecoin Card Beta" + 1 LTC = %1$s + Current LTC value in %1$s + Languages + Close - - Donate to the Litecoin Foundation - We appreciate your donation to the Litecoin Foundation. Donations are final and can not be refunded. Thanks for your continuing support. - Donate - Cancel - Donate to: Litewallet Infrastructure + + Donate to the Litecoin Foundation + We appreciate your donation to the Litecoin Foundation. Donations are final and can not be refunded. Thanks for your continuing support. + Donate + Cancel + Donate to: Litewallet Infrastructure Instagram - Balance and Seed - Current Balance: %d + Recover Seed Phrase + Current Balance: %d 1: %s 2: %s 3: %s 4: %s \\n5: %s 6: %s 7: %s 8: %s%s \\n9: %s 10: %s 11: %s 12: %s %s Show me my seed phrase