Updated on 2026-08-14

This commit is contained in:
Tangem 2024-09-27 14:29:58 +05:00
parent fcd16ea486
commit 550bd29f82
30 changed files with 642 additions and 0 deletions

View file

@ -0,0 +1,66 @@
package com.tangem.datasource.api.onramp
import com.tangem.datasource.api.common.response.ApiResponse
import com.tangem.datasource.api.onramp.models.request.OnrampPairsRequest
import com.tangem.datasource.api.onramp.models.response.OnrampDataResponse
import com.tangem.datasource.api.onramp.models.response.model.OnrampPairDTO
import com.tangem.datasource.api.onramp.models.response.OnrampQuoteResponse
import com.tangem.datasource.api.onramp.models.response.OnrampStatusResponse
import com.tangem.datasource.api.onramp.models.response.model.OnrampCountryDTO
import com.tangem.datasource.api.onramp.models.response.model.OnrampCurrencyDTO
import com.tangem.datasource.api.onramp.models.response.model.PaymentMethodDTO
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query
@Suppress("LongParameterList", "LargeClass", "TooManyFunctions")
interface OnrampApi {
@GET("currencies")
suspend fun getCurrencies(): ApiResponse<List<OnrampCurrencyDTO>>
@GET("countries")
suspend fun getCountries(): ApiResponse<List<OnrampCountryDTO>>
@GET("country-by-ip")
suspend fun getCountryByIp(): ApiResponse<OnrampCountryDTO>
@GET("payment-methods")
suspend fun getPaymentMethods(): ApiResponse<List<PaymentMethodDTO>>
@POST("onramp-pairs")
suspend fun getPairs(@Body body: OnrampPairsRequest): ApiResponse<List<OnrampPairDTO>>
@GET("onramp-quote")
suspend fun getQuote(
@Query("fromCurrencyCode") fromCurrencyCode: String,
@Query("toContractAddress") toContractAddress: String,
@Query("toNetwork") toNetwork: String,
@Query("paymentMethod") paymentMethod: String,
@Query("countryCode") countryCode: String,
@Query("fromAmount") fromAmount: String,
@Query("toDecimals") toDecimals: Int,
@Query("providerId") providerId: String,
): ApiResponse<OnrampQuoteResponse>
@GET("onramp-data")
suspend fun getData(
@Query("fromCurrencyCode") fromCurrencyCode: String,
@Query("toContractAddress") toContractAddress: String,
@Query("toNetwork") toNetwork: String,
@Query("paymentMethod") paymentMethod: String,
@Query("countryCode") countryCode: String,
@Query("fromAmount") fromAmount: String,
@Query("toDecimals") toDecimals: Int,
@Query("providerId") providerId: String,
@Query("toAddress") toAddress: String,
@Query("redirectUrl") redirectUrl: String,
@Query("language") language: String?,
@Query("theme") theme: String?,
@Query("requestId") requestId: String,
): ApiResponse<OnrampDataResponse>
@GET("onramp-status")
suspend fun getStatus(@Query("txId") txId: String): ApiResponse<OnrampStatusResponse>
}

View file

@ -0,0 +1,13 @@
package com.tangem.datasource.api.onramp.models.common
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class OnrampDestinationDTO(
@Json(name = "contractAddress")
val contractAddress: String,
@Json(name = "network")
val network: String,
)

View file

@ -0,0 +1,17 @@
package com.tangem.datasource.api.onramp.models.request
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.tangem.datasource.api.onramp.models.common.OnrampDestinationDTO
@JsonClass(generateAdapter = true)
data class OnrampPairsRequest(
@Json(name = "fromCurrencyCode")
val fromCurrencyCode: String?,
@Json(name = "countryCode")
val countryCode: String,
@Json(name = "to")
val to: List<OnrampDestinationDTO>,
)

View file

@ -0,0 +1,69 @@
package com.tangem.datasource.api.onramp.models.response
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
data class OnrampDataResponseWithTxDetails(
val dataResponse: OnrampDataResponse,
val txDetails: OnrampTxDetails,
)
@JsonClass(generateAdapter = true)
data class OnrampDataResponse(
@Json(name = "txId")
val txId: String,
@Json(name = "dataJson")
val dataJson: String,
@Json(name = "signature")
val signature: String,
)
@JsonClass(generateAdapter = true)
data class OnrampTxDetails(
@Json(name = "fromCurrencyCode")
val fromCurrencyCode: String,
@Json(name = "toContractAddress")
val toContractAddress: String,
@Json(name = "toNetwork")
val toNetwork: String,
@Json(name = "paymentMethod")
val paymentMethod: String,
@Json(name = "countryCode")
val countryCode: String,
@Json(name = "fromAmount")
val fromAmount: String,
@Json(name = "toDecimals")
val toDecimals: Int,
@Json(name = "providerId")
val providerId: String,
@Json(name = "toAddress")
val toAddress: String,
@Json(name = "redirectUrl")
val redirectUrl: String,
@Json(name = "language")
val language: String?,
@Json(name = "theme")
val theme: String?,
@Json(name = "requestId")
val requestId: String,
@Json(name = "externalTxId")
val externalTxId: String,
@Json(name = "widgetUrl")
val widgetUrl: String,
)

View file

@ -0,0 +1,46 @@
package com.tangem.datasource.api.onramp.models.response
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class OnrampQuoteResponse(
@Json(name = "fromCurrencyCode")
val fromCurrencyCode: String,
@Json(name = "toContractAddress")
val toContractAddress: String,
@Json(name = "toNetwork")
val toNetwork: String,
@Json(name = "paymentMethod")
val paymentMethod: String,
@Json(name = "countryCode")
val countryCode: String,
@Json(name = "fromAmount")
val fromAmount: String,
@Json(name = "toAmount")
val toAmount: String,
@Json(name = "toDecimals")
val toDecimals: Int,
@Json(name = "providerId")
val providerId: String,
@Json(name = "minFromAmount")
val minFromAmount: String,
@Json(name = "maxFromAmount")
val maxFromAmount: String,
@Json(name = "minToAmount")
val minToAmount: String,
@Json(name = "maxToAmount")
val maxToAmount: String,
)

View file

@ -0,0 +1,61 @@
package com.tangem.datasource.api.onramp.models.response
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class OnrampStatusResponse(
@Json(name = "txId")
val txId: String,
@Json(name = "providerId")
val providerId: String,
@Json(name = "payoutAddress")
val payoutAddress: String,
// @Json(name = "status")
// val status: ???
@Json(name = "failReason")
val failReason: String?,
@Json(name = "externalTxId")
val externalTxId: String,
@Json(name = "externalTxUrl")
val externalTxUrl: String?,
@Json(name = "payoutHash")
val payoutHash: String?,
@Json(name = "createdAt")
val createdAt: String,
@Json(name = "fromCurrencyCode")
val fromCurrencyCode: String,
@Json(name = "fromAmount")
val fromAmount: String,
@Json(name = "toContractAddress")
val toContractAddress: String,
@Json(name = "toNetwork")
val toNetwork: String,
@Json(name = "toDecimals")
val toDecimals: String,
@Json(name = "toAmount")
val toAmount: String,
@Json(name = "toActualAmount")
val toActualAmount: String,
@Json(name = "paymentMethod")
val paymentMethod: String,
@Json(name = "countryCode")
val countryCode: String,
)

View file

@ -0,0 +1,28 @@
package com.tangem.datasource.api.onramp.models.response.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class OnrampCountryDTO(
@Json(name = "name")
val name: String,
@Json(name = "code")
val code: String,
@Json(name = "image")
val image: String,
@Json(name = "alpha3")
val alpha3: String,
@Json(name = "continent")
val continent: String,
@Json(name = "defaultCurrency")
val defaultCurrency: OnrampCurrencyDTO,
@Json(name = "onrampAvailable")
val onrampAvailable: Boolean,
)

View file

@ -0,0 +1,19 @@
package com.tangem.datasource.api.onramp.models.response.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class OnrampCurrencyDTO(
@Json(name = "name")
val name: String,
@Json(name = "code")
val code: String,
@Json(name = "image")
val image: String,
@Json(name = "precision")
val precision: Int,
)

View file

@ -0,0 +1,17 @@
package com.tangem.datasource.api.onramp.models.response.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.tangem.datasource.api.onramp.models.common.OnrampDestinationDTO
@JsonClass(generateAdapter = true)
data class OnrampPairDTO(
@Json(name = "fromCurrencyCode")
val fromCurrencyCode: String?,
@Json(name = "to")
val to: OnrampDestinationDTO,
@Json(name = "providers")
val providers: List<OnrampProviderDTO>,
)

View file

@ -0,0 +1,13 @@
package com.tangem.datasource.api.onramp.models.response.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class OnrampProviderDTO(
@Json(name = "providerId")
val providerId: String,
@Json(name = "paymentMethods")
val paymentMethods: List<String>,
)

View file

@ -0,0 +1,16 @@
package com.tangem.datasource.api.onramp.models.response.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class PaymentMethodDTO(
@Json(name = "id")
val id: String,
@Json(name = "name")
val name: String,
@Json(name = "image")
val image: String,
)

View file

@ -11,6 +11,7 @@ import com.tangem.datasource.api.common.config.managers.ProdApiConfigsManager
import com.tangem.datasource.api.common.response.ApiResponseCallAdapterFactory
import com.tangem.datasource.api.express.TangemExpressApi
import com.tangem.datasource.api.markets.TangemTechMarketsApi
import com.tangem.datasource.api.onramp.OnrampApi
import com.tangem.datasource.api.stakekit.StakeKitApi
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.api.tangemTech.TangemTechApiV2
@ -94,6 +95,27 @@ internal object NetworkModule {
)
}
@Provides
@Singleton
fun provideOnrampApi(
@NetworkMoshi moshi: Moshi,
@ApplicationContext context: Context,
apiConfigsManager: ApiConfigsManager,
appLogsStore: AppLogsStore,
): OnrampApi {
return createApi(
id = ApiConfig.ID.Express,
moshi = moshi,
context = context,
apiConfigsManager = apiConfigsManager,
clientBuilder = {
addInterceptor(
NetworkLogsSaveInterceptor(appLogsStore),
)
},
)
}
@Provides
@Singleton
fun provideTangemTechApi(