Browse Source

support generic watch-only wallet (#34)

V1.2.0-btc-release
JunZhang 4 years ago
committed by GitHub
parent
commit
c0f91efb41
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      app/build.gradle
  2. 5
      app/src/main/java/com/cobo/cold/ui/fragment/main/AssetFragment.java
  3. 16
      app/src/main/java/com/cobo/cold/ui/fragment/main/ExportGenericXpubFragment.java
  4. 27
      app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtBroadcastTxFragment.java
  5. 32
      app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtSignedTxFragment.java
  6. 7
      app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtTxConfirmFragment.java
  7. 3
      app/src/main/java/com/cobo/cold/ui/fragment/main/TxListFragment.java
  8. 7
      app/src/main/java/com/cobo/cold/viewmodel/QrScanViewModel.java
  9. 30
      app/src/main/java/com/cobo/cold/viewmodel/WatchWallet.java
  10. 16
      app/src/main/res/layout/broadcast_psbt_tx_fragment.xml
  11. 4
      app/src/main/res/layout/electrum_tx_detail.xml
  12. 145
      app/src/main/res/layout/export_xpub_generic.xml
  13. 18
      app/src/main/res/navigation/nav_graph_main.xml
  14. 3
      app/src/main/res/values-zh-rCN/strings.xml
  15. 5
      app/src/main/res/values/strings.xml

2
app/build.gradle

@ -170,7 +170,7 @@ dependencies {
implementation 'net.lingala.zip4j:zip4j:1.3.2@jar'
implementation 'com.wei.android.lib:fingerprintidentify:1.2.6'
implementation 'com.github.donkingliang:ConsecutiveScroller:2.5.0'
implementation 'com.github.CoboVault:bc32-java:v0.05-alpha'
implementation 'com.github.CoboVault:bc32-java:v0.0.6-alpha'
annotationProcessor 'androidx.room:room-compiler:2.1.0'
implementation project(':encryption-core')

5
app/src/main/java/com/cobo/cold/ui/fragment/main/AssetFragment.java

@ -115,8 +115,7 @@ public class AssetFragment extends BaseFragment<AssetFragmentBinding>
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.asset_hasmore, menu);
if (watchWallet == WatchWallet.COBO
|| watchWallet == WatchWallet.BLUE) {
if (!watchWallet.supportSdcard()) {
menu.findItem(R.id.action_sdcard).setVisible(false);
}
super.onCreateOptionsMenu(menu, inflater);
@ -193,10 +192,10 @@ public class AssetFragment extends BaseFragment<AssetFragmentBinding>
private void showFileList() {
switch (watchWallet) {
case ELECTRUM:
case GENERIC:
navigate(R.id.action_to_txnListFragment);
break;
case WASABI:
case GENERIC:
navigate(R.id.action_to_psbtListFragment);
break;
}

16
app/src/main/java/com/cobo/cold/ui/fragment/main/ExportGenericXpubFragment.java

@ -27,8 +27,7 @@ import com.cobo.coinlib.Util;
import com.cobo.coinlib.utils.Coins;
import com.cobo.cold.R;
import com.cobo.cold.databinding.ExportSdcardModalBinding;
import com.cobo.cold.databinding.ExportXpubBinding;
import com.cobo.cold.ui.MainActivity;
import com.cobo.cold.databinding.ExportXpubGenericBinding;
import com.cobo.cold.ui.SetupVaultActivity;
import com.cobo.cold.ui.fragment.BaseFragment;
import com.cobo.cold.ui.modal.ModalDialog;
@ -44,13 +43,13 @@ import static com.cobo.cold.viewmodel.GlobalViewModel.showNoSdcardModal;
import static com.cobo.cold.viewmodel.GlobalViewModel.writeToSdcard;
public class ExportGenericXpubFragment extends BaseFragment<ExportXpubBinding> {
public class ExportGenericXpubFragment extends BaseFragment<ExportXpubGenericBinding> {
private JSONObject xpubInfo;
@Override
protected int setView() {
return R.layout.export_xpub;
return R.layout.export_xpub_generic;
}
@Override
@ -62,20 +61,19 @@ public class ExportGenericXpubFragment extends BaseFragment<ExportXpubBinding> {
exPub = convertExtpub(exPub, getAccount(mActivity));
xpubInfo.put("ExtPubKey", exPub);
mBinding.qrcode.setData(xpubInfo.toString());
mBinding.expub.setText(exPub);
} catch (JSONException e) {
e.printStackTrace();
}
mBinding.addressType.setText(getString(R.string.master_xpub,
GlobalViewModel.getAddressFormat(mActivity)));
mBinding.done.setOnClickListener(v -> {
if (mActivity instanceof SetupVaultActivity) {
navigate(R.id.action_to_setupCompleteFragment);
} else {
MainActivity activity = (MainActivity) mActivity;
activity.getNavController().popBackStack(R.id.assetFragment, false);
popBackStack(R.id.assetFragment, false);
}
});
mBinding.skip.setOnClickListener(v -> popBackStack(R.id.assetFragment,false));
mBinding.exportToSdcard.setOnClickListener(v -> {
Storage storage = Storage.createByEnvironment(mActivity);
if (storage == null || storage.getExternalDir() == null) {

27
app/src/main/java/com/cobo/cold/ui/fragment/main/BlueWalletBroadcastTxFragment.java → app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtBroadcastTxFragment.java

@ -23,24 +23,29 @@ import android.view.View;
import androidx.lifecycle.ViewModelProviders;
import com.cobo.cold.R;
import com.cobo.cold.databinding.BroadcastBlueTxFragmentBinding;
import com.cobo.cold.databinding.BroadcastPsbtTxFragmentBinding;
import com.cobo.cold.db.entity.TxEntity;
import com.cobo.cold.ui.fragment.BaseFragment;
import com.cobo.cold.ui.views.qrcode.DynamicQrCodeView;
import com.cobo.cold.viewmodel.CoinListViewModel;
import com.cobo.cold.viewmodel.WatchWallet;
import org.spongycastle.util.encoders.Base64;
import org.spongycastle.util.encoders.Hex;
import java.util.Objects;
public class BlueWalletBroadcastTxFragment extends BaseFragment<BroadcastBlueTxFragmentBinding> {
import static com.cobo.cold.ui.fragment.main.PsbtTxConfirmFragment.showExportPsbtDialog;
public class PsbtBroadcastTxFragment extends BaseFragment<BroadcastPsbtTxFragmentBinding> {
public static final String KEY_TXID = "txId";
private View.OnClickListener goHome = v -> popBackStack(R.id.assetFragment,false);
private TxEntity txEntity;
@Override
protected int setView() {
return R.layout.broadcast_blue_tx_fragment;
return R.layout.broadcast_psbt_tx_fragment;
}
@Override
@ -50,10 +55,25 @@ public class BlueWalletBroadcastTxFragment extends BaseFragment<BroadcastBlueTxF
mBinding.complete.setOnClickListener(goHome);
CoinListViewModel viewModel = ViewModelProviders.of(mActivity).get(CoinListViewModel.class);
viewModel.loadTx(data.getString(KEY_TXID)).observe(this, txEntity -> {
this.txEntity = txEntity;
mBinding.setCoinCode(txEntity.getCoinCode());
mBinding.qrcodeLayout.qrcode.setEncodingScheme(DynamicQrCodeView.EncodingScheme.Bc32);
mBinding.qrcodeLayout.qrcode.setData(Hex.toHexString(Base64.decode(txEntity.getSignedHex())));
});
WatchWallet wallet = WatchWallet.getWatchWallet(mActivity);
if (wallet.supportSdcard()) {
mBinding.qrcodeLayout.hint.setVisibility(View.GONE);
mBinding.exportToSdcard.setVisibility(View.VISIBLE);
mBinding.exportToSdcard.setOnClickListener(v ->
showExportPsbtDialog(mActivity, txEntity.getTxId(),
txEntity.getSignedHex(), null));
} else {
mBinding.exportToSdcard.setVisibility(View.GONE);
}
mBinding.scanHint.setText(getString(R.string.use_wallet_to_broadcast,
WatchWallet.getWatchWallet(mActivity).getWalletName(mActivity)));
}
@ -61,4 +81,5 @@ public class BlueWalletBroadcastTxFragment extends BaseFragment<BroadcastBlueTxF
protected void initData(Bundle savedInstanceState) {
}
}

32
app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtSignedTxFragment.java

@ -42,16 +42,36 @@ public class PsbtSignedTxFragment extends SignedTxFragment {
if (watchWallet == WatchWallet.WASABI) {
mBinding.txDetail.qr.setVisibility(View.GONE);
mBinding.txDetail.broadcastGuide.setVisibility(View.GONE);
} else if (watchWallet == WatchWallet.BLUE) {
mBinding.txDetail.info.setOnClickListener(v -> showBlueWalletInfo());
mBinding.txDetail.scanHint.setText(R.string.use_blue_to_broadcast);
} else if (watchWallet == WatchWallet.BLUE || watchWallet == WatchWallet.GENERIC) {
if (watchWallet == WatchWallet.BLUE) {
mBinding.txDetail.info.setOnClickListener(v -> showBlueWalletInfo());
}
mBinding.txDetail.scanHint.setText(mActivity.getString(R.string.use_wallet_to_broadcast,
watchWallet.getWalletName(mActivity)));
if (watchWallet.supportBc32QrCode()) {
mBinding.txDetail.dynamicQrcodeLayout.qrcode
.setEncodingScheme(DynamicQrCodeView.EncodingScheme.Bc32);
mBinding.txDetail.dynamicQrcodeLayout.qrcode
.setData(Hex.toHexString(Base64.decode(txEntity.getSignedHex())));
}
mBinding.txDetail.exportToSdcardHint.setVisibility(View.GONE);
mBinding.txDetail.qrcodeLayout.qrcode.setVisibility(View.GONE);
mBinding.txDetail.dynamicQrcodeLayout.qrcode.setVisibility(View.VISIBLE);
mBinding.txDetail.broadcastGuide.setVisibility(View.GONE);
mBinding.txDetail.export.setVisibility(View.GONE);
mBinding.txDetail.dynamicQrcodeLayout.qrcode.setEncodingScheme(DynamicQrCodeView.EncodingScheme.Bc32);
mBinding.txDetail.dynamicQrcodeLayout.qrcode.setData(Hex.toHexString(Base64.decode(txEntity.getSignedHex())));
if (!watchWallet.supportSdcard()) {
mBinding.txDetail.export.setVisibility(View.GONE);
}
if (watchWallet == WatchWallet.GENERIC) {
mBinding.txDetail.dynamicQrcodeLayout.hint.setVisibility(View.GONE);
mBinding.txDetail.info.setVisibility(View.INVISIBLE);
mBinding.txDetail.exportToSdcardHint.setVisibility(View.VISIBLE);
mBinding.txDetail.exportToSdcardHint.setText(R.string.generic_qrcode_hint);
mBinding.txDetail.exportToSdcardHint.setOnClickListener(v -> showExportDialog());
mBinding.txDetail.export.setVisibility(View.GONE);
}
}
}

7
app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtTxConfirmFragment.java

@ -36,7 +36,7 @@ import com.cobo.cold.viewmodel.WatchWallet;
import java.io.File;
import java.util.Objects;
import static com.cobo.cold.ui.fragment.main.BlueWalletBroadcastTxFragment.KEY_TXID;
import static com.cobo.cold.ui.fragment.main.PsbtBroadcastTxFragment.KEY_TXID;
import static com.cobo.cold.viewmodel.GlobalViewModel.exportSuccess;
import static com.cobo.cold.viewmodel.GlobalViewModel.hasSdcard;
import static com.cobo.cold.viewmodel.GlobalViewModel.showNoSdcardModal;
@ -92,10 +92,11 @@ public class PsbtTxConfirmFragment extends UnsignedTxFragment {
}
protected void onSignSuccess() {
if (WatchWallet.getWatchWallet(mActivity) == WatchWallet.BLUE) {
WatchWallet wallet = WatchWallet.getWatchWallet(mActivity);
if (wallet == WatchWallet.BLUE || wallet == WatchWallet.GENERIC) {
Bundle data = new Bundle();
data.putString(KEY_TXID,viewModel.getTxId());
navigate(R.id.action_to_blue_wallet_broadcast, data);
navigate(R.id.action_to_psbt_broadcast, data);
} else {
showExportPsbtDialog(mActivity, viewModel.getTxId(),
viewModel.getTxHex(), this::navigateUp);

3
app/src/main/java/com/cobo/cold/ui/fragment/main/TxListFragment.java

@ -70,7 +70,8 @@ public class TxListFragment extends BaseFragment<TxListBinding> {
Bundle bundle = new Bundle();
bundle.putString(KEY_TX_ID, tx.getTxId());
if (WASABI_SIGN_ID.equals(tx.getSignId())
|| BLUE_WALLET_SIGN_ID.equals(tx.getSignId())) {
|| BLUE_WALLET_SIGN_ID.equals(tx.getSignId())
|| GENERIC_WALLET_SIGN_ID.equals(tx.getSignId())) {
navigate(R.id.action_to_psbtSignedTxFragment, bundle);
} else if(ELECTRUM_SIGN_ID.equals(tx.getSignId())){
navigate(R.id.action_to_electrumTxFragment, bundle);

7
app/src/main/java/com/cobo/cold/viewmodel/QrScanViewModel.java

@ -88,7 +88,12 @@ public class QrScanViewModel extends AndroidViewModel {
e.printStackTrace();
}
if (!TextUtils.isEmpty(hex)) {
handleBc32Qrcode(hex);
WatchWallet wallet = WatchWallet.getWatchWallet(getApplication());
if (wallet.supportBc32QrCode()) {
handleBc32Qrcode(hex);
} else {
throw new UnknowQrCodeException("not support bc32 qrcode in current wallet mode");
}
}
} else {

30
app/src/main/java/com/cobo/cold/viewmodel/WatchWallet.java

@ -67,4 +67,34 @@ public enum WatchWallet {
default:return false;
}
}
public boolean supportBc32QrCode() {
switch (this) {
case GENERIC:
case BLUE:
return true;
default:return false;
}
}
public boolean supportQrCode() {
switch (this) {
case ELECTRUM:
case COBO:
case GENERIC:
case BLUE:
return true;
default:return false;
}
}
public boolean supportSdcard() {
switch (this) {
case ELECTRUM:
case GENERIC:
case WASABI:
return true;
default:return false;
}
}
}

16
app/src/main/res/layout/broadcast_blue_tx_fragment.xml → app/src/main/res/layout/broadcast_psbt_tx_fragment.xml

@ -79,11 +79,12 @@
android:paddingHorizontal="16dp">
<TextView
android:id="@+id/scan_hint"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/use_blue_to_broadcast"
android:text="@string/use_wallet_to_broadcast"
android:textColor="@color/white"
android:textSize="15sp"
android:textStyle="bold" />
@ -94,6 +95,19 @@
android:id="@+id/qrcode_layout"
layout="@layout/dynamic_qrcode" />
<com.cobo.cold.ui.views.SpanedTextView
android:id="@+id/export_to_sdcard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp"
android:paddingVertical="10dp"
android:gravity="center"
android:text="@string/electrum_qrcode_hint"
android:textColor="@color/white"
android:textSize="12sp"
android:visibility="gone"/>
<Button
android:id="@+id/complete"
style="@style/AcceptButton"

4
app/src/main/res/layout/electrum_tx_detail.xml

@ -335,9 +335,7 @@
android:id="@+id/export_to_sdcard_hint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:padding="16dp"
android:gravity="center"
android:text="@string/electrum_qrcode_hint"
android:textColor="@color/white"

145
app/src/main/res/layout/export_xpub_generic.xml

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (c) 2020 Cobo
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ in the file COPYING. If not, see <http://www.gnu.org/licenses/>.
-->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:navigationIcon="@drawable/arrow_left"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginEnd="20dp"
android:ellipsize="middle"
android:singleLine="true"
android:text="@string/export_wallet"
android:textColor="@android:color/white"
android:textSize="15sp" />
</androidx.appcompat.widget.Toolbar>
<include layout="@layout/divider" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginHorizontal="16dp"
android:text="@string/scan_qrcode_with_generic_wallet"
android:textColor="@color/white"
android:textSize="15sp"
android:textStyle="bold" />
</LinearLayout>
<com.cobo.cold.ui.views.qrcode.QrCodeView
android:id="@+id/qrcode"
android:layout_width="240dp"
android:layout_height="240dp"
android:layout_marginHorizontal="34dp"
android:layout_marginTop="16dp"
android:background="@color/white"
android:keepScreenOn="true"
android:padding="5dp">
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"
tools:ignore="ContentDescription" />
<ProgressBar
android:id="@+id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="visible" />
</com.cobo.cold.ui.views.qrcode.QrCodeView>
<com.cobo.cold.ui.views.SpanedTextView
android:id="@+id/export_to_sdcard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp"
android:paddingVertical="10dp"
android:gravity="center"
android:text="@string/generic_qrcode_hint"
android:textColor="@color/white"
android:textSize="12sp" />
<androidx.legacy.widget.Space
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/done"
android:layout_width="match_parent"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
style="@style/AcceptButton"
android:text="@string/complete"/>
<TextView
android:id="@+id/skip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="10dp"
android:textColor="@color/colorAccent"
android:gravity="center"
android:text="@string/skip_export"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
</layout>

18
app/src/main/res/navigation/nav_graph_main.xml

@ -339,8 +339,8 @@
<action
android:id="@id/action_to_psbtSignedTxFragment"
app:destination="@id/psbtSignedTxFragment" />
<action android:id="@+id/action_to_blue_wallet_broadcast"
app:destination="@+id/blueWalletBroadcastTxFragment"
<action android:id="@+id/action_to_psbt_broadcast"
app:destination="@id/psbtBroadcastTxFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@android:anim/slide_in_left"
@ -432,6 +432,12 @@
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@android:anim/slide_in_left"
app:popExitAnim="@android:anim/slide_out_right" />
<action android:id="@id/action_to_export_xpub_blue"
app:destination="@id/blueWalletExportFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@android:anim/slide_in_left"
app:popExitAnim="@android:anim/slide_out_right" />
</fragment>
<fragment
@ -723,9 +729,9 @@
tools:layout="@layout/blue_export"/>
<fragment
android:id="@+id/blueWalletBroadcastTxFragment"
android:name="com.cobo.cold.ui.fragment.main.BlueWalletBroadcastTxFragment"
android:label="BlueWalletBroadcastTxFragment"
tools:layout="@layout/broadcast_blue_tx_fragment"/>
android:id="@+id/psbtBroadcastTxFragment"
android:name="com.cobo.cold.ui.fragment.main.PsbtBroadcastTxFragment"
android:label="PsbtBroadcastTxFragment"
tools:layout="@layout/broadcast_psbt_tx_fragment"/>
</navigation>

3
app/src/main/res/values-zh-rCN/strings.xml

@ -294,7 +294,7 @@
<string name="electrum_import_xpub_action">在 Electrum 输入主公钥页面打开该文件</string>
<string name="transaction_source_label">观察钱包</string>
<string name="use_electrum_to_broadcast">请用 Electrum 扫描二维码广播</string>
<string name="use_blue_to_broadcast">请用 BlueWallet 扫描二维码广播</string>
<string name="use_wallet_to_broadcast">请用 %s 扫描二维码广播</string>
<string name="transaction_from_electrum">该笔交易热端来源于Electrum</string>
<string name="add_address">添加地址</string>
<string name="use_electrum_scan_xpub">请用 Electrum 扫描主公钥二维码</string>
@ -306,6 +306,7 @@
<string name="file_name_label">该文件的文件名为:</string>
<string name="master_xpub">主公钥(%s)</string>
<string name="electrum_qrcode_hint"><![CDATA[扫码困难?点击二维码进行放大<br>或<u>\点击此处导出文件\</u>]]></string>
<string name="generic_qrcode_hint"><![CDATA[扫码困难?点击二维码进行放大<br>无扫码功能?<u>\点击此处导出文件\</u>]]></string>
<string name="scan_electrum_hint">若扫描 Electrum 困难,可将待签交易导出成文件,点击首页的TF卡按钮,对文件签名。</string>
<string name="sign_txn_in_sdcard">对文件签名</string>
<string name="master_pubkey_not_match">该交易无法识别,您的 Cobo 金库与此观察钱包不匹配。</string>

5
app/src/main/res/values/strings.xml

@ -350,7 +350,7 @@
<string name="electrum_import_xpub_action">Open when inputting your master public key on Electrum.</string>
<string name="transaction_source_label">Wallet</string>
<string name="use_electrum_to_broadcast">Scan the QR code with Electrum to broadcast</string>
<string name="use_blue_to_broadcast">Scan the QR code by BlueWallet to broadcast</string>
<string name="use_wallet_to_broadcast">Scan the QR code by %s to broadcast</string>
<string name="transaction_from_electrum">This transaction is from Electrum</string>
<string name="add_address">Add Address</string>
<string name="use_electrum_scan_xpub">Scan master public key using Electrum</string>
@ -362,6 +362,7 @@
<string name="file_name_label">File name:</string>
<string name="master_xpub">Master Public Key (%s)</string>
<string name="electrum_qrcode_hint"><![CDATA[Difficulty scanning?Tap the QR code to enlarge<br>or <u>touch here to export the file with microSD</u>.]]></string>
<string name="generic_qrcode_hint"><![CDATA[Difficulty scanning?Tap the QR code to enlarge<br>No scanning? <u>touch here to export the file with microSD</u>.]]></string>
<string name="scan_electrum_hint">Difficulty scanning? You can import pending transactions from Electrum using a microSD card (Menu > MicroSD Card).</string>
<string name="sign_txn_in_sdcard">Unsigned Transaction Files</string>
<string name="master_pubkey_not_match">Transaction not recognized. Your Cobo Vault has not been successfully paired with the watch-only wallet.</string>
@ -431,7 +432,7 @@
]]></string>
<string name="show_master_public_key_qrcode">Display Master Public Key QR Code</string>
<string name="show_qrcode">Display QR Code</string>
<string name="export_wallet">Export with MicroSD</string>
<string name="export_wallet">Export Wallet</string>
<string name="native_segwit">Native SegWit</string>
<string name="p2pkh">Pay To Public Key Hash</string>
<string name="nested_segwit">Nested SegWit</string>

Loading…
Cancel
Save