From 32002db5dac5beb9be545981cf8268d46b62bebd Mon Sep 17 00:00:00 2001 From: Satoshi Qazi Muhammed Date: Sun, 12 Jul 2026 05:08:22 -0700 Subject: [PATCH] feat: send TronGrid API key on every request to raise the anonymous rate limit Complements the retryOn429 fix - having a key means requests are far less likely to hit the rate limit at all, rather than just retrying transparently after they do. Wired the same way as INFURA_API_KEY/DWELLIR_API_KEY: buildConfigField read from local.properties or CI secret, added TRONGRID_API_KEY to android_build.yml's secret passthrough (every caller already uses secrets: inherit, so no per-workflow changes needed beyond this). --- .github/workflows/android_build.yml | 4 ++++ .../data/network/tron/RetrofitTronGridApi.kt | 21 ++++++++++++------- runtime/build.gradle | 1 + 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/workflows/android_build.yml b/.github/workflows/android_build.yml index d657dfab..fcd1cc25 100644 --- a/.github/workflows/android_build.yml +++ b/.github/workflows/android_build.yml @@ -62,6 +62,9 @@ on: # RPC provider - use own nodes or Dwellir DWELLIR_API_KEY: required: false + # Tron - raises TronGrid's aggressive anonymous rate limit + TRONGRID_API_KEY: + required: false # WalletConnect - REQUIRED for dApp connections WALLET_CONNECT_PROJECT_ID: required: true @@ -111,6 +114,7 @@ env: EHTERSCAN_API_KEY_ETHEREUM: ${{ secrets.EHTERSCAN_API_KEY_ETHEREUM }} INFURA_API_KEY: ${{ secrets.INFURA_API_KEY }} DWELLIR_API_KEY: ${{ secrets.DWELLIR_API_KEY }} + TRONGRID_API_KEY: ${{ secrets.TRONGRID_API_KEY }} WALLET_CONNECT_PROJECT_ID: ${{ secrets.WALLET_CONNECT_PROJECT_ID }} DEBUG_GOOGLE_OAUTH_ID: ${{ secrets.DEBUG_GOOGLE_OAUTH_ID }} RELEASE_GOOGLE_OAUTH_ID: ${{ secrets.RELEASE_GOOGLE_OAUTH_ID }} diff --git a/feature-wallet-impl/src/main/java/io/novafoundation/nova/feature_wallet_impl/data/network/tron/RetrofitTronGridApi.kt b/feature-wallet-impl/src/main/java/io/novafoundation/nova/feature_wallet_impl/data/network/tron/RetrofitTronGridApi.kt index 15025fcd..c1616e91 100644 --- a/feature-wallet-impl/src/main/java/io/novafoundation/nova/feature_wallet_impl/data/network/tron/RetrofitTronGridApi.kt +++ b/feature-wallet-impl/src/main/java/io/novafoundation/nova/feature_wallet_impl/data/network/tron/RetrofitTronGridApi.kt @@ -11,39 +11,46 @@ import io.novafoundation.nova.feature_wallet_impl.data.network.tron.model.TronCr import io.novafoundation.nova.feature_wallet_impl.data.network.tron.model.TronTriggerContractRequest import io.novafoundation.nova.feature_wallet_impl.data.network.tron.model.TronTriggerContractResponse import io.novafoundation.nova.feature_wallet_impl.data.network.tron.model.TronUnsignedTransactionResponse +import io.novafoundation.nova.runtime.BuildConfig import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.Headers import retrofit2.http.POST import retrofit2.http.Url +// TronGrid's anonymous rate limit is aggressive enough to surface under normal, human-paced app usage (see +// RealTronGridApi.retryOn429's doc comment) - a free API key from trongrid.io raises it substantially. Sent on +// every request rather than only when a 429 is hit, since the point is to avoid needing the retry in the first +// place, not just to have a fallback. +private const val TRON_API_KEY_HEADER = "TRON-PRO-API-KEY: " + BuildConfig.TRONGRID_API_KEY + interface RetrofitTronGridApi { @GET - @Headers(UserAgent.NOVA) + @Headers(UserAgent.NOVA, TRON_API_KEY_HEADER) suspend fun getAccount(@Url url: String): TronAccountResponse @POST - @Headers(UserAgent.NOVA) + @Headers(UserAgent.NOVA, TRON_API_KEY_HEADER) suspend fun createTransaction(@Url url: String, @Body body: TronCreateTransactionRequest): TronUnsignedTransactionResponse @POST - @Headers(UserAgent.NOVA) + @Headers(UserAgent.NOVA, TRON_API_KEY_HEADER) suspend fun triggerConstantContract(@Url url: String, @Body body: TronTriggerContractRequest): TronTriggerContractResponse @POST - @Headers(UserAgent.NOVA) + @Headers(UserAgent.NOVA, TRON_API_KEY_HEADER) suspend fun triggerSmartContract(@Url url: String, @Body body: TronTriggerContractRequest): TronTriggerContractResponse @POST - @Headers(UserAgent.NOVA) + @Headers(UserAgent.NOVA, TRON_API_KEY_HEADER) suspend fun broadcastTransaction(@Url url: String, @Body body: TronBroadcastRequest): TronBroadcastResponse @GET - @Headers(UserAgent.NOVA) + @Headers(UserAgent.NOVA, TRON_API_KEY_HEADER) suspend fun getChainParameters(@Url url: String): TronChainParametersResponse @POST - @Headers(UserAgent.NOVA) + @Headers(UserAgent.NOVA, TRON_API_KEY_HEADER) suspend fun getAccountResource(@Url url: String, @Body body: TronAddressRequest): TronAccountResourceResponse } diff --git a/runtime/build.gradle b/runtime/build.gradle index c9824e66..df246f23 100644 --- a/runtime/build.gradle +++ b/runtime/build.gradle @@ -21,6 +21,7 @@ android { buildConfigField "String", "INFURA_API_KEY", readStringSecret("INFURA_API_KEY") buildConfigField "String", "DWELLIR_API_KEY", readStringSecret("DWELLIR_API_KEY") + buildConfigField "String", "TRONGRID_API_KEY", readStringSecret("TRONGRID_API_KEY") } buildTypes {