diff --git a/app/src/main/java/com/tangem/wallet/bch/BtcCashEngine.java b/app/src/main/java/com/tangem/wallet/bch/BtcCashEngine.java index e8aa917c5b..5694d0ad4a 100644 --- a/app/src/main/java/com/tangem/wallet/bch/BtcCashEngine.java +++ b/app/src/main/java/com/tangem/wallet/bch/BtcCashEngine.java @@ -679,7 +679,7 @@ public class BtcCashEngine extends CoinEngine { } } if (validateAddress(resolvedAddress)) { - if (resolvedAddress.equals(coinData.getWallet())) { + if (!resolvedAddress.equals(coinData.getWallet())) { coinData.setResolvedPayIdAddress(resolvedAddress); observer.onComplete(); } else { diff --git a/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java b/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java index 3bdc80e3b8..914296ee28 100644 --- a/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java +++ b/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java @@ -11,7 +11,10 @@ import com.tangem.data.Blockchain; import com.tangem.data.network.BinanceApi; import com.tangem.data.network.Server; import com.tangem.data.network.ServerApiBinance; +import com.tangem.data.network.ServerApiPayId; import com.tangem.data.network.model.BinanceFees; +import com.tangem.data.network.model.PayIdAddress; +import com.tangem.data.network.model.PayIdResponse; import com.tangem.tangem_card.data.TangemCard; import com.tangem.tangem_card.reader.CardProtocol; import com.tangem.tangem_card.tasks.SignTask; @@ -44,6 +47,10 @@ import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.List; +import io.reactivex.CompletableObserver; +import io.reactivex.SingleObserver; +import io.reactivex.observers.DisposableCompletableObserver; +import io.reactivex.observers.DisposableSingleObserver; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -490,8 +497,37 @@ public class BinanceAssetEngine extends CoinEngine { } public void requestFee(BlockchainRequestsCallbacks blockchainRequestsCallbacks, String targetAddress, Amount amount) { + CompletableObserver payIdObserver = new DisposableCompletableObserver() { + @Override + public void onComplete() { + checkFee(blockchainRequestsCallbacks); + } + + @Override + public void onError(Throwable e) { + ctx.setError(e.getMessage()); + blockchainRequestsCallbacks.onComplete(false); + } + }; + + if (targetAddress.contains("$")) { // PayID + resolvePayID(targetAddress, payIdObserver); + } else { + checkFee(blockchainRequestsCallbacks); + } + } + + private void checkFee(BlockchainRequestsCallbacks blockchainRequestsCallbacks) { try { - String baseUrl = Server.ApiBinance.Method.API_V1; + String baseUrl; + + if (ctx.getBlockchain() == Blockchain.Binance) { + baseUrl = Server.ApiBinance.Method.API_V1; + } else if (ctx.getBlockchain() == Blockchain.BinanceTestNet) { + baseUrl = Server.ApiBinanceTestnet.Method.API_V1; + } else { + throw new Exception("Invalid blockchain for BinanceEngine"); + } Retrofit retrofitBinance = new Retrofit.Builder() .baseUrl(baseUrl) @@ -535,6 +571,46 @@ public class BinanceAssetEngine extends CoinEngine { } } + private void resolvePayID(String targetAddress, CompletableObserver observer) { + final ServerApiPayId serverApiPayId = new ServerApiPayId(); + + SingleObserver payIdObserver = new DisposableSingleObserver() { + @Override + public void onSuccess(PayIdResponse payIdResponse) { + try { + String resolvedAddress = null; + for (PayIdAddress address : payIdResponse.getAddresses()) { + if (address.getPaymentNetwork().equals(ctx.getBlockchain().getCurrency()) && + address.getEnvironment().equals("MAINNET")) { + resolvedAddress = address.getAddressDetails().getAddress(); + break; + } + } + if (validateAddress(resolvedAddress)) { + if (!resolvedAddress.equals(coinData.getWallet())) { + coinData.setResolvedPayIdAddress(resolvedAddress); + observer.onComplete(); + } else { + observer.onError(new Exception("Resolved PayID address equals source address")); + } + } else { + observer.onError(new Exception("Unknown address format in PayID response")); + } + } catch (Exception e) { + observer.onError(new Exception("Unknown response format on PayID request")); + } + } + + @Override + public void onError(Throwable e) { + Log.i(TAG, "onFail: " + "payID" + " " + e.getMessage()); + observer.onError(new Exception("PayID error:" + e.getMessage())); + } + }; + + serverApiPayId.getAddress(targetAddress, ctx.getBlockchain(), payIdObserver); + } + public void requestSendTransaction(BlockchainRequestsCallbacks blockchainRequestsCallbacks, byte[] txForSend) { // RequestBody requestBody = TransactionRequestAssemblerExtSign.createRequestBody(txForSend); try { diff --git a/app/src/main/java/com/tangem/wallet/binance/BinanceEngine.java b/app/src/main/java/com/tangem/wallet/binance/BinanceEngine.java index 92198a18d2..5fc513cb3a 100644 --- a/app/src/main/java/com/tangem/wallet/binance/BinanceEngine.java +++ b/app/src/main/java/com/tangem/wallet/binance/BinanceEngine.java @@ -575,7 +575,7 @@ public class BinanceEngine extends CoinEngine { } } if (validateAddress(resolvedAddress)) { - if (resolvedAddress.equals(coinData.getWallet())) { + if (!resolvedAddress.equals(coinData.getWallet())) { coinData.setResolvedPayIdAddress(resolvedAddress); observer.onComplete(); } else { diff --git a/app/src/main/java/com/tangem/wallet/btc/BtcEngine.java b/app/src/main/java/com/tangem/wallet/btc/BtcEngine.java index 5d9960bc70..ced2861a0e 100644 --- a/app/src/main/java/com/tangem/wallet/btc/BtcEngine.java +++ b/app/src/main/java/com/tangem/wallet/btc/BtcEngine.java @@ -1087,7 +1087,7 @@ public class BtcEngine extends CoinEngine { } } if (validateAddress(resolvedAddress)) { - if (resolvedAddress.equals(coinData.getWallet())) { + if (!resolvedAddress.equals(coinData.getWallet())) { coinData.setResolvedPayIdAddress(resolvedAddress); observer.onComplete(); } else { diff --git a/app/src/main/java/com/tangem/wallet/cardano/CardanoEngine.java b/app/src/main/java/com/tangem/wallet/cardano/CardanoEngine.java index cd793259d3..16a7e2b2c6 100644 --- a/app/src/main/java/com/tangem/wallet/cardano/CardanoEngine.java +++ b/app/src/main/java/com/tangem/wallet/cardano/CardanoEngine.java @@ -775,7 +775,7 @@ public class CardanoEngine extends CoinEngine { } } if (validateAddress(resolvedAddress)) { - if (resolvedAddress.equals(coinData.getWallet())) { + if (!resolvedAddress.equals(coinData.getWallet())) { coinData.setResolvedPayIdAddress(resolvedAddress); observer.onComplete(); } else { diff --git a/app/src/main/java/com/tangem/wallet/ducatus/DucatusEngine.java b/app/src/main/java/com/tangem/wallet/ducatus/DucatusEngine.java index 07fb1ce855..a18a6683ca 100644 --- a/app/src/main/java/com/tangem/wallet/ducatus/DucatusEngine.java +++ b/app/src/main/java/com/tangem/wallet/ducatus/DucatusEngine.java @@ -604,7 +604,7 @@ public class DucatusEngine extends BtcEngine { } } if (validateAddress(resolvedAddress)) { - if (resolvedAddress.equals(coinData.getWallet())) { + if (!resolvedAddress.equals(coinData.getWallet())) { coinData.setResolvedPayIdAddress(resolvedAddress); observer.onComplete(); } else { diff --git a/app/src/main/java/com/tangem/wallet/ltc/LtcEngine.java b/app/src/main/java/com/tangem/wallet/ltc/LtcEngine.java index bdbdf8461a..9e92abd656 100644 --- a/app/src/main/java/com/tangem/wallet/ltc/LtcEngine.java +++ b/app/src/main/java/com/tangem/wallet/ltc/LtcEngine.java @@ -758,7 +758,7 @@ public class LtcEngine extends BtcEngine { } } if (validateAddress(resolvedAddress)) { - if (resolvedAddress.equals(coinData.getWallet())) { + if (!resolvedAddress.equals(coinData.getWallet())) { coinData.setResolvedPayIdAddress(resolvedAddress); observer.onComplete(); } else { diff --git a/app/src/main/java/com/tangem/wallet/xlm/XlmEngine.java b/app/src/main/java/com/tangem/wallet/xlm/XlmEngine.java index 7008da837a..42b5403b7d 100644 --- a/app/src/main/java/com/tangem/wallet/xlm/XlmEngine.java +++ b/app/src/main/java/com/tangem/wallet/xlm/XlmEngine.java @@ -598,7 +598,7 @@ public class XlmEngine extends CoinEngine { } } if (validateAddress(resolvedAddress)) { - if (resolvedAddress.equals(coinData.getWallet())) { + if (!resolvedAddress.equals(coinData.getWallet())) { coinData.setResolvedPayIdAddress(resolvedAddress); observer.onComplete(); } else {