Initial commit: Pezkuwi Wallet Android

Security hardened release:
- Code obfuscation enabled (minifyEnabled=true, shrinkResources=true)
- Sensitive files excluded (google-services.json, keystores)
- Branch.io key moved to BuildConfig placeholder
- Updated dependencies: OkHttp 4.12.0, Gson 2.10.1, BouncyCastle 1.77
- Comprehensive ProGuard rules for crypto wallet
- Navigation 2.7.7, Lifecycle 2.7.0, ConstraintLayout 2.1.4
This commit is contained in:
2026-02-12 05:19:41 +03:00
commit a294aa1a6b
7687 changed files with 441811 additions and 0 deletions
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -0,0 +1,20 @@
package io.novafoundation.nova.feature_buy_api.di
import io.novafoundation.nova.feature_buy_api.di.deeplinks.BuyDeepLinks
import io.novafoundation.nova.feature_buy_api.presentation.trade.TradeTokenRegistry
import io.novafoundation.nova.feature_buy_api.presentation.mixin.TradeMixin
import io.novafoundation.nova.feature_buy_api.presentation.trade.interceptors.mercuryo.MercuryoBuyRequestInterceptorFactory
import io.novafoundation.nova.feature_buy_api.presentation.trade.interceptors.mercuryo.MercuryoSellRequestInterceptorFactory
interface BuyFeatureApi {
val buyTokenRegistry: TradeTokenRegistry
val tradeMixinFactory: TradeMixin.Factory
val mercuryoBuyRequestInterceptorFactory: MercuryoBuyRequestInterceptorFactory
val mercuryoSellRequestInterceptorFactory: MercuryoSellRequestInterceptorFactory
val buyDeepLinks: BuyDeepLinks
}
@@ -0,0 +1,5 @@
package io.novafoundation.nova.feature_buy_api.di.deeplinks
import io.novafoundation.nova.feature_deep_linking.presentation.handling.DeepLinkHandler
class BuyDeepLinks(val deepLinkHandlers: List<DeepLinkHandler>)
@@ -0,0 +1,17 @@
package io.novafoundation.nova.feature_buy_api.presentation.mixin
import io.novafoundation.nova.common.mixin.MixinFactory
import io.novafoundation.nova.feature_buy_api.presentation.trade.TradeProvider
import io.novafoundation.nova.feature_buy_api.presentation.trade.TradeTokenRegistry
import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
interface TradeMixin {
fun providersFor(chainAsset: Chain.Asset, tradeType: TradeTokenRegistry.TradeType): List<TradeProvider>
fun <T> providerFor(chainAsset: Chain.Asset, tradeFlow: TradeTokenRegistry.TradeType, providerId: String): T
interface Presentation : TradeMixin
interface Factory : MixinFactory<TradeMixin>
}
@@ -0,0 +1,62 @@
package io.novafoundation.nova.feature_buy_api.presentation.trade
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import io.novafoundation.nova.feature_buy_api.presentation.trade.common.OnTradeOperationFinishedListener
import io.novafoundation.nova.feature_buy_api.presentation.trade.common.OnSellOrderCreatedListener
import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
typealias TradeProvider = TradeTokenRegistry.Provider<*>
interface TradeTokenRegistry {
fun hasProvider(chainAsset: Chain.Asset): Boolean
fun hasProvider(chainAsset: Chain.Asset, tradeType: TradeType): Boolean
fun availableProvidersFor(chainAsset: Chain.Asset, tradeType: TradeType): List<TradeProvider>
interface Provider<I : Integrator<*>> {
val id: String
val name: String
val officialUrl: String
@get:DrawableRes
val logoRes: Int
fun getPaymentMethods(tradeType: TradeType): List<PaymentMethod>
@StringRes
fun getDescriptionRes(tradeType: TradeType): Int
fun createIntegrator(
chainAsset: Chain.Asset,
address: String,
tradeFlow: TradeType,
onCloseListener: OnTradeOperationFinishedListener,
onSellOrderCreatedListener: OnSellOrderCreatedListener
): I
}
interface Integrator<T> {
suspend fun run(using: T)
}
enum class TradeType {
BUY, SELL
}
sealed interface PaymentMethod {
object Visa : PaymentMethod
object MasterCard : PaymentMethod
object ApplePay : PaymentMethod
object GooglePay : PaymentMethod
object Sepa : PaymentMethod
object BankTransfer : PaymentMethod
class Other(val quantity: Int) : PaymentMethod
}
}
@@ -0,0 +1,7 @@
package io.novafoundation.nova.feature_buy_api.presentation.trade.common
import java.math.BigDecimal
interface OnSellOrderCreatedListener {
fun onSellOrderCreated(orderId: String, address: String, amount: BigDecimal)
}
@@ -0,0 +1,5 @@
package io.novafoundation.nova.feature_buy_api.presentation.trade.common
interface OnTradeOperationFinishedListener {
fun onTradeOperationFinished(success: Boolean)
}
@@ -0,0 +1,10 @@
package io.novafoundation.nova.feature_buy_api.presentation.trade.interceptors.mercuryo
import io.novafoundation.nova.common.utils.webView.WebViewRequestInterceptor
import io.novafoundation.nova.feature_buy_api.presentation.trade.common.OnTradeOperationFinishedListener
interface MercuryoBuyRequestInterceptorFactory {
fun create(onTradeOperationFinishedListener: OnTradeOperationFinishedListener): MercuryoBuyRequestInterceptor
}
interface MercuryoBuyRequestInterceptor : WebViewRequestInterceptor
@@ -0,0 +1,14 @@
package io.novafoundation.nova.feature_buy_api.presentation.trade.interceptors.mercuryo
import io.novafoundation.nova.common.utils.webView.WebViewRequestInterceptor
import io.novafoundation.nova.feature_buy_api.presentation.trade.common.OnSellOrderCreatedListener
import io.novafoundation.nova.feature_buy_api.presentation.trade.common.OnTradeOperationFinishedListener
interface MercuryoSellRequestInterceptorFactory {
fun create(
tradeSellCallback: OnSellOrderCreatedListener,
onTradeOperationFinishedListener: OnTradeOperationFinishedListener
): MercuryoSellRequestInterceptor
}
interface MercuryoSellRequestInterceptor : WebViewRequestInterceptor
@@ -0,0 +1,5 @@
package io.novafoundation.nova.feature_buy_api.presentation.trade.providers
object ProviderUtils {
const val REDIRECT_URL_BASE = "https://www.google.com/"
}
@@ -0,0 +1,9 @@
package io.novafoundation.nova.feature_buy_api.presentation.trade.providers
import android.webkit.WebView
import io.novafoundation.nova.feature_buy_api.presentation.trade.TradeTokenRegistry
interface WebViewIntegrationProvider : TradeTokenRegistry.Provider<WebViewIntegrationProvider.Integrator> {
interface Integrator : TradeTokenRegistry.Integrator<WebView>
}