From 02f36bf5397b0eba5302ee28178172787364a6a5 Mon Sep 17 00:00:00 2001 From: James Brown Date: Fri, 19 Apr 2024 14:21:25 +1000 Subject: [PATCH] Update ticker call --- app/src/main/cpp/keys.c | 22 +++++++ .../app/repository/KeyProvider.java | 4 ++ .../app/repository/KeyProviderJNIImpl.java | 4 ++ .../app/service/TickerService.java | 59 ++++++++++++++----- .../app/di/mock/KeyProviderMockImpl.java | 12 ++++ .../KeyProviderMockNonProductionImpl.java | 12 ++++ 6 files changed, 99 insertions(+), 14 deletions(-) diff --git a/app/src/main/cpp/keys.c b/app/src/main/cpp/keys.c index 8d7ba966cf..ba19fd8d6a 100644 --- a/app/src/main/cpp/keys.c +++ b/app/src/main/cpp/keys.c @@ -310,6 +310,28 @@ Java_com_alphawallet_app_repository_KeyProviderJNIImpl_getSmartPassKey( JNIEnv* #endif } +JNIEXPORT jstring JNICALL +Java_com_alphawallet_app_repository_KeyProviderJNIImpl_getCoinGeckoKey( JNIEnv* env, jclass thiz ) +{ +#if (HAS_KEYS == 1) + return getDecryptedKey(env, coinGeckoKey); +#else + const jstring key = ""; + return (*env)->NewStringUTF(env, key); +#endif +} + +JNIEXPORT jstring JNICALL +Java_com_alphawallet_app_repository_KeyProviderJNIImpl_getBackupKey( JNIEnv* env, jclass thiz ) +{ +#if (HAS_KEYS == 1) + return getDecryptedKey(env, backupKey1); +#else + const jstring key = ""; + return (*env)->NewStringUTF(env, key); +#endif +} + JNIEXPORT jstring JNICALL Java_com_alphawallet_app_repository_KeyProviderJNIImpl_getSmartPassDevKey( JNIEnv* env, jclass thiz ) { diff --git a/app/src/main/java/com/alphawallet/app/repository/KeyProvider.java b/app/src/main/java/com/alphawallet/app/repository/KeyProvider.java index 6ab5b91d55..4e68afafe3 100644 --- a/app/src/main/java/com/alphawallet/app/repository/KeyProvider.java +++ b/app/src/main/java/com/alphawallet/app/repository/KeyProvider.java @@ -49,4 +49,8 @@ public interface KeyProvider String getSmartPassKey(); String getSmartPassDevKey(); + + String getCoinGeckoKey(); + + String getBackupKey(); } diff --git a/app/src/main/java/com/alphawallet/app/repository/KeyProviderJNIImpl.java b/app/src/main/java/com/alphawallet/app/repository/KeyProviderJNIImpl.java index fe54320142..11c10f2ea4 100644 --- a/app/src/main/java/com/alphawallet/app/repository/KeyProviderJNIImpl.java +++ b/app/src/main/java/com/alphawallet/app/repository/KeyProviderJNIImpl.java @@ -54,4 +54,8 @@ public KeyProviderJNIImpl() public native String getSmartPassKey(); public native String getSmartPassDevKey(); + + public native String getCoinGeckoKey(); + + public native String getBackupKey(); } diff --git a/app/src/main/java/com/alphawallet/app/service/TickerService.java b/app/src/main/java/com/alphawallet/app/service/TickerService.java index 528232551d..58a2f0158e 100644 --- a/app/src/main/java/com/alphawallet/app/service/TickerService.java +++ b/app/src/main/java/com/alphawallet/app/service/TickerService.java @@ -33,6 +33,8 @@ import com.alphawallet.app.entity.tokens.Token; import com.alphawallet.app.entity.tokens.TokenCardMeta; import com.alphawallet.app.repository.EthereumNetworkRepository; +import com.alphawallet.app.repository.KeyProvider; +import com.alphawallet.app.repository.KeyProviderFactory; import com.alphawallet.app.repository.PreferenceRepositoryType; import com.alphawallet.app.repository.TokenLocalSource; import com.alphawallet.app.repository.TokenRepository; @@ -96,7 +98,7 @@ public class TickerService private static final boolean ALLOW_UNVERIFIED_TICKERS = false; //allows verified:false tickers from DEX.GURU. Not recommended public static final long TICKER_TIMEOUT = DateUtils.WEEK_IN_MILLIS; //remove ticker if not seen in one week public static final long TICKER_STALE_TIMEOUT = 30 * DateUtils.MINUTE_IN_MILLIS; //Use market API if AlphaWallet market oracle not updating - + private final KeyProvider keyProvider = KeyProviderFactory.get(); private final OkHttpClient httpClient; private final PreferenceRepositoryType sharedPrefs; private final TokenLocalSource localSource; @@ -107,6 +109,7 @@ public class TickerService private static final ConcurrentLinkedDeque tokenCheckQueue = new ConcurrentLinkedDeque<>(); private static final Map dexGuruQuery = new ConcurrentHashMap<>(); private static long lastTickerUpdate; + private static int keyCycle = 0; @Nullable private Disposable tickerUpdateTimer; @@ -290,7 +293,7 @@ private List nextTickerSet(int count) { List tickerList = new ArrayList<>(count); long chainId = 0; - if (tokenCheckQueue.size() > 0) + if (!tokenCheckQueue.isEmpty()) { List addBack = new ArrayList<>(); TokenCardMeta firstTcm = tokenCheckQueue.removeFirst(); @@ -325,7 +328,7 @@ private List nextTickerSet(int count) public Single syncERC20Tickers(long chainId, List erc20Tokens) { //add to queue here - long staleTime = System.currentTimeMillis() - 5 * DateUtils.MINUTE_IN_MILLIS; + long staleTime = System.currentTimeMillis() - 10 * DateUtils.MINUTE_IN_MILLIS; //only check networks with value and if there's actually tokens to check if (!EthereumNetworkRepository.hasRealValue(chainId) || erc20Tokens.isEmpty()) { @@ -345,7 +348,7 @@ public Single syncERC20Tickers(long chainId, List erc20T } } - if (tokenCheckQueue.size() == 0) + if (tokenCheckQueue.isEmpty()) { return Single.fromCallable(() -> 0); } @@ -425,14 +428,16 @@ private Map fetchERC20TokenTickers(List erc2 isFirst = false; } - Request request = new Request.Builder() + Request.Builder buildRequest = new Request.Builder() .url(COINGECKO_API.replace(CHAIN_IDS, apiChainName).replace(CONTRACT_ADDR, sb.toString()).replace(CURRENCY_TOKEN, currentCurrencySymbolTxt)) - .get() - .build(); + .get(); + + addAPIHeader(buildRequest); - try (okhttp3.Response response = httpClient.newCall(request) + try (okhttp3.Response response = httpClient.newCall(buildRequest.build()) .execute()) { + int code = response.code(); String responseStr = response.body().string(); List tickers = CoinGeckoTicker.buildTickerList(responseStr, currentCurrencySymbolTxt, currentConversionRate); for (CoinGeckoTicker t : tickers) @@ -448,22 +453,48 @@ private Map fetchERC20TokenTickers(List erc2 } else { - final Map blankTickers = new HashMap<>(); //These tokens have no ticker, don't check them again today - for (String address : lookupMap.keySet()) - { - blankTickers.put(address, new TokenTicker(System.currentTimeMillis() + DateUtils.DAY_IN_MILLIS)); - } - localSource.updateERC20Tickers(chainId, blankTickers); + addDelayCheckOnTickers(code, chainId, lookupMap); } } catch (Exception e) { Timber.e(e); + addDelayCheckOnTickers(0, chainId, lookupMap); } return erc20Tickers; } + private void addAPIHeader(Request.Builder buildRequest) + { + String coinGeckoKey = keyProvider.getCoinGeckoKey(); + String backupKey = keyProvider.getBackupKey(); + + if (!TextUtils.isEmpty(coinGeckoKey)) + { + if (keyCycle%3 == 0) + { + buildRequest.addHeader("x-cg-demo-api-key", coinGeckoKey); + } + else if (keyCycle%3 == 1) + { + buildRequest.addHeader("x-cg-demo-api-key", backupKey); + } + keyCycle++; + } + } + + private void addDelayCheckOnTickers(int code, long chainId, Map lookupMap) + { + long delayTime = (code/100 == 2) ? DateUtils.DAY_IN_MILLIS * 5 : DateUtils.MINUTE_IN_MILLIS * 30; // if API call was successful, and no ticker was found, don't check for 5 days + final Map blankTickers = new HashMap<>(); //These tokens have no ticker, don't check them again for another hour + for (String address : lookupMap.keySet()) + { + blankTickers.put(address, new TokenTicker(System.currentTimeMillis() + delayTime)); + } + localSource.updateERC20Tickers(chainId, blankTickers); + } + private void addDexGuruTickers(Collection tokens) { for (TokenCardMeta tcm : tokens) diff --git a/app/src/test/java/com/alphawallet/app/di/mock/KeyProviderMockImpl.java b/app/src/test/java/com/alphawallet/app/di/mock/KeyProviderMockImpl.java index 0969a84731..50be0eb5fe 100644 --- a/app/src/test/java/com/alphawallet/app/di/mock/KeyProviderMockImpl.java +++ b/app/src/test/java/com/alphawallet/app/di/mock/KeyProviderMockImpl.java @@ -149,4 +149,16 @@ public String getSmartPassDevKey() { return FAKE_KEY_FOR_TESTING; } + + @Override + public String getCoinGeckoKey() + { + return FAKE_KEY_FOR_TESTING; + } + + @Override + public String getBackupKey() + { + return FAKE_KEY_FOR_TESTING; + } } diff --git a/app/src/test/java/com/alphawallet/app/di/mock/KeyProviderMockNonProductionImpl.java b/app/src/test/java/com/alphawallet/app/di/mock/KeyProviderMockNonProductionImpl.java index b9def34506..866d995530 100644 --- a/app/src/test/java/com/alphawallet/app/di/mock/KeyProviderMockNonProductionImpl.java +++ b/app/src/test/java/com/alphawallet/app/di/mock/KeyProviderMockNonProductionImpl.java @@ -145,4 +145,16 @@ public String getSmartPassDevKey() { return null; } + + @Override + public String getCoinGeckoKey() + { + return null; + } + + @Override + public String getBackupKey() + { + return null; + } }