diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/main/AssetFragment.java b/app/src/main/java/com/cobo/cold/ui/fragment/main/AssetFragment.java index 2c8e6bc..de7ac55 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/main/AssetFragment.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/main/AssetFragment.java @@ -60,6 +60,7 @@ import java.util.stream.IntStream; import static androidx.fragment.app.FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT; import static com.cobo.cold.ui.fragment.Constants.KEY_COIN_ID; import static com.cobo.cold.viewmodel.GlobalViewModel.getAddressType; +import static com.cobo.cold.viewmodel.WatchWallet.getWatchWallet; public class AssetFragment extends BaseFragment implements NumberPickerCallback { @@ -78,7 +79,7 @@ public class AssetFragment extends BaseFragment @Override protected void init(View view) { coinId = Coins.BTC.coinId(); - watchWallet = WatchWallet.getWatchWallet(mActivity); + watchWallet = getWatchWallet(mActivity); mActivity.setSupportActionBar(mBinding.toolbar); mBinding.toolbar.setNavigationOnClickListener(((MainActivity) mActivity)::toggleDrawer); String walletName = watchWallet.getWalletName(mActivity); @@ -195,6 +196,7 @@ public class AssetFragment extends BaseFragment navigate(R.id.action_to_txnListFragment); break; case WASABI: + case BTCPAY: case GENERIC: navigate(R.id.action_to_psbtListFragment); break; @@ -226,6 +228,7 @@ public class AssetFragment extends BaseFragment case COBO: navigate(R.id.export_xpub_cobo); break; + case BTCPAY: case WASABI: navigate(R.id.action_to_export_xpub_guide); break; diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/main/FeeAttackChecking.java b/app/src/main/java/com/cobo/cold/ui/fragment/main/FeeAttackChecking.java index f87690b..379ec0c 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/main/FeeAttackChecking.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/main/FeeAttackChecking.java @@ -1,24 +1,15 @@ package com.cobo.cold.ui.fragment.main; -import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import androidx.databinding.DataBindingUtil; -import androidx.navigation.Navigation; import com.cobo.cold.R; import com.cobo.cold.databinding.CommonModalBinding; -import com.cobo.cold.db.entity.TxEntity; import com.cobo.cold.ui.fragment.BaseFragment; import com.cobo.cold.ui.modal.ModalDialog; -import java.util.Objects; - -import static com.cobo.cold.ui.fragment.main.TxFragment.KEY_TX_ID; -import static com.cobo.cold.viewmodel.ElectrumViewModel.ELECTRUM_SIGN_ID; -import static com.cobo.cold.viewmodel.PsbtViewModel.WASABI_SIGN_ID; - public class FeeAttackChecking { public static final String KEY_DUPLICATE_TX = "key_duplicate_tx"; @@ -47,37 +38,4 @@ public class FeeAttackChecking { binding.confirm.setOnClickListener(v -> modalDialog.dismiss()); modalDialog.show(fragment.getHostActivity().getSupportFragmentManager(),""); } - - private void navigateToSignedTx(String txId, String signId) { - Bundle bundle = new Bundle(); - bundle.putString(KEY_TX_ID, txId); - bundle.putBoolean(KEY_DUPLICATE_TX,true); - if (ELECTRUM_SIGN_ID.equals(signId)) { - Navigation.findNavController(Objects.requireNonNull(fragment.getView())) - .navigate(R.id.action_to_electrumTxFragment, bundle); - } else if(WASABI_SIGN_ID.equals(signId)){ - Navigation.findNavController(Objects.requireNonNull(fragment.getView())) - .navigate(R.id.action_to_psbtSignedTxFragment, bundle); - } else { - Navigation.findNavController(Objects.requireNonNull(fragment.getView())) - .navigate(R.id.action_to_txFragment, bundle); - } - } - - public void showDuplicateTx(TxEntity tx) { - ModalDialog modalDialog = ModalDialog.newInstance(); - CommonModalBinding binding = DataBindingUtil.inflate( - LayoutInflater.from(fragment.getHostActivity()), R.layout.common_modal, - null, false); - modalDialog.setBinding(binding); - binding.title.setText(R.string.broadcast_tx); - binding.close.setVisibility(View.GONE); - binding.subTitle.setText(R.string.already_signed); - binding.confirm.setText(R.string.broadcast_tx); - binding.confirm.setOnClickListener(v -> { - modalDialog.dismiss(); - navigateToSignedTx(tx.getTxId(), tx.getSignId()); - }); - modalDialog.show(fragment.getHostActivity().getSupportFragmentManager(),""); - } } diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtSignedTxFragment.java b/app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtSignedTxFragment.java index 550ccd0..9ae0246 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtSignedTxFragment.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/main/PsbtSignedTxFragment.java @@ -39,9 +39,10 @@ import static com.cobo.cold.ui.fragment.main.PsbtTxConfirmFragment.showExportPsb public class PsbtSignedTxFragment extends SignedTxFragment { @Override protected void displaySignResult(TxEntity txEntity) { - if (watchWallet == WatchWallet.WASABI) { + if (watchWallet == WatchWallet.WASABI || watchWallet == WatchWallet.BTCPAY) { mBinding.txDetail.qr.setVisibility(View.GONE); - mBinding.txDetail.broadcastGuide.setVisibility(View.GONE); + mBinding.txDetail.broadcastGuide.setGravity(Gravity.START); + mBinding.txDetail.broadcastGuide.setText(getBroadcastGuideText()); } else if (watchWallet == WatchWallet.BLUE || watchWallet == WatchWallet.GENERIC) { if (watchWallet == WatchWallet.BLUE) { mBinding.txDetail.info.setOnClickListener(v -> showBlueWalletInfo()); @@ -75,6 +76,15 @@ public class PsbtSignedTxFragment extends SignedTxFragment { } } + private int getBroadcastGuideText() { + if (watchWallet == WatchWallet.WASABI) { + return R.string.wasabi_broadcast_guide; + } else if (watchWallet == WatchWallet.BTCPAY) { + return R.string.btcpay_broadcast_guide; + } + return 0; + } + private void showBlueWalletInfo() { ModalDialog modalDialog = ModalDialog.newInstance(); CommonModalBinding binding = DataBindingUtil.inflate( diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/main/QRCodeScanFragment.java b/app/src/main/java/com/cobo/cold/ui/fragment/main/QRCodeScanFragment.java index 51433bd..4fc8f70 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/main/QRCodeScanFragment.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/main/QRCodeScanFragment.java @@ -104,7 +104,7 @@ public class QRCodeScanFragment extends BaseFragment } } - public String getScanhint() { + private String getScanhint() { switch (watchWallet){ case ELECTRUM: return getString(R.string.scan_electrum_hint); @@ -112,6 +112,8 @@ public class QRCodeScanFragment extends BaseFragment return getString(R.string.scan_blue_hint); case WASABI: return getString(R.string.scan_wasabi_hint); + case BTCPAY: + return getString(R.string.btcpay_scan_hint); } return ""; diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/main/TxConfirmFragment.java b/app/src/main/java/com/cobo/cold/ui/fragment/main/TxConfirmFragment.java index c9d2b5c..2ac8b4b 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/main/TxConfirmFragment.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/main/TxConfirmFragment.java @@ -60,7 +60,7 @@ import static com.cobo.cold.ui.fragment.main.BroadcastTxFragment.KEY_TXID; import static com.cobo.cold.ui.fragment.main.FeeAttackChecking.FeeAttackCheckingResult.NORMAL; import static com.cobo.cold.ui.fragment.main.FeeAttackChecking.FeeAttackCheckingResult.SAME_OUTPUTS; -public class TxConfirmFragment extends BaseFragment { +public class TxConfirmFragment extends BaseFragment { public static final String KEY_TX_DATA = "tx_data"; private final Runnable forgetPassword = () -> { diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/main/TxListFragment.java b/app/src/main/java/com/cobo/cold/ui/fragment/main/TxListFragment.java index 167a7c1..0d105d3 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/main/TxListFragment.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/main/TxListFragment.java @@ -41,10 +41,8 @@ import java.util.stream.Collectors; import static com.cobo.cold.ui.fragment.Constants.KEY_COIN_ID; import static com.cobo.cold.ui.fragment.main.TxFragment.KEY_TX_ID; -import static com.cobo.cold.viewmodel.ElectrumViewModel.ELECTRUM_SIGN_ID; -import static com.cobo.cold.viewmodel.PsbtViewModel.BLUE_WALLET_SIGN_ID; -import static com.cobo.cold.viewmodel.PsbtViewModel.GENERIC_WALLET_SIGN_ID; -import static com.cobo.cold.viewmodel.PsbtViewModel.WASABI_SIGN_ID; +import static com.cobo.cold.viewmodel.WatchWallet.ELECTRUM_SIGN_ID; +import static com.cobo.cold.viewmodel.WatchWallet.getWatchWallet; public class TxListFragment extends BaseFragment { @@ -69,9 +67,7 @@ public class TxListFragment extends BaseFragment { txCallback = tx -> { 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()) - || GENERIC_WALLET_SIGN_ID.equals(tx.getSignId())) { + if (getWatchWallet(mActivity).supportPsbt()) { navigate(R.id.action_to_psbtSignedTxFragment, bundle); } else if(ELECTRUM_SIGN_ID.equals(tx.getSignId())){ navigate(R.id.action_to_electrumTxFragment, bundle); @@ -132,20 +128,12 @@ public class TxListFragment extends BaseFragment { } private boolean filterByMode(TxEntity txEntity) { - WatchWallet watchWallet = WatchWallet.getWatchWallet(mActivity); - switch (watchWallet) { - case COBO: - return !txEntity.getSignId().endsWith("_sign_id"); - case ELECTRUM: - return ELECTRUM_SIGN_ID.equals(txEntity.getSignId()); - case WASABI: - return WASABI_SIGN_ID.equals(txEntity.getSignId()); - case BLUE: - return BLUE_WALLET_SIGN_ID.equals(txEntity.getSignId()); - case GENERIC: - return GENERIC_WALLET_SIGN_ID.equals(txEntity.getSignId()); + WatchWallet watchWallet = getWatchWallet(mActivity); + if (watchWallet == WatchWallet.COBO) { + return !txEntity.getSignId().endsWith("_sign_id"); + } else { + return watchWallet.getSignId().equals(txEntity.getSignId()); } - return false; } private boolean shouldShow(TxEntity tx) { diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/main/WalletInfoFragment.java b/app/src/main/java/com/cobo/cold/ui/fragment/main/WalletInfoFragment.java index 1d4db3e..9f438dd 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/main/WalletInfoFragment.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/main/WalletInfoFragment.java @@ -34,6 +34,7 @@ import com.cobo.cold.viewmodel.WalletInfoViewModel; import static com.cobo.cold.ui.fragment.Constants.KEY_TITLE; import static com.cobo.cold.ui.fragment.setup.SelectAddressFormatFragment.KEY_NEED_CONFIRM; +import static com.cobo.cold.viewmodel.WatchWallet.getWatchWallet; public class WalletInfoFragment extends BaseFragment { private Coins.Account account; @@ -48,8 +49,8 @@ public class WalletInfoFragment extends BaseFragment { mBinding.toolbar.setNavigationOnClickListener(v -> navigateUp()); mBinding.switchAddress.setOnClickListener(v -> switchAddressFormat()); account = GlobalViewModel.getAccount(mActivity); - WatchWallet watchOnly = WatchWallet.getWatchWallet(mActivity); - if (watchOnly != WatchWallet.GENERIC) { + WatchWallet watchWallet = getWatchWallet(mActivity); + if (!watchWallet.supportSwitchAccount()) { mBinding.switchAddress.setVisibility(View.GONE); } mBinding.addressFormat.setText(getAddressFormat()); @@ -67,9 +68,9 @@ public class WalletInfoFragment extends BaseFragment { viewModel.getXpub(account).observe(this, xpub -> { if (!TextUtils.isEmpty(xpub)) { - if (watchOnly == WatchWallet.BLUE) { + if (watchWallet == WatchWallet.BLUE) { xpub = Util.convertXpubToZpub(xpub); - } else if(watchOnly == WatchWallet.ELECTRUM) { + } else if(watchWallet == WatchWallet.ELECTRUM) { xpub = Util.convertXpubToYpub(xpub); } mBinding.xpub.setText(xpub); diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/main/electrum/ExportXpubGuideFragment.java b/app/src/main/java/com/cobo/cold/ui/fragment/main/electrum/ExportXpubGuideFragment.java index 955677d..92258bf 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/main/electrum/ExportXpubGuideFragment.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/main/electrum/ExportXpubGuideFragment.java @@ -43,8 +43,9 @@ import static com.cobo.cold.viewmodel.GlobalViewModel.writeToSdcard; public class ExportXpubGuideFragment extends BaseFragment { private WatchWallet watchWallet; - private JSONObject wasabiXpubJson; + private JSONObject xpubJson; private static final String WASABI_XPUB_FILENAME = "CoboVault-Wasabi.json"; + private static final String BTCPAY_XPUB_FILENAME = "CoboVault-BTCPay.json"; @Override protected int setView() { return R.layout.export_xpub_guide; @@ -66,7 +67,7 @@ public class ExportXpubGuideFragment extends BaseFragment modalDialog.dismiss()); binding.confirm.setOnClickListener(vv -> { modalDialog.dismiss(); - if (writeToSdcard(storage, wasabiXpubJson.toString(), WASABI_XPUB_FILENAME)) { - Runnable runnable = null; + if (writeToSdcard(storage, xpubJson.toString(), fileName)) { + Runnable runnable; if (mActivity instanceof SetupVaultActivity) { runnable = () -> navigate(R.id.action_to_setupCompleteFragment); } else { @@ -118,10 +119,20 @@ public class ExportXpubGuideFragment extends BaseFragment { @@ -37,21 +32,6 @@ public class SetupWatchWalletFragment extends SetupVaultBaseFragment complete()); - } - - private void complete() { - int navId = 0; - Bundle data = new Bundle(); - WatchWallet selectWatchOnlyWallet = getWatchWallet(mActivity); - switch (selectWatchOnlyWallet) { - case ELECTRUM: - case COBO: - case WASABI: - case BLUE: - navId = R.id.action_to_export_xpub_guide; - break; - } - navigate(navId, data); + mBinding.complete.setOnClickListener(v -> navigate(R.id.action_to_export_xpub_guide)); } } diff --git a/app/src/main/java/com/cobo/cold/viewmodel/ElectrumViewModel.java b/app/src/main/java/com/cobo/cold/viewmodel/ElectrumViewModel.java index c4c19c8..41debcb 100644 --- a/app/src/main/java/com/cobo/cold/viewmodel/ElectrumViewModel.java +++ b/app/src/main/java/com/cobo/cold/viewmodel/ElectrumViewModel.java @@ -28,8 +28,6 @@ import com.cobo.coinlib.coins.BTC.Electrum.ElectrumTx; import com.cobo.coinlib.coins.BTC.Electrum.TransactionInput; import com.cobo.coinlib.coins.BTC.Electrum.TransactionOutput; import com.cobo.cold.AppExecutors; -import com.cobo.cold.DataRepository; -import com.cobo.cold.MainApplication; import com.cobo.cold.update.utils.FileUtils; import com.cobo.cold.update.utils.Storage; @@ -46,20 +44,15 @@ import java.util.regex.Pattern; public class ElectrumViewModel extends AndroidViewModel { - public static final String ELECTRUM_SIGN_ID = "electrum_sign_id"; - private static Pattern signedTxnPattern = Pattern.compile("^signed_[0-9a-fA-F]{8}.txn$"); - private final DataRepository mRepo; - private MutableLiveData exPub = new MutableLiveData<>(); private Storage storage; public ElectrumViewModel(@NonNull Application application) { super(application); - mRepo = MainApplication.getApplication().getRepository(); storage = Storage.createByEnvironment(application); } - public static JSONObject adapt(ElectrumTx tx) throws JSONException { + static JSONObject adapt(ElectrumTx tx) throws JSONException { JSONObject object = new JSONObject(); JSONArray inputs = new JSONArray(); JSONArray outputs = new JSONArray(); diff --git a/app/src/main/java/com/cobo/cold/viewmodel/PsbtViewModel.java b/app/src/main/java/com/cobo/cold/viewmodel/PsbtViewModel.java index 5f607e2..adf5af2 100644 --- a/app/src/main/java/com/cobo/cold/viewmodel/PsbtViewModel.java +++ b/app/src/main/java/com/cobo/cold/viewmodel/PsbtViewModel.java @@ -45,10 +45,6 @@ import static com.cobo.cold.viewmodel.GlobalViewModel.getAccount; public class PsbtViewModel extends AndroidViewModel { - - public static final String WASABI_SIGN_ID = "wasabi_sign_id"; - public static final String BLUE_WALLET_SIGN_ID = "blue_wallet_sign_id"; - public static final String GENERIC_WALLET_SIGN_ID = "generic_wallet_sign_id"; private static Pattern signedTxnPattern = Pattern.compile("^signed_[0-9a-fA-F]{8}.psbt$"); private Storage storage; diff --git a/app/src/main/java/com/cobo/cold/viewmodel/TxConfirmViewModel.java b/app/src/main/java/com/cobo/cold/viewmodel/TxConfirmViewModel.java index e3e1f17..5838061 100644 --- a/app/src/main/java/com/cobo/cold/viewmodel/TxConfirmViewModel.java +++ b/app/src/main/java/com/cobo/cold/viewmodel/TxConfirmViewModel.java @@ -82,12 +82,9 @@ import static com.cobo.cold.viewmodel.AddAddressViewModel.AddAddressTask.getAddr import static com.cobo.cold.ui.fragment.main.FeeAttackChecking.FeeAttackCheckingResult.DUPLICATE_TX; import static com.cobo.cold.ui.fragment.main.FeeAttackChecking.FeeAttackCheckingResult.NORMAL; import static com.cobo.cold.ui.fragment.main.FeeAttackChecking.FeeAttackCheckingResult.SAME_OUTPUTS; -import static com.cobo.cold.viewmodel.ElectrumViewModel.ELECTRUM_SIGN_ID; import static com.cobo.cold.viewmodel.ElectrumViewModel.adapt; import static com.cobo.cold.viewmodel.GlobalViewModel.getAccount; -import static com.cobo.cold.viewmodel.PsbtViewModel.BLUE_WALLET_SIGN_ID; -import static com.cobo.cold.viewmodel.PsbtViewModel.GENERIC_WALLET_SIGN_ID; -import static com.cobo.cold.viewmodel.PsbtViewModel.WASABI_SIGN_ID; +import static com.cobo.cold.viewmodel.WatchWallet.ELECTRUM_SIGN_ID; public class TxConfirmViewModel extends AndroidViewModel { @@ -105,8 +102,6 @@ public class TxConfirmViewModel extends AndroidViewModel { private String coinCode; private final MutableLiveData signState = new MutableLiveData<>(); private AuthenticateModal.OnVerify.VerifyToken token; - private TxEntity previousSignedTx; - public TxConfirmViewModel(@NonNull Application application) { super(application); @@ -151,10 +146,6 @@ public class TxConfirmViewModel extends AndroidViewModel { }); } - public TxEntity getPreviousSignTx() { - return previousSignedTx; - } - private void feeAttackChecking(TxEntity txEntity) { AppExecutors.getInstance().diskIO().execute(() -> { String inputs = txEntity.getFrom(); @@ -162,7 +153,6 @@ public class TxConfirmViewModel extends AndroidViewModel { List txs = mRepository.loadAllTxSync(Coins.BTC.coinId()); for (TxEntity tx : txs) { if (inputs.equals(tx.getFrom()) && outputs.equals(tx.getTo())) { - previousSignedTx = tx; feeAttachCheckingResult.postValue(DUPLICATE_TX); break; } else if (outputs.equals(tx.getTo())) { @@ -270,7 +260,7 @@ public class TxConfirmViewModel extends AndroidViewModel { private JSONObject parsePsbtTx(JSONObject adaptTx) throws JSONException { TransactionProtoc.SignTransaction.Builder builder = TransactionProtoc.SignTransaction.newBuilder(); builder.setCoinCode(Coins.BTC.coinCode()) - .setSignId(getSignId()) + .setSignId(WatchWallet.getWatchWallet(getApplication()).getSignId()) .setTimestamp(generateAutoIncreaseId()) .setDecimal(8); String signTransaction = new JsonFormat().printToString(builder.build()); @@ -279,20 +269,6 @@ public class TxConfirmViewModel extends AndroidViewModel { return signTx; } - private String getSignId() { - switch (WatchWallet.getWatchWallet(getApplication())) { - case BLUE: - return BLUE_WALLET_SIGN_ID; - case WASABI: - return WASABI_SIGN_ID; - case GENERIC: - return GENERIC_WALLET_SIGN_ID; - case ELECTRUM: - return ELECTRUM_SIGN_ID; - } - return null; - } - private long generateAutoIncreaseId() { List txEntityList = mRepository.loadElectrumTxsSync(Coins.BTC.coinId()); if (txEntityList == null || txEntityList.isEmpty()) { diff --git a/app/src/main/java/com/cobo/cold/viewmodel/WatchWallet.java b/app/src/main/java/com/cobo/cold/viewmodel/WatchWallet.java index f179c9b..3eaec09 100644 --- a/app/src/main/java/com/cobo/cold/viewmodel/WatchWallet.java +++ b/app/src/main/java/com/cobo/cold/viewmodel/WatchWallet.java @@ -29,7 +29,14 @@ public enum WatchWallet { ELECTRUM("1"), WASABI("2"), BLUE("3"), - GENERIC("4"); + BTCPAY("4"), + GENERIC("100"); + + public static final String ELECTRUM_SIGN_ID = "electrum_sign_id"; + public static final String WASABI_SIGN_ID = "wasabi_sign_id"; + public static final String BLUE_WALLET_SIGN_ID = "blue_wallet_sign_id"; + public static final String BTCPAY_SIGN_ID = "blue_wallet_sign_id"; + public static final String GENERIC_WALLET_SIGN_ID = "generic_wallet_sign_id"; private String walletId; WatchWallet(String walletId) { @@ -41,8 +48,12 @@ public enum WatchWallet { } public String getWalletName(Context context) { - return context.getResources() - .getStringArray(R.array.watch_wallet_list)[Integer.parseInt(walletId)]; + String[] wallets = context.getResources().getStringArray(R.array.watch_wallet_list); + if (walletId.equals(GENERIC.getWalletId())) { + return wallets[wallets.length - 1]; + } else { + return wallets[Integer.parseInt(walletId)]; + } } public static WatchWallet getWatchWallet(Context context) { @@ -62,6 +73,7 @@ public enum WatchWallet { switch (this) { case GENERIC: case BLUE: + case BTCPAY: case WASABI: return true; default:return false; @@ -92,9 +104,51 @@ public enum WatchWallet { switch (this) { case ELECTRUM: case GENERIC: + case BTCPAY: case WASABI: return true; default:return false; } } + + public String getSignId() { + switch (this) { + case BLUE: + return BLUE_WALLET_SIGN_ID; + case WASABI: + return WASABI_SIGN_ID; + case GENERIC: + return GENERIC_WALLET_SIGN_ID; + case ELECTRUM: + return ELECTRUM_SIGN_ID; + case BTCPAY: + return BTCPAY_SIGN_ID; + } + return ""; + } + + public boolean supportSwitchAccount() { + return this == WatchWallet.GENERIC; + } + + public boolean supportNativeSegwit() { + switch (this) { + case GENERIC: + case BTCPAY: + case BLUE: + case WASABI: + return true; + } + return false; + } + + public boolean supportNestedSegwit() { + switch (this) { + case COBO: + case ELECTRUM: + case GENERIC: + return true; + } + return false; + } } \ No newline at end of file diff --git a/app/src/main/res/layout/electrum_tx_detail.xml b/app/src/main/res/layout/electrum_tx_detail.xml index af9fc26..bd8bb81 100644 --- a/app/src/main/res/layout/electrum_tx_detail.xml +++ b/app/src/main/res/layout/electrum_tx_detail.xml @@ -354,7 +354,7 @@ android:layout_marginTop="16dp" android:layout_marginHorizontal="16dp" android:text="@string/export_signed_txn_file"/> - 在 Electrum 创建观察钱包 -2. 选择“标准钱包”
-3. 选择“使用主公钥”
-4. 在输入主公钥页面点击照相机按钮,扫描主公钥二维码(点击下方按钮查看二维码)
-5. 设置钱包密码
-6. 进入观察钱包 + 1. 打开 Electrum,新建钱包
+ 2. 选择“标准钱包”
+ 3. 选择“使用主公钥”
+ 4. 在输入主公钥页面点击照相机按钮,扫描主公钥二维码(点击下方按钮查看二维码)
+ 5. 设置钱包密码
+ 6. 进入观察钱包 ]]>
查看主公钥二维码 Electrum 创建指引 @@ -338,11 +338,13 @@ 找零地址 导出到Electrum 导出到Wasabi Wallet + 导出到BTCPay 导出到Cobo金库移动端 导出到BlueWallet Electrum 导入指引: Cobo 金库移动端导入指引: Wasabi Wallet 导入指引: + BTCPay Server 导入指引: BlueWallet 导入指引: @@ -371,6 +373,15 @@ 请确保 Cobo 金库装有TF卡后再进行导出(仅支持FAT32格式,容量不能超过32G) ]]> + + 2. 选择“…a wallet file (Electrum, wasabi, Cobo Vault, ColdCard)”
+ 3. 打开 Cobo 金库导出的钱包文件(点击下方按钮导出)
+ 4. 点击“Submit”
+ 5. 点击“Confirm”

+ 请确保 Cobo 金库装有TF卡后再进行导出(仅支持FAT32格式,容量不能超过32G) + ]]>
+ 2. 选择“导入钱包”
@@ -400,6 +411,19 @@ 3. 扫描 Cobo 金库二维码
]]>
+ + 前往【wasabi--Tools--Transactions Broadcaster--Import transaction】,打开该文件 + ]]> + + + 1. 前往【BTCPay--PSBT】,打开该文件
+ 2. 点击“Decode”
+ 3. 点击“Other Actions” 选择“Review”
+ 4. 检查交易无误后点击“Broadcast”
+ ]]>
+ 查看主公钥二维码 查看二维码 导出钱包 @@ -432,6 +456,7 @@ Electrum Wasabi Wallet BlueWallet + BTCPay Server 通用钱包 @@ -457,5 +482,6 @@ 请重新启动机器,多次重试未果请联系客服:support@cobo.com\n 状态码:%s 重新启动 删除所有信息并关机 + BTCPay Server 暂不支持将交易导成二维码,您可将待签交易导出成文件 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4649894..10c2596 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -84,6 +84,7 @@ Electrum Wasabi Wallet BlueWallet + BTCPay Server Generic Wallet @@ -93,6 +94,7 @@ 2 3 4 + 100 @@ -324,8 +326,11 @@ Create Watch-Only Wallet in Electrum 2. Choose “Standard wallet”.
3. Choose “Use a master key”.
4. Touch “Show Master Public Key” below then click the camera icon in the “Create keystore from a master key” window in Electrum to scan the QR code that displays on Cobo Vault. -
5. Set a password.
6. Enter the watch-only wallet. + 1. Open Electrum and create a new wallet.
+ 2. Choose “Standard wallet”.
+ 3. Choose “Use a master key”.
+ 4. Touch “Show Master Public Key” below then click the camera icon in the “Create keystore from a master key” window in Electrum to scan the QR code that displays on Cobo Vault.
+ 5. Set a password.
6. Enter the watch-only wallet. ]]>
Show Master Public Key How to create a watch-only wallet with Electrum: @@ -389,11 +394,13 @@ Change Address Export to Electrum Watch-Only Export to Wasabi Watch-Only + Export to BTCPay Watch-Only Export to Cobo Vault Watch-Only Export to BlueWallet Watch-Only How to create a watch-only wallet with Electrum: How to create a watch-only wallet with the Cobo Vault mobile app: How to create a watch-only wallet with Wasabi Wallet: + How to create a watch-only wallet with BTCPay Server: How to create a watch-only wallet with BlueWallet: @@ -424,6 +431,15 @@ Please make sure you have inserted a FAT32 format microSD card with capacity 32GB or less before exporting.
Wasabi requires the xPub, hardware wallet fingerprint, and firmware version to be used as a watch-only wallet. This information will be exported if you touch “Export with MicroSD” below. ]]>
+ General > Derivation Scheme > Import from…
+ 2. Choose "…a wallet file (Electrum, wasabi, Cobo Vault, ColdCard)"
+ 3. Touch "Export Wallet" below then open the file in BTCPay
+ 4. Click "Submit"
+ 5. Click "Confirm".
+ Please make sure you have inserted a FAT32 format microSD card with capacity 32GB or less before exporting.
+ Wasabi requires the xPub, hardware wallet fingerprint, and firmware version to be used as a watch-only wallet. This information will be exported if you touch “Export with MicroSD” below. + ]]>
@@ -455,6 +471,18 @@ 6. Enter the watch-only wallet. ]]> + + go to [wasabi--Tools--Transactions Broadcaster--Import transaction] open this file to broadcast + ]]> + + + 1. In BTCPay, go to PSBT tab of the wallet and upload the signed PSBT file
+ 2. Click "Decode"
+ 3. Click "Other Actions" and select "Review"
+ 4. Review your transactions and click "Broadcast" to broadcast it on the network + ]]>
Display Master Public Key QR Code Display QR Code Export Wallet @@ -474,8 +502,7 @@ Script Type: Account Key Path: Account Extended Public Key: - * Do not share this public key with anyone. Account extended public keys can be used to identify your addresses and cryptocurrency amounts. - + * Do not share this public key with anyone. Account extended public keys can be used to identify your addresses and cryptocurrency amounts. Confirm Please use %s generate unsigned transaction Please scan the QR code with the wallet you wish to use as a watch-only wallet. @@ -496,5 +523,6 @@ Please restart or contact us at support@cobo.com\n Status Code:%s Restart Erase all Information and Power off + BTCPay Server does not support exporting transactions by QR code. Please export transactions using microSD.