From 7bdeaa8f0587f3824a8c6a09e346ce1c56369129 Mon Sep 17 00:00:00 2001 From: a10zn8 Date: Tue, 21 Nov 2023 00:59:35 +0300 Subject: [PATCH] solana stable poll (#344) --- .../upstream/solana/SolanaChainSpecific.kt | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/solana/SolanaChainSpecific.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/solana/SolanaChainSpecific.kt index 2e879e69..4f5f266b 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/solana/SolanaChainSpecific.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/solana/SolanaChainSpecific.kt @@ -17,6 +17,7 @@ import io.emeraldpay.dshackle.upstream.generic.AbstractChainSpecific import io.emeraldpay.dshackle.upstream.generic.GenericEgressSubscription import io.emeraldpay.dshackle.upstream.generic.GenericIngressSubscription import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest +import org.slf4j.LoggerFactory import reactor.core.publisher.Mono import reactor.core.scheduler.Scheduler import java.math.BigInteger @@ -24,25 +25,45 @@ import java.time.Instant object SolanaChainSpecific : AbstractChainSpecific() { + private val log = LoggerFactory.getLogger(SolanaChainSpecific::class.java) + override fun getLatestBlock(api: JsonRpcReader, upstreamId: String): Mono { - return api.read(JsonRpcRequest("getLatestBlockhash", listOf())).flatMap { - val response = Global.objectMapper.readValue(it.getResult(), SolanaLatest::class.java) + return api.read(JsonRpcRequest("getSlot", listOf())).flatMap { + val slot = it.getResultAsProcessedString().toLong() api.read( JsonRpcRequest( - "getBlock", + "getBlocks", listOf( - response.context.slot, - mapOf( - "showRewards" to false, - "transactionDetails" to "none", - "maxSupportedTransactionVersion" to 0, - ), + slot - 10, + slot, ), ), - ).map { - val raw = it.getResult() - val block = Global.objectMapper.readValue(it.getResult(), SolanaBlock::class.java) - makeBlock(raw, block, upstreamId) + ).flatMap { + val response = Global.objectMapper.readValue(it.getResult(), LongArray::class.java) + if (response == null || response.isEmpty()) { + Mono.empty() + } else { + api.read( + JsonRpcRequest( + "getBlock", + listOf( + response.max(), + mapOf( + "showRewards" to false, + "transactionDetails" to "none", + "maxSupportedTransactionVersion" to 0, + ), + ), + ), + ).map { + val raw = it.getResult() + val block = Global.objectMapper.readValue(it.getResult(), SolanaBlock::class.java) + makeBlock(raw, block, upstreamId) + }.onErrorResume { + log.debug("error during getting last solana block - ${it.message}") + Mono.empty() + } + } } } } @@ -97,11 +118,6 @@ object SolanaChainSpecific : AbstractChainSpecific() { } } -@JsonIgnoreProperties(ignoreUnknown = true) -data class SolanaLatest( - @JsonProperty("context") var context: SolanaContext, -) - @JsonIgnoreProperties(ignoreUnknown = true) data class SolanaWrapper( @JsonProperty("context") var context: SolanaContext,