Updated on 2026-08-14

This commit is contained in:
Tangem 2018-10-11 12:39:58 +03:00
parent 6c8c365317
commit 922610a9ed
7 changed files with 50 additions and 163 deletions

View file

@ -10,9 +10,9 @@ public class Server {
public static final String URL_TANGEM = ServerURL.API_TANGEM;
public static class Method {
public static final String VERIFY = URL_TANGEM + "verify";
public static final String VERIFY_AND_GET_INFO = URL_TANGEM + "card/verify-and-get-info";
public static final String ARTWORK = URL_TANGEM + "card/artwork";
static final String VERIFY = URL_TANGEM + "verify";
static final String VERIFY_AND_GET_INFO = URL_TANGEM + "card/verify-and-get-info";
static final String ARTWORK = URL_TANGEM + "card/artwork";
}
}
@ -20,7 +20,7 @@ public class Server {
public static final String URL_UPDATE_VERSION = ServerURL.API_UPDATE_VERSION;
public static class Method {
public static final String LAST_VERSION = URL_UPDATE_VERSION +"TangemCash/tangem-binaries/master/apk-version.txt";
static final String LAST_VERSION = URL_UPDATE_VERSION + "TangemCash/tangem-binaries/master/apk-version.txt";
}
}
@ -31,7 +31,7 @@ public class Server {
public static final String URL_COINMARKET = ServerURL.API_COINMARKETCAP;
public static class Method {
public static final String V1_TICKER_CONVERT = URL_COINMARKET + "v1/ticker/?convert=USD&lmit=10";
static final String V1_TICKER_CONVERT = URL_COINMARKET + "v1/ticker/?convert=USD&lmit=10";
}
}
@ -42,7 +42,7 @@ public class Server {
public static final String URL_INFURA = ServerURL.API_INFURA;
public static class Method {
public static final String MAIN = URL_INFURA + "AfWg0tmYEX5Kukn2UkKV";
static final String MAIN = URL_INFURA + "AfWg0tmYEX5Kukn2UkKV";
}
}
@ -53,9 +53,9 @@ public class Server {
public static final String URL_ESTIMATEFEE = ServerURL.API_ESTIMATEFEE;
public static class Method {
public static final String N_2 = URL_ESTIMATEFEE + "n/2";
public static final String N_3 = URL_ESTIMATEFEE + "n/3";
public static final String N_6 = URL_ESTIMATEFEE + "n/6";
static final String N_2 = URL_ESTIMATEFEE + "n/2";
static final String N_3 = URL_ESTIMATEFEE + "n/3";
static final String N_6 = URL_ESTIMATEFEE + "n/6";
}
}

View file

@ -299,127 +299,6 @@ public class ServerApiHelper {
Throwable::printStackTrace);
}
/**
* TCP
* Used in BTC
*/
private String host;
private int port;
private ElectrumRequestDataListener electrumRequestDataListener;
public interface ElectrumRequestDataListener {
void onElectrumRequestData(ElectrumRequest electrumRequest);
}
public void setElectrumRequestData(ElectrumRequestDataListener listener) {
electrumRequestDataListener = listener;
}
public void electrumRequestData(TangemCard card, ElectrumRequest electrumRequest) {
Observable<ElectrumRequest> checkBalanceObserver = Observable.just(electrumRequest)
.doOnNext(electrumRequest1 -> doElectrumRequest(card, electrumRequest))
.flatMap(electrumRequest1 -> {
if (electrumRequest1.answerData == null)
return Observable.error(new NullPointerException());
else
return Observable.just(electrumRequest1);
})
.retryWhen(errors -> errors
.filter(throwable -> throwable instanceof NullPointerException)
.zipWith(Observable.range(1, 2), (n, i) -> i))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
checkBalanceObserver.subscribe(new DefaultObserver<ElectrumRequest>() {
@Override
public void onNext(ElectrumRequest v) {
if (electrumRequest.answerData != null) {
electrumRequestDataListener.onElectrumRequestData(electrumRequest);
Log.i(TAG, "electrumRequestData " + electrumRequest.getMethod() + " onNext != null");
} else {
Log.e(TAG, "electrumRequestData " + electrumRequest.getMethod() + " onNext == null");
}
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "electrumRequestData " + electrumRequest.getMethod() + " onError " + e.getMessage());
}
@Override
public void onComplete() {
Log.i(TAG, "electrumRequestData " + electrumRequest.getMethod() + " onComplete");
}
});
}
private List<ElectrumRequest> doElectrumRequest(TangemCard card, ElectrumRequest electrumRequest) {
BitcoinNode bitcoinNode = BitcoinNode.values()[new Random().nextInt(BitcoinNode.values().length)];
if (card.getBlockchain() == Blockchain.BitcoinTestNet || card.getBlockchain() == Blockchain.BitcoinCashTestNet) {
BitcoinNodeTestNet bitcoinNodeTestNet = BitcoinNodeTestNet.values()[new Random().nextInt(BitcoinNodeTestNet.values().length)];
this.host = bitcoinNodeTestNet.getHost();
this.port = bitcoinNodeTestNet.getPort();
} else {
this.host = bitcoinNode.getHost();
this.port = bitcoinNode.getPort();
}
List<ElectrumRequest> result = new ArrayList<>();
Collections.addAll(result, electrumRequest);
try {
// Log.i(TAG, "host " + host + " !!!!!!!!!!!! " + "port " + String.valueOf(port));
InetAddress serverAddress = InetAddress.getByName(host);
Socket socket = new Socket();
socket.setSoTimeout(5000);
socket.bind(new InetSocketAddress(0));
socket.connect(new InetSocketAddress(serverAddress, port));
try {
// Log.i(TAG, "<< ");
OutputStream os = socket.getOutputStream();
OutputStreamWriter out = new OutputStreamWriter(os, "UTF-8");
InputStream is = socket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
electrumRequest.setID(1);
// do request
try {
out.write(electrumRequest.getAsString() + "\n");
out.flush();
electrumRequest.answerData = in.readLine();
electrumRequest.host = host;
electrumRequest.port = port;
if (electrumRequest.answerData != null) {
// Log.i(TAG, ">> " + electrumRequest.answerData);
} else {
electrumRequest.error = "No answer from server";
// Log.i(TAG, ">> <NULL>");
}
} catch (Exception e) {
electrumRequest.error = e.toString();
}
} catch (Exception e) {
e.printStackTrace();
// Log.i(TAG, e.getMessage());
} finally {
// Log.i(TAG, "close");
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public String getValidationNodeDescription() {
return "Electrum, " + host + ":" + String.valueOf(port);
}
/**
* HTTP
* Last version request from GitHub
@ -435,21 +314,7 @@ public class ServerApiHelper {
}
public void requestLastVersion() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder().
addInterceptor(logging).
// addInterceptor(new AuthorizationInterceptor()).
build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Server.ApiUpdateVersion.URL_UPDATE_VERSION)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.build();
UpdateVersionApi updateVersionApi = retrofit.create(UpdateVersionApi.class);
UpdateVersionApi updateVersionApi = App.getComponent().getRetrofitGithubusercontent().create(UpdateVersionApi.class);
Call<ResponseBody> call = updateVersionApi.getLastVersion();
call.enqueue(new Callback<ResponseBody>() {
@ -472,7 +337,6 @@ public class ServerApiHelper {
Log.e(TAG, "lastVersion onFailure " + t.getMessage());
}
});
}
}

View file

@ -24,4 +24,7 @@ public interface AppComponent {
@Named(Server.ApiCoinmarket.URL_COINMARKET)
Retrofit getRetrofitCoinmarketcap();
@Named(Server.ApiUpdateVersion.URL_UPDATE_VERSION)
Retrofit getRetrofitGithubusercontent();
}

View file

@ -47,16 +47,15 @@ class NetworkModule {
.build();
}
private OkHttpClient createHttpClient() {
return new OkHttpClient.Builder().
addInterceptor(createLogging()).
build();
}
private HttpLoggingInterceptor createLogging() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
return logging;
@Singleton
@Provides
@Named(Server.ApiUpdateVersion.URL_UPDATE_VERSION)
Retrofit provideGithubusercontent() {
return new Retrofit.Builder()
.baseUrl(Server.ApiUpdateVersion.URL_UPDATE_VERSION)
.addConverterFactory(GsonConverterFactory.create())
.client(createHttpClient())
.build();
}
@Singleton
@ -70,4 +69,16 @@ class NetworkModule {
.build();
}
private OkHttpClient createHttpClient() {
return new OkHttpClient.Builder().
addInterceptor(createLogging()).
build();
}
private HttpLoggingInterceptor createLogging() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
return logging;
}
}

View file

@ -14,6 +14,7 @@ import android.view.KeyEvent
import android.view.View
import android.widget.*
import com.tangem.data.network.ServerApiHelper
import com.tangem.data.network.ServerApiHelperElectrum
import com.tangem.data.network.model.InfuraResponse
import com.tangem.data.network.request.ElectrumRequest
import com.tangem.domain.cardReader.NfcManager
@ -39,6 +40,7 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback {
private var nfcManager: NfcManager? = null
private var serverApiHelper: ServerApiHelper? = null
private var serverApiHelperElectrum: ServerApiHelperElectrum? = null
var card: TangemCard? = null
var feeRequestSuccess = false
var balanceRequestSuccess = false
@ -218,7 +220,7 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback {
}
// request electrum listener
serverApiHelper!!.setElectrumRequestData {
serverApiHelperElectrum!!.setElectrumRequestData {
if (it.isMethod(ElectrumRequest.METHOD_GetBalance)) {
try {
etFee!!.setText("--")
@ -340,7 +342,7 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback {
}
private fun requestElectrum(card: TangemCard, electrumRequest: ElectrumRequest) {
serverApiHelper!!.electrumRequestData(card, electrumRequest)
serverApiHelperElectrum!!.electrumRequestData(card, electrumRequest)
}
private fun requestInfura(method: String) {

View file

@ -9,6 +9,7 @@ import android.util.Log
import android.view.KeyEvent
import android.widget.Toast
import com.tangem.data.network.ServerApiHelper
import com.tangem.data.network.ServerApiHelperElectrum
import com.tangem.data.network.model.InfuraResponse
import com.tangem.data.network.request.ElectrumRequest
import com.tangem.domain.cardReader.NfcManager
@ -29,6 +30,8 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback
}
private var serverApiHelper: ServerApiHelper? = null
private var serverApiHelperElectrum: ServerApiHelperElectrum? = null
var card: TangemCard? = null
private var tx: String? = null
private var nfcManager: NfcManager? = null
@ -42,6 +45,7 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback
nfcManager = NfcManager(this, this)
serverApiHelper = ServerApiHelper()
serverApiHelperElectrum = ServerApiHelperElectrum()
val intent = intent
card = TangemCard(getIntent().getStringExtra(EXTRA_UID))
@ -63,7 +67,7 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback
}
// request electrum listener
serverApiHelper!!.setElectrumRequestData {
serverApiHelperElectrum!!.setElectrumRequestData {
if (it.isMethod(ElectrumRequest.METHOD_SendTransaction)) {
try {
var hashTX = it.resultString
@ -156,7 +160,7 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback
}
private fun requestElectrum(card: TangemCard, electrumRequest: ElectrumRequest) {
serverApiHelper!!.electrumRequestData(card, electrumRequest)
serverApiHelperElectrum!!.electrumRequestData(card, electrumRequest)
}
fun finishWithError(message: String) {

View file

@ -22,6 +22,7 @@ import android.view.ViewGroup
import android.widget.Toast
import com.google.zxing.WriterException
import com.tangem.data.network.ServerApiHelper
import com.tangem.data.network.ServerApiHelperElectrum
import com.tangem.data.network.model.InfuraResponse
import com.tangem.data.network.request.ElectrumRequest
import com.tangem.data.nfc.VerifyCardTask
@ -59,6 +60,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
private var singleToast: Toast? = null
private var nfcManager: NfcManager? = null
private var serverApiHelper: ServerApiHelper? = null
private var serverApiHelperElectrum: ServerApiHelperElectrum? = null
var card: TangemCard? = null
private var lastTag: Tag? = null
var srlLoadedWallet: SwipeRefreshLayout? = null
@ -84,6 +86,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
nfcManager = NfcManager(activity, this)
serverApiHelper = ServerApiHelper()
serverApiHelperElectrum = ServerApiHelperElectrum()
sp = PreferenceManager.getDefaultSharedPreferences(activity)
@ -219,7 +222,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
}
// request electrum listener
serverApiHelper!!.setElectrumRequestData {
serverApiHelperElectrum!!.setElectrumRequestData {
requestCounter--
if (requestCounter == 0) srlLoadedWallet!!.isRefreshing = false
@ -233,7 +236,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
card!!.setBalanceConfirmed(confBalance)
card!!.balanceUnconfirmed = unconfirmedBalance
card!!.decimalBalance = confBalance.toString()
card!!.validationNodeDescription = serverApiHelper!!.validationNodeDescription
card!!.validationNodeDescription = serverApiHelperElectrum!!.validationNodeDescription
} catch (e: JSONException) {
e.printStackTrace()
engine.switchNode(card)
@ -476,7 +479,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
private fun requestElectrum(card: TangemCard, electrumRequest: ElectrumRequest) {
requestCounter++
serverApiHelper!!.electrumRequestData(card, electrumRequest)
serverApiHelperElectrum!!.electrumRequestData(card, electrumRequest)
}
private fun requestInfura(method: String, contract: String) {