Skip to content

Commit

Permalink
Divide solan rpc client
Browse files Browse the repository at this point in the history
  • Loading branch information
furenster committed Feb 17, 2025
1 parent 803eaa0 commit 828d57e
Show file tree
Hide file tree
Showing 11 changed files with 105 additions and 76 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.gemwallet.android.blockchain.clients.solana

import com.gemwallet.android.blockchain.clients.BroadcastClient
import com.gemwallet.android.blockchain.clients.solana.services.SolanaBroadcastService
import com.gemwallet.android.blockchain.rpc.ServiceError
import com.gemwallet.android.blockchain.rpc.model.JSONRpcRequest
import com.wallet.core.primitives.Account
Expand All @@ -10,7 +11,7 @@ import java.nio.charset.StandardCharsets

class SolanaBroadcastClient(
private val chain: Chain,
private val rpcClient: SolanaRpcClient,
private val rpcClient: SolanaBroadcastService,
) : BroadcastClient {
override suspend fun send(account: Account, signedMessage: ByteArray, type: TransactionType): String {
val encodedMessage = signedMessage.toString(StandardCharsets.UTF_8)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.gemwallet.android.blockchain.clients.solana

import com.gemwallet.android.blockchain.clients.NodeStatusClient
import com.gemwallet.android.blockchain.clients.solana.services.SolanaNodeStatusService
import com.gemwallet.android.blockchain.clients.solana.services.genesisHash
import com.gemwallet.android.blockchain.clients.solana.services.health
import com.gemwallet.android.blockchain.clients.solana.services.slot
import com.gemwallet.android.blockchain.rpc.getLatency
import com.gemwallet.android.model.NodeStatus
import com.wallet.core.primitives.Chain
Expand All @@ -10,7 +14,7 @@ import kotlinx.coroutines.withContext

class SolanaNodeStatusClient(
private val chain: Chain,
private val rpcClient: SolanaRpcClient,
private val rpcClient: SolanaNodeStatusService,
) : NodeStatusClient {

override suspend fun getNodeStatus(chain: Chain, url: String): NodeStatus? = withContext(Dispatchers.IO) {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.gemwallet.android.blockchain.clients.solana

import com.gemwallet.android.blockchain.clients.GetTokenClient
import com.gemwallet.android.blockchain.clients.solana.services.SolanaRpcClient
import com.gemwallet.android.blockchain.rpc.model.JSONRpcRequest
import com.wallet.core.primitives.Asset
import com.wallet.core.primitives.AssetId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package com.gemwallet.android.blockchain.clients.solana

import com.gemwallet.android.blockchain.clients.TransactionStateRequest
import com.gemwallet.android.blockchain.clients.TransactionStatusClient
import com.gemwallet.android.blockchain.rpc.model.JSONRpcRequest
import com.gemwallet.android.blockchain.clients.solana.services.SolanaRpcClient
import com.gemwallet.android.blockchain.clients.solana.services.transaction
import com.gemwallet.android.model.TransactionChages
import com.wallet.core.primitives.Chain
import com.wallet.core.primitives.TransactionState
Expand All @@ -13,17 +14,8 @@ class SolanaTransactionStatusClient(
) : TransactionStatusClient {

override suspend fun getStatus(request: TransactionStateRequest): Result<TransactionChages> {
val request = JSONRpcRequest(
SolanaMethod.GetTransaction.value,
listOf(
request.hash,
mapOf(
"encoding" to "jsonParsed",
"maxSupportedTransactionVersion" to 0,
),
)
)
return rpcClient.transaction(request).mapCatching {

return rpcClient.transaction(request.hash).mapCatching {
if (it.error != null) return@mapCatching TransactionChages(TransactionState.Failed)
val state = if (it.result.slot > 0) {
if (it.result.meta.err != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.gemwallet.android.blockchain.clients.solana.services

import com.gemwallet.android.blockchain.clients.solana.SolanaMethod
import com.gemwallet.android.blockchain.clients.solana.models.SolanaArrayData
import com.gemwallet.android.blockchain.clients.solana.models.SolanaInfo
import com.gemwallet.android.blockchain.clients.solana.models.SolanaParsedData
import com.gemwallet.android.blockchain.clients.solana.models.SolanaParsedSplTokenInfo
import com.gemwallet.android.blockchain.rpc.model.JSONRpcRequest
import com.gemwallet.android.blockchain.rpc.model.JSONRpcResponse
import com.wallet.core.blockchain.solana.models.SolanaBalanceValue
Expand All @@ -18,6 +22,12 @@ interface SolanaAccountsService {

@POST("/")
suspend fun batchBalances(@Body request: List<JSONRpcRequest<List<Any>>>): Result<List<JSONRpcResponse<SolanaValue<SolanaBalanceValue>>>>

@POST("/")
suspend fun getAccountInfoSpl(@Body request: JSONRpcRequest<List<Any>>): Result<JSONRpcResponse<SolanaValue<SolanaParsedData<SolanaInfo<SolanaParsedSplTokenInfo>>>>>

@POST("/")
suspend fun getAccountInfoMpl(@Body request: JSONRpcRequest<List<Any>>): Result<JSONRpcResponse<SolanaValue<SolanaArrayData<String>>>>
}

suspend fun SolanaAccountsService.getTokenAccountByOwner(owner: String, tokenId: String): String? {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.gemwallet.android.blockchain.clients.solana.services

import com.gemwallet.android.blockchain.rpc.model.JSONRpcRequest
import com.gemwallet.android.blockchain.rpc.model.JSONRpcResponse
import retrofit2.http.Body
import retrofit2.http.POST

interface SolanaBroadcastService {
@POST("/")
suspend fun broadcast(@Body request: JSONRpcRequest<List<Any>>): Result<JSONRpcResponse<String>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.gemwallet.android.blockchain.clients.solana.services

import com.gemwallet.android.blockchain.clients.solana.SolanaMethod
import com.gemwallet.android.blockchain.rpc.model.JSONRpcRequest
import com.gemwallet.android.blockchain.rpc.model.JSONRpcResponse
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.POST
import retrofit2.http.Url

interface SolanaNodeStatusService {

@POST
suspend fun health(@Url url: String,@Body request: JSONRpcRequest<List<String>>): Response<JSONRpcResponse<String>>

@POST
suspend fun slot(@Url url: String, @Body request: JSONRpcRequest<List<String>>): Result<JSONRpcResponse<Int>>

@POST
suspend fun genesisHash(@Url url: String, @Body request: JSONRpcRequest<List<String>>): Result<JSONRpcResponse<String>>
}

suspend fun SolanaNodeStatusService.health(url: String): Response<JSONRpcResponse<String>> {
return health(url, JSONRpcRequest.create(SolanaMethod.GetHealth, emptyList()))
}

suspend fun SolanaNodeStatusService.slot(url: String): Result<JSONRpcResponse<Int>> {
return slot(url, JSONRpcRequest.create(SolanaMethod.GetSlot, emptyList()))
}

suspend fun SolanaNodeStatusService.genesisHash(url: String): Result<JSONRpcResponse<String>> {
return genesisHash(url, JSONRpcRequest.create(SolanaMethod.GetGenesisHash, emptyList()))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.gemwallet.android.blockchain.clients.solana.services

interface SolanaRpcClient :
SolanaAccountsService,
SolanaBalancesService,
SolanaStakeService,
SolanaFeeService,
SolanaNetworkInfoService,
SolanaBroadcastService,
SolanaTransactionsService,
SolanaNodeStatusService
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.gemwallet.android.blockchain.clients.solana.services

import com.gemwallet.android.blockchain.clients.solana.SolanaMethod
import com.gemwallet.android.blockchain.rpc.model.JSONRpcRequest
import com.gemwallet.android.blockchain.rpc.model.JSONRpcResponse
import com.wallet.core.blockchain.solana.models.SolanaTransaction
import retrofit2.http.Body
import retrofit2.http.POST

interface SolanaTransactionsService {
@POST("/")
suspend fun transaction(@Body request: JSONRpcRequest<List<Any>>): Result<JSONRpcResponse<SolanaTransaction>>
}

suspend fun SolanaTransactionsService.transaction(hash: String): Result<JSONRpcResponse<SolanaTransaction>> {
val request = JSONRpcRequest.create(
SolanaMethod.GetTransaction,
listOf(
hash,
mapOf(
"encoding" to "jsonParsed",
"maxSupportedTransactionVersion" to 0,
),
)
)
return transaction(request)
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.gemwallet.android.blockchain.clients.cosmos.services.CosmosRpcClient
import com.gemwallet.android.blockchain.clients.ethereum.services.EvmRpcClient
import com.gemwallet.android.blockchain.clients.near.NearRpcClient
import com.gemwallet.android.blockchain.clients.polkadot.services.PolkadotServices
import com.gemwallet.android.blockchain.clients.solana.SolanaRpcClient
import com.gemwallet.android.blockchain.clients.solana.services.SolanaRpcClient
import com.gemwallet.android.blockchain.clients.stellar.services.StellarService
import com.gemwallet.android.blockchain.clients.sui.SuiRpcClient
import com.gemwallet.android.blockchain.clients.ton.TonRpcClient
Expand Down

0 comments on commit 828d57e

Please sign in to comment.