diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 847507ba5f..2bcdbe0de8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -110,6 +110,7 @@ dependencies { implementation(project(":network")) implementation(project(":common")) implementation(project(":core:ui")) + implementation(project(":libs:crypto")) /** AndroidX libraries */ implementation(AndroidX.coreKtx) diff --git a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt new file mode 100644 index 0000000000..a323e29196 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt @@ -0,0 +1,14 @@ +package com.tangem.tap.proxy + +import com.tangem.crypto.DerivationManager + +class DerivationManagerImpl : DerivationManager { + + override fun deriveMissingBlockchains(networkId: String?) { + TODO("Not yet implemented") + } + + override fun hasDerivation(): Boolean { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt new file mode 100644 index 0000000000..45843af752 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -0,0 +1,27 @@ +package com.tangem.tap.proxy + +import com.tangem.crypto.UserWalletManager +import com.tangem.crypto.models.Token + +class UserWalletManagerImpl : UserWalletManager { + + override fun getUserTokens(): List { + TODO("Not yet implemented") + } + + override fun getWalletId(): String { + TODO("Not yet implemented") + } + + override fun isTokenAdded(token: Token): Boolean { + TODO("Not yet implemented") + } + + override fun addToken(token: Token) { + TODO("Not yet implemented") + } + + override fun getWalletAddress(token: Token): String { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/referral/models/ReferralResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/referral/models/ReferralResponse.kt index ef8823e877..061aa55155 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/referral/models/ReferralResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/referral/models/ReferralResponse.kt @@ -26,7 +26,7 @@ data class Token( @Json(name = "symbol") val symbol: String, @Json(name = "networkId") val networkId: String?, @Json(name = "contractAddress") val contractAddress: String?, - @Json(name = "decimalCount") val decimalCount: Int, + @Json(name = "decimalCount") val decimalCount: Int?, ) data class Referral( diff --git a/features/referral/domain/build.gradle.kts b/features/referral/domain/build.gradle.kts index 561cbe2b15..bcee4c51cc 100644 --- a/features/referral/domain/build.gradle.kts +++ b/features/referral/domain/build.gradle.kts @@ -26,6 +26,10 @@ android { dependencies { + /** Libs */ + implementation(project(":core:utils")) + implementation(project(":libs:crypto")) + /** Time */ implementation(Library.jodatime) diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractor.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractor.kt new file mode 100644 index 0000000000..a59b0e3b56 --- /dev/null +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractor.kt @@ -0,0 +1,10 @@ +package com.tangem.feature.referral.domain + +import com.tangem.feature.referral.domain.models.ReferralData + +interface ReferralInteractor { + + suspend fun getReferralStatus(): ReferralData + + suspend fun startReferral(): ReferralData +} \ No newline at end of file diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt new file mode 100644 index 0000000000..3e2dd73ba7 --- /dev/null +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt @@ -0,0 +1,54 @@ +package com.tangem.feature.referral.domain + +import com.tangem.crypto.DerivationManager +import com.tangem.crypto.UserWalletManager +import com.tangem.crypto.models.Token +import com.tangem.feature.referral.domain.converter.TokensConverter +import com.tangem.feature.referral.domain.models.ReferralData +import com.tangem.feature.referral.domain.models.TokenData + +internal class ReferralInteractorImpl( + private val repository: ReferralRepository, + private val derivationManager: DerivationManager, + private val userWalletManager: UserWalletManager, + private val tokensConverter: TokensConverter, +) : ReferralInteractor { + + private val tokensForReferral = mutableListOf() + + override suspend fun getReferralStatus(): ReferralData { + val refStatus = repository.getReferralStatus(userWalletManager.getWalletId()) + saveRefTokens(refStatus.tokens) + return refStatus + } + + override suspend fun startReferral(): ReferralData { + if (tokensForReferral.isNotEmpty()) { + val token = tokensConverter.convert(tokensForReferral.first()) + deriveOrAddTokens(token) + val publicAddress = userWalletManager.getWalletAddress(token) + return repository.startReferral( + walletId = userWalletManager.getWalletId(), + networkId = token.networkId ?: "", + tokenId = token.id, + address = publicAddress, + ) + } else { + throw IllegalStateException("tokens for ref is empty") + } + } + + private fun deriveOrAddTokens(token: Token) { + if (!derivationManager.hasDerivation()) { + derivationManager.deriveMissingBlockchains(token.networkId) + } + if (!userWalletManager.isTokenAdded(token)) { + userWalletManager.addToken(token) + } + } + + private fun saveRefTokens(tokens: List) { + tokensForReferral.clear() + tokensForReferral.addAll(tokens) + } +} \ No newline at end of file diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/converter/TokensConverter.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/converter/TokensConverter.kt new file mode 100644 index 0000000000..0a8c565e68 --- /dev/null +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/converter/TokensConverter.kt @@ -0,0 +1,19 @@ +package com.tangem.feature.referral.domain.converter + +import com.tangem.crypto.models.Token +import com.tangem.feature.referral.domain.models.TokenData +import com.tangem.utils.converter.Converter + +class TokensConverter : Converter { + + override fun convert(value: TokenData): Token { + return Token( + id = value.id, + name = value.name, + symbol = value.symbol, + networkId = value.networkId, + contractAddress = value.contractAddress, + decimalCount = value.decimalCount, + ) + } +} \ No newline at end of file diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/models/ReferralData.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/models/ReferralData.kt index ba5f803e59..79216aec7d 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/models/ReferralData.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/models/ReferralData.kt @@ -36,7 +36,7 @@ data class TokenData( val symbol: String, val networkId: String?, val contractAddress: String?, - val decimalCount: Int, + val decimalCount: Int?, ) data class ReferralInfo( diff --git a/libs/crypto/.gitignore b/libs/crypto/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/libs/crypto/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/libs/crypto/build.gradle.kts b/libs/crypto/build.gradle.kts new file mode 100644 index 0000000000..b6d1313ae0 --- /dev/null +++ b/libs/crypto/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("com.android.library") + kotlin("android") +} + +android { + + defaultConfig { + compileSdk = AppConfig.compileSdkVersion + minSdk = AppConfig.minSdkVersion + targetSdk = AppConfig.targetSdkVersion + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + isCoreLibraryDesugaringEnabled = false + } +} + +dependencies { + + /** Coroutines */ + implementation(Library.coroutine) +} \ No newline at end of file diff --git a/libs/crypto/src/main/AndroidManifest.xml b/libs/crypto/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..1fd7238d41 --- /dev/null +++ b/libs/crypto/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/DerivationManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/DerivationManager.kt new file mode 100644 index 0000000000..8e77e85480 --- /dev/null +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/DerivationManager.kt @@ -0,0 +1,8 @@ +package com.tangem.crypto + +interface DerivationManager { + + fun deriveMissingBlockchains(networkId: String?) + + fun hasDerivation(): Boolean +} \ No newline at end of file diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt new file mode 100644 index 0000000000..8bb117cd15 --- /dev/null +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt @@ -0,0 +1,40 @@ +package com.tangem.crypto + +import com.tangem.crypto.models.Token + +/** + * Provider for user tokens data + */ +interface UserWalletManager { + + /** + * Returns all user tokens (merged from local and backend) + */ + fun getUserTokens(): List + + /** + * Returns user walletId + */ + fun getWalletId(): String + + /** + * Checks that token added to user wallet + * + * @param token to receive referral payments + */ + fun isTokenAdded(token: Token): Boolean + + /** + * Adds token to wallet if its not + * + * @param token to add to wallet + */ + fun addToken(token: Token) + + /** + * Returns wallet public address for token + * + * @param token for which find address + */ + fun getWalletAddress(token: Token): String +} \ No newline at end of file diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/models/Token.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/models/Token.kt new file mode 100644 index 0000000000..86c314a573 --- /dev/null +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/models/Token.kt @@ -0,0 +1,10 @@ +package com.tangem.crypto.models + +data class Token( + val id: String, + val name: String, + val symbol: String, + val networkId: String?, + val contractAddress: String?, + val decimalCount: Int?, +) \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 5387734770..e6a3474eac 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,6 +9,10 @@ include(":core:utils") include(":core:ui") // endregion Core modules +// region Libs modules +include(":libs:crypto") +// endregion Libs modules + // region Feature modules include(":features:referral:data") include(":features:referral:domain")