Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-05 17:52:37 +03:00
parent d68ad52a45
commit 13b1bbc486
10 changed files with 154 additions and 23 deletions

View file

@ -2,11 +2,20 @@ package com.tangem.datasource.api.gasless
import com.tangem.datasource.api.common.response.ApiResponse
import com.tangem.datasource.api.gasless.models.GaslessServiceResponse
import com.tangem.datasource.api.gasless.models.GaslessSignedTransactionResult
import com.tangem.datasource.api.gasless.models.GaslessSupportedTokens
import com.tangem.datasource.api.gasless.models.GaslessTransactionRequest
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
interface GaslessTxServiceApi {
@GET("api/v1/tokens")
suspend fun getSupportedTokens(): ApiResponse<GaslessServiceResponse<GaslessSupportedTokens>>
@POST("api/v1/sign")
suspend fun signGaslessTransaction(
@Body transaction: GaslessTransactionRequest,
): ApiResponse<GaslessServiceResponse<GaslessSignedTransactionResult>>
}

View file

@ -0,0 +1,23 @@
package com.tangem.datasource.api.gasless.models
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
/**
* Result of gasless transaction signing.
* Contains the signed transaction data and gas parameters.
*/
@JsonClass(generateAdapter = true)
data class GaslessSignedTransactionResult(
@Json(name = "signedTransaction")
val signedTransaction: String,
@Json(name = "gasLimit")
val gasLimit: String,
@Json(name = "maxFeePerGas")
val maxFeePerGas: String,
@Json(name = "maxPriorityFeePerGas")
val maxPriorityFeePerGas: String,
)

View file

@ -0,0 +1,93 @@
package com.tangem.datasource.api.gasless.models
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
/**
* Request body for gasless transaction submission.
* Represents complete transaction with fee delegation metadata.
*/
@JsonClass(generateAdapter = true)
data class GaslessTransactionRequest(
@Json(name = "gaslessTransaction")
val gaslessTransaction: GaslessTransactionData,
@Json(name = "signature")
val signature: String,
@Json(name = "userAddress")
val userAddress: String,
@Json(name = "chainId")
val chainId: Int,
@Json(name = "eip7702auth")
val eip7702Auth: Eip7702Authorization? = null,
)
@JsonClass(generateAdapter = true)
data class GaslessTransactionData(
@Json(name = "transaction")
val transaction: TransactionData,
@Json(name = "fee")
val fee: FeeData,
@Json(name = "nonce")
val nonce: String,
)
@JsonClass(generateAdapter = true)
data class TransactionData(
@Json(name = "to")
val to: String,
@Json(name = "value")
val value: String,
@Json(name = "data")
val data: String,
)
@JsonClass(generateAdapter = true)
data class FeeData(
@Json(name = "feeToken")
val feeToken: String,
@Json(name = "maxTokenFee")
val maxTokenFee: String,
@Json(name = "coinPriceInToken")
val coinPriceInToken: String,
@Json(name = "feeTransferGasLimit")
val feeTransferGasLimit: String,
@Json(name = "baseGas")
val baseGas: String,
)
/**
* EIP-7702 authorization for account abstraction.
* Optional field, used only when EOA delegation is required.
*/
@JsonClass(generateAdapter = true)
data class Eip7702Authorization(
@Json(name = "chainId")
val chainId: Int,
@Json(name = "address")
val address: String,
@Json(name = "nonce")
val nonce: String,
@Json(name = "yParity")
val yParity: Int,
@Json(name = "r")
val r: String,
@Json(name = "s")
val s: String,
)