From 91e0eb0bed45727b7e131d36b35622ed8bace59e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 3 Oct 2018 11:54:35 +0300 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle | 6 +- .../tangem/data/network/ServerApiHelper.java | 3 - .../presentation/fragment/LoadedWallet.kt | 156 +++++++++++++----- 3 files changed, 116 insertions(+), 49 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 20c244f118..d0a45ddd96 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,14 +50,14 @@ dependencies { implementation 'com.android.support:cardview-v7:27.1.1' implementation 'com.android.support:support-v4:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.3' - implementation 'com.google.zxing:core:3.3.2' + implementation 'com.google.zxing:core:3.3.3' implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.madgag.spongycastle:core:1.56.0.0' implementation 'com.madgag.spongycastle:prov:1.56.0.0' implementation 'com.scottyab:rootbeer-lib:0.0.6' - implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.retrofit2:retrofit:2.4.0' - implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1' + implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' implementation 'com.skyfishjy.ripplebackground:library:1.0.1' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/app/src/main/java/com/tangem/data/network/ServerApiHelper.java b/app/src/main/java/com/tangem/data/network/ServerApiHelper.java index 87ae62f17d..5aa77925dc 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiHelper.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiHelper.java @@ -190,7 +190,6 @@ public class ServerApiHelper { }); } - /** * HTTP * Card verify @@ -298,10 +297,8 @@ public class ServerApiHelper { Log.e(TAG, "getArtwork onFailure " + t.getMessage()); } }); - } - /** * HTTP * Used in Crypto-currency course diff --git a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt index 1a25027cdb..28de933540 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt @@ -217,12 +217,69 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } } + // request electrum + serverApiHelper!!.setElectrumRequestData { + if (it.isMethod(ElectrumRequest.METHOD_GetBalance)) { + try { + val walletAddress = it.params.getString(0) + val confBalance = it.result.getLong("confirmed") + val unconfirmedBalance = it.result.getLong("unconfirmed") + card!!.isBalanceReceived = true + card!!.setBalanceConfirmed(confBalance) + card!!.balanceUnconfirmed = unconfirmedBalance + card!!.decimalBalance = confBalance.toString() + card!!.validationNodeDescription = serverApiHelper!!.validationNodeDescription + } catch (e: JSONException) { + e.printStackTrace() + engine.switchNode(card) + } + } + + if (it.isMethod(ElectrumRequest.METHOD_ListUnspent)) { + try { + val mWalletAddress = it.params.getString(0) + val jsUnspentArray = it.resultArray + try { + card!!.unspentTransactions.clear() + for (i in 0 until jsUnspentArray.length()) { + val jsUnspent = jsUnspentArray.getJSONObject(i) + val trUnspent = TangemCard.UnspentTransaction() + trUnspent.txID = jsUnspent.getString("tx_hash") + trUnspent.Amount = jsUnspent.getInt("value") + trUnspent.Height = jsUnspent.getInt("height") + card!!.unspentTransactions.add(trUnspent) + } + } catch (e: JSONException) { + e.printStackTrace() + engine.switchNode(card) + } + + for (i in 0 until jsUnspentArray.length()) { + val jsUnspent = jsUnspentArray.getJSONObject(i) + val height = jsUnspent.getInt("height") + val hash = jsUnspent.getString("tx_hash") + if (height != -1) { + val nodeAddress = engine.getNextNode(card) + val nodePort = engine.getNextNodePort(card) + val updateWalletInfoTask = UpdateWalletInfoTask(this, nodeAddress, nodePort) + // loadedWallet.updateTasks.add(updateWalletInfoTask); + updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.getHeader(mWalletAddress, height.toString()), ElectrumRequest.getTransaction(mWalletAddress, hash)) + } + } + } catch (e: JSONException) { + e.printStackTrace() + engine.switchNode(card) + } + + } + } + // request card verify listener serverApiHelper!!.setCardVerifyAndGetInfoListener { srlLoadedWallet!!.isRefreshing = false val result = it.results!![0] if (result.error != null) { - Log.e(TAG, "Can't verify card: ${result.error}") +// Log.e(TAG, "Can't verify card: ${result.error}") card!!.isOnlineVerified = false return@setCardVerifyAndGetInfoListener } @@ -290,18 +347,18 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific var nonce = infuraResponse.result nonce = nonce.substring(2) val count = BigInteger(nonce, 16) - card!!.setConfirmedTXCount(count) + card!!.confirmedTXCount = count - Log.i("$TAG eth_getTransCount", nonce) +// Log.i("$TAG eth_getTransCount", nonce) } ServerApiHelper.INFURA_ETH_GET_PENDING_COUNT -> { var pending = infuraResponse.result pending = pending.substring(2) val count = BigInteger(pending, 16) - card!!.setUnconfirmedTXCount(count) + card!!.unconfirmedTXCount = count - Log.i("$TAG eth_getPendingTxCount", pending) +// Log.i("$TAG eth_getPendingTxCount", pending) } ServerApiHelper.INFURA_ETH_CALL -> { @@ -319,13 +376,13 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific requestInfura(ServerApiHelper.INFURA_ETH_GET_BALANCE, "") requestInfura(ServerApiHelper.INFURA_ETH_GET_TRANSACTION_COUNT, "") requestInfura(ServerApiHelper.INFURA_ETH_GET_PENDING_COUNT, "") - return@onInfuraSuccess + return } card!!.setBalanceConfirmed(balance) card!!.balanceUnconfirmed = 0L card!!.decimalBalance = l.toString(10) - Log.i("$TAG eth_call", balanceCap) +// Log.i("$TAG eth_call", balanceCap) requestInfura(ServerApiHelper.INFURA_ETH_GET_BALANCE, "") requestInfura(ServerApiHelper.INFURA_ETH_GET_TRANSACTION_COUNT, "") @@ -362,9 +419,9 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific Log.e("$TAG TX_RESULT", hashTX) - val nonce = card!!.getConfirmedTXCount() + val nonce = card!!.confirmedTXCount nonce.add(BigInteger.valueOf(1)) - card!!.setConfirmedTXCount(nonce) + card!!.confirmedTXCount = nonce Log.e("$TAG TX_RESULT", hashTX) @@ -389,6 +446,10 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific serverApiHelper!!.setInfuraResponse(infuraBodyListener) } + private fun requestElectrum(card: TangemCard, electrumRequest: ElectrumRequest) { + serverApiHelper!!.electrumRequestData(card, electrumRequest) + } + private fun requestInfura(method: String, contract: String) { serverApiHelper!!.infura(method, 67, card!!.wallet, contract, LastSignStorage.getTxForSend(card!!.wallet)) } @@ -726,7 +787,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific tvBlockchain.text = card!!.blockchainName - if (card!!.hasBalanceInfo() && (card!!.balance != 0L) ) { + if (card!!.hasBalanceInfo() && (card!!.balance != 0L)) { btnExtract.isEnabled = true btnExtract.backgroundTintList = activeColor } else { @@ -758,50 +819,59 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific // Bitcoin if (card!!.blockchain == Blockchain.Bitcoin || card!!.blockchain == Blockchain.BitcoinTestNet) { - val data = SharedData(SharedData.COUNT_REQUEST) +// val data = SharedData(SharedData.COUNT_REQUEST) + card!!.resetFailedBalanceRequestCounter() card!!.setIsBalanceEqual(true) - for (i in 0 until data.allRequest) { - val nodeAddress = engine!!.getNextNode(card) - val nodePort = engine.getNextNodePort(card) + requestElectrum(card!!, ElectrumRequest.checkBalance(card!!.wallet)) + requestElectrum(card!!, ElectrumRequest.listUnspent(card!!.wallet)) -// Log.i(TAG, nodeAddress) -// Log.i(TAG, nodePort.toString()) -// Log.i(TAG, i.toString()) - - // check balance - val connectTaskEx = UpdateWalletInfoTask(this@LoadedWallet, nodeAddress, nodePort, data) - connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.checkBalance(card!!.wallet)) - - // list unspent input - val updateWalletInfoTask = UpdateWalletInfoTask(this@LoadedWallet, nodeAddress, nodePort, data) - updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.listUnspent(card!!.wallet)) - } +// for (i in 0 until data.allRequest) { +// val nodeAddress = engine!!.getNextNode(card) +// val nodePort = engine.getNextNodePort(card) +// +//// Log.i(TAG, nodeAddress) +//// Log.i(TAG, nodePort.toString()) +//// Log.i(TAG, i.toString()) +// +// // check balance +// val connectTaskEx = UpdateWalletInfoTask(this@LoadedWallet, nodeAddress, nodePort, data) +// connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.checkBalance(card!!.wallet)) +// +// // list unspent input +// val updateWalletInfoTask = UpdateWalletInfoTask(this@LoadedWallet, nodeAddress, nodePort, data) +// updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.listUnspent(card!!.wallet)) +// } requestRateInfo("bitcoin") } // BitcoinCash else if (card!!.blockchain == Blockchain.BitcoinCash || card!!.blockchain == Blockchain.BitcoinCashTestNet) { +// val data = SharedData(SharedData.COUNT_REQUEST) + card!!.resetFailedBalanceRequestCounter() - val data = SharedData(SharedData.COUNT_REQUEST) card!!.setIsBalanceEqual(true) - for (i in 0 until data.allRequest) { - val nodeAddress = engine!!.getNextNode(card) - val nodePort = engine.getNextNodePort(card) - // check balance - val connectTaskEx = UpdateWalletInfoTask(this@LoadedWallet, nodeAddress, nodePort, data) - connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.checkBalance(card!!.wallet)) - } + requestElectrum(card!!, ElectrumRequest.checkBalance(card!!.wallet)) + requestElectrum(card!!, ElectrumRequest.listUnspent(card!!.wallet)) - val nodeAddress = engine!!.getNode(card) - val nodePort = engine.getNodePort(card) - - // list unspent input - val updateWalletInfoTask = UpdateWalletInfoTask(this@LoadedWallet, nodeAddress, nodePort, data) - updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.listUnspent(card!!.wallet)) +// for (i in 0 until data.allRequest) { +// val nodeAddress = engine!!.getNextNode(card) +// val nodePort = engine.getNextNodePort(card) +// +// // check balance +// val connectTaskEx = UpdateWalletInfoTask(this@LoadedWallet, nodeAddress, nodePort, data) +// connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.checkBalance(card!!.wallet)) +// } +// +// val nodeAddress = engine!!.getNode(card) +// val nodePort = engine.getNodePort(card) +// +// // list unspent input +// val updateWalletInfoTask = UpdateWalletInfoTask(this@LoadedWallet, nodeAddress, nodePort, data) +// updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.listUnspent(card!!.wallet)) requestRateInfo("bitcoin-cash") } @@ -969,15 +1039,15 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific startActivityForResult(intent, REQUEST_CODE_SWAP_PIN) } - var showTime: Date= Date() + var showTime: Date = Date() private fun showSingleToast(text: Int) { - if (singleToast == null || !singleToast!!.view.isShown || showTime.time+2000