# ============================================================ # Pezkuwi Wallet ProGuard Rules # ============================================================ # Keep line numbers for debugging crash reports -keepattributes SourceFile,LineNumberTable -renamesourcefileattribute SourceFile # ============================================================ # Kotlin # ============================================================ -dontwarn kotlin.** -keep class kotlin.Metadata { *; } -keepclassmembers class kotlin.Metadata { public ; } # Kotlin Coroutines -keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} -keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} -keepclassmembers class kotlinx.coroutines.** { volatile ; } -dontwarn kotlinx.coroutines.** # ============================================================ # Retrofit & OkHttp (Strict rules for generic type preservation) # ============================================================ -dontwarn okhttp3.** -dontwarn okio.** -dontwarn javax.annotation.** -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase # Keep Retrofit library -keep class retrofit2.** { *; } -keepclassmembers class retrofit2.** { *; } # Essential attributes for reflection -keepattributes Signature -keepattributes Exceptions -keepattributes InnerClasses -keepattributes EnclosingMethod -keepattributes RuntimeVisibleAnnotations -keepattributes RuntimeInvisibleAnnotations -keepattributes RuntimeVisibleParameterAnnotations -keepattributes RuntimeInvisibleParameterAnnotations -keepattributes AnnotationDefault # Keep ALL interfaces with Retrofit annotations - NO allowshrinking/allowobfuscation -keep interface * { @retrofit2.http.* ; } # Keep the method signatures including generic types -keepclasseswithmembers interface * { @retrofit2.http.* ; } # ============================================================ # Gson # ============================================================ -keepattributes Signature -keepattributes *Annotation* -dontwarn sun.misc.** -keep class com.google.gson.** { *; } -keep class * extends com.google.gson.TypeAdapter -keep class * implements com.google.gson.TypeAdapterFactory -keep class * implements com.google.gson.JsonSerializer -keep class * implements com.google.gson.JsonDeserializer # R8 full mode keeps generic signatures only on kept classes, so an anonymous `object : TypeToken() {}` # lost its T: chains failed to load from the local DB ("TypeToken must be created with a type argument"). # Gson 2.11 ships these rules; this app is on 2.10.1. -keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken -keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken # web3j's TypeReference reads its type argument the same way; without it the EVM token balance flow # failed with "Missing type parameter". -keep,allowobfuscation,allowshrinking class * extends org.web3j.abi.TypeReference # Retrofit reads a suspend function's return type from Continuation's generic signature (rules from # Retrofit 2.10; this app is on 2.9.0). -keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation -keep,allowobfuscation,allowshrinking interface retrofit2.Call -keep,allowobfuscation,allowshrinking class retrofit2.Response -keepclassmembers,allowobfuscation class * { @com.google.gson.annotations.SerializedName ; } # ============================================================ # BouncyCastle Crypto # ============================================================ -keep class org.bouncycastle.** { *; } -dontwarn org.bouncycastle.** # ============================================================ # EdDSA (net.i2p.crypto:eddsa, pulled in transitively by substrate-sdk-android) # ============================================================ # Signer.kt/SignatureVerifier.kt look up this JCA provider by name at runtime # (Signature.getInstance(..., "EdDSA")) - every Ed25519 signature (all Solana # transactions, and any Substrate account using CryptoType.ED25519) goes # through this provider, so its classes must survive obfuscation intact. -keep class net.i2p.crypto.eddsa.** { *; } -dontwarn net.i2p.crypto.eddsa.** # ============================================================ # Native JNI Bindings (Rust) # ============================================================ # SR25519 signing - keep the native methods and the class -keep class io.novafoundation.nova.sr25519.BizinikiwSr25519 { *; } # Names of classes with native methods and of those methods, which JNI binds by name. (A # `-keep class io.novafoundation.nova.** { native ; }` here kept every class of the app, # native methods or not.) -keepclasseswithmembernames class * { native ; } # Keep all JNI related classes -keep class io.parity.** { *; } # Runtime signers -keep class io.novafoundation.nova.runtime.extrinsic.signer.** { *; } # ============================================================ # Substrate SDK # ============================================================ -keep class jp.co.soramitsu.** { *; } -dontwarn jp.co.soramitsu.** # Nova Substrate SDK (io.novasama) -keep class io.novasama.substrate_sdk_android.** { *; } -keepclassmembers class io.novasama.substrate_sdk_android.** { *; } -dontwarn io.novasama.substrate_sdk_android.** # XXHash library (used by Substrate SDK hashing) -keep class net.jpountz.** { *; } -keepclassmembers class net.jpountz.** { *; } -dontwarn net.jpountz.** # Keep Schema objects and their delegated properties -keep class * extends io.novasama.substrate_sdk_android.scale.Schema { *; } -keepclassmembers class * extends io.novasama.substrate_sdk_android.scale.Schema { ; ; } # ============================================================ # Secrets & Crypto Classes # ============================================================ -keep class io.novafoundation.nova.common.data.secrets.** { *; } -keepclassmembers class io.novafoundation.nova.common.data.secrets.** { *; } -keep class io.novafoundation.nova.feature_account_impl.data.secrets.** { *; } -keep class io.novafoundation.nova.feature_account_impl.data.repository.datasource.** { *; } -keep class io.novafoundation.nova.feature_account_impl.data.repository.addAccount.** { *; } # ============================================================ # Firebase # ============================================================ -keep class com.google.firebase.** { *; } -dontwarn com.google.firebase.** -keep class com.google.android.gms.** { *; } -dontwarn com.google.android.gms.** # ============================================================ # Branch.io Deep Linking # ============================================================ -keep class io.branch.** { *; } -dontwarn io.branch.** # ============================================================ # Web3j (Ethereum) # ============================================================ -keep class org.web3j.** { *; } -dontwarn org.web3j.** # ============================================================ # SQLCipher # ============================================================ -keep class net.sqlcipher.** { *; } -dontwarn net.sqlcipher.** # ============================================================ # Room Database # ============================================================ -keep class * extends androidx.room.RoomDatabase -keep @androidx.room.Entity class * -dontwarn androidx.room.paging.** # ============================================================ # Data Classes & Models (Keep for serialization) # ============================================================ -keep class io.novafoundation.nova.**.model.** { *; } -keep class io.novafoundation.nova.**.response.** { *; } -keep class io.novafoundation.nova.**.request.** { *; } -keep class io.novafoundation.nova.**.dto.** { *; } -keep class io.novafoundation.nova.**.*Remote { *; } -keep class io.novafoundation.nova.**.*Remote$* { *; } # ============================================================ # Parcelable # ============================================================ -keepclassmembers class * implements android.os.Parcelable { public static final ** CREATOR; } # ============================================================ # Enums # ============================================================ -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # ============================================================ # Serializable # ============================================================ -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # ============================================================ # Ledger USB/Bluetooth # ============================================================ -keep class io.novafoundation.nova.feature_ledger_impl.** { *; } # ============================================================ # WalletConnect # ============================================================ -keep class com.walletconnect.** { *; } -keepclassmembers class com.walletconnect.** { *; } -dontwarn com.walletconnect.** # ============================================================ # Google API Client (Google Drive) # ============================================================ -keep class com.google.api.** { *; } -keepclassmembers class com.google.api.** { *; } -keep class com.google.api.client.** { *; } -keepclassmembers class com.google.api.client.** { *; } -keep class com.google.api.services.** { *; } -keepclassmembers class com.google.api.services.** { *; } -dontwarn com.google.api.** # ============================================================ # Navigation Component # ============================================================ -keep class * extends androidx.navigation.Navigator { *; } -keep @androidx.navigation.Navigator.Name class * { *; } -keepnames class * extends androidx.navigation.Navigator -keepattributes *Annotation* -keep class androidx.navigation.** { *; } -keep class * implements androidx.navigation.NavArgs { *; } -keep class androidx.navigation.fragment.** { *; } -keep class io.novafoundation.nova.**.navigation.** { *; } -keep class * extends androidx.navigation.NavDestination { *; } # Field names of the app's own classes, so Gson reads and writes JSON by the declared names even where a # class has no @SerializedName and sits outside the model/response/request/dto packages kept above. # Class and method names are obfuscated. -keepclassmembers class io.novafoundation.nova.** { ; } # Constructors of the app's classes. R8 full mode makes a class it never sees instantiated abstract, and # Gson instantiates its models reflectively: DappMetadataResponse, outside every name pattern above, # failed with "Abstract classes can't be instantiated". Constructors are named either way, so # this costs no obfuscation, and it applies only to classes that are otherwise kept. -keepclassmembers class io.novafoundation.nova.** { (...); } # Methods a WebView page calls by name (DApp browser web3 bridge, integrity check, Transak events). -keepclassmembers class * { @android.webkit.JavascriptInterface ; } # ============================================================ # Optimization settings # ============================================================ -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*,!method/inlining/* -optimizationpasses 5 -allowaccessmodification # Don't optimize or obfuscate Retrofit interfaces - critical for type reflection -keepnames,includedescriptorclasses interface * { @retrofit2.http.* ; } # ============================================================ # Don't warn about missing classes that we don't use # ============================================================ -dontwarn org.conscrypt.** -dontwarn org.slf4j.** -dontwarn javax.naming.** -dontwarn org.w3c.dom.traversal.** -dontwarn org.apache.xerces.** -dontwarn org.apache.xml.** -dontwarn org.apache.xalan.** -dontwarn org.ietf.jgss.** -dontwarn org.apache.http.** # Referenced only by Jackson's Java 7 support class, which Jackson loads defensively; Android has no # java.beans. R8 compatibility mode reports these as missing. -dontwarn java.beans.ConstructorProperties -dontwarn java.beans.Transient # ByteBuddy (test dependency) -dontwarn net.bytebuddy.** -dontwarn com.sun.jna.** -dontwarn edu.umd.cs.findbugs.annotations.**