Skip to content

Commit

Permalink
listunspent only in case of balances is provided
Browse files Browse the repository at this point in the history
  • Loading branch information
a10zn8 committed Sep 25, 2024
1 parent 2b141f7 commit 30aeb2f
Show file tree
Hide file tree
Showing 8 changed files with 21 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class BitcoinUpstreamCreator(
MergedHead(listOf(rpcHead, zeroMqHead), MostWorkForkChoice(), headScheduler)
} ?: rpcHead

val methods = buildMethods(config, chain)
val methods = buildMethods(config, chain, options)
val upstream = BitcoinRpcUpstream(
config.id
?: "bitcoin-${seq.getAndIncrement()}",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ open class GenericUpstreamCreator(
if (it.connectorMode == GenericConnectorFactory.ConnectorMode.RPC_REQUESTS_WITH_MIXED_HEAD.name) it.rpc?.url ?: it.ws?.url else it.ws?.url ?: it.rpc?.url
}
val hash = getHash(nodeId, hashUrl!!, hashes)
val buildMethodsFun = { a: UpstreamsConfig.Upstream<*>, b: Chain -> this.buildMethods(a, b) }
val buildMethodsFun = { a: UpstreamsConfig.Upstream<*>, b: Chain -> this.buildMethods(a, b, options) }

val upstream = GenericUpstream(
config,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import io.emeraldpay.dshackle.config.ChainsConfig
import io.emeraldpay.dshackle.config.IndexConfig
import io.emeraldpay.dshackle.config.UpstreamsConfig
import io.emeraldpay.dshackle.foundation.ChainOptions
import io.emeraldpay.dshackle.foundation.ChainOptions.Options
import io.emeraldpay.dshackle.upstream.CallTargetsHolder
import io.emeraldpay.dshackle.upstream.calls.CallMethods
import io.emeraldpay.dshackle.upstream.calls.ManagedCallMethods
Expand Down Expand Up @@ -70,7 +71,7 @@ abstract class UpstreamCreator(
chainConf: ChainsConfig.ChainConfig,
): UpstreamCreationData

protected fun buildMethods(config: UpstreamsConfig.Upstream<*>, chain: Chain): CallMethods {
protected fun buildMethods(config: UpstreamsConfig.Upstream<*>, chain: Chain, options: Options): CallMethods {
return if (config.methods != null || config.methodGroups != null) {
if (config.methodGroups == null) {
config.methodGroups = UpstreamsConfig.MethodGroups(setOf("filter"), setOf())
Expand All @@ -82,7 +83,7 @@ abstract class UpstreamCreator(
}

ManagedCallMethods(
delegate = callTargets.getDefaultMethods(chain, indexConfig.isChainEnabled(chain)),
delegate = callTargets.getDefaultMethods(chain, indexConfig.isChainEnabled(chain), options),
enabled = config.methods?.enabled?.map { it.name }?.toSet() ?: emptySet(),
disabled = config.methods?.disabled?.map { it.name }?.toSet() ?: emptySet(),
groupsEnabled = config.methodGroups?.enabled ?: emptySet(),
Expand All @@ -98,7 +99,7 @@ abstract class UpstreamCreator(
}
}
} else {
callTargets.getDefaultMethods(chain, indexConfig.isChainEnabled(chain))
callTargets.getDefaultMethods(chain, indexConfig.isChainEnabled(chain), options)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import io.emeraldpay.dshackle.BlockchainType.SOLANA
import io.emeraldpay.dshackle.BlockchainType.STARKNET
import io.emeraldpay.dshackle.BlockchainType.UNKNOWN
import io.emeraldpay.dshackle.Chain
import io.emeraldpay.dshackle.foundation.ChainOptions
import io.emeraldpay.dshackle.upstream.calls.CallMethods
import io.emeraldpay.dshackle.upstream.calls.DefaultBeaconChainMethods
import io.emeraldpay.dshackle.upstream.calls.DefaultBitcoinMethods
Expand All @@ -23,13 +24,13 @@ import org.springframework.stereotype.Component
class CallTargetsHolder {
private val callTargets = HashMap<Chain, CallMethods>()

fun getDefaultMethods(chain: Chain, hasLogsOracle: Boolean): CallMethods {
return callTargets[chain] ?: return setupDefaultMethods(chain, hasLogsOracle)
fun getDefaultMethods(chain: Chain, hasLogsOracle: Boolean, options: ChainOptions.Options): CallMethods {
return callTargets[chain] ?: return setupDefaultMethods(chain, hasLogsOracle, options)
}

private fun setupDefaultMethods(chain: Chain, hasLogsOracle: Boolean): CallMethods {
private fun setupDefaultMethods(chain: Chain, hasLogsOracle: Boolean, options: ChainOptions.Options): CallMethods {
val created = when (chain.type) {
BITCOIN -> DefaultBitcoinMethods()
BITCOIN -> DefaultBitcoinMethods(options.providesBalance == true)
ETHEREUM -> DefaultEthereumMethods(chain, hasLogsOracle)
STARKNET -> DefaultStarknetMethods(chain)
POLKADOT -> DefaultPolkadotMethods(chain)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ open class BitcoinMultistream(
private var reader = BitcoinReader(this, head, esplora)
private var addressActiveCheck: AddressActiveCheck? = null
private var xpubAddresses: XpubAddresses? = null
private var callRouter: LocalCallRouter = LocalCallRouter(DefaultBitcoinMethods(), reader)
private var callRouter: LocalCallRouter = LocalCallRouter(DefaultBitcoinMethods(sourceUpstreams.any { it.getOptions().providesBalance == true }), reader)
override fun getUpstreams(): MutableList<out Upstream> {
return sourceUpstreams
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,5 @@ abstract class BitcoinUpstream(
options: ChainOptions.Options,
role: UpstreamsConfig.UpstreamRole,
chainConfig: ChainsConfig.ChainConfig,
) : this(id, chain, options, role, DefaultBitcoinMethods(), QuorumForLabels.QuorumItem.empty(), null, chainConfig)
) : this(id, chain, options, role, DefaultBitcoinMethods(options.providesBalance == true), QuorumForLabels.QuorumItem.empty(), null, chainConfig)
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@
package io.emeraldpay.dshackle.upstream.calls

import io.emeraldpay.dshackle.Global
import io.emeraldpay.dshackle.foundation.ChainOptions
import io.emeraldpay.dshackle.quorum.AlwaysQuorum
import io.emeraldpay.dshackle.quorum.BroadcastQuorum
import io.emeraldpay.dshackle.quorum.CallQuorum
import io.emeraldpay.dshackle.quorum.NotNullQuorum
import io.emeraldpay.dshackle.upstream.ethereum.rpc.RpcException
import java.util.Collections

class DefaultBitcoinMethods : CallMethods {
class DefaultBitcoinMethods(balances: Boolean) : CallMethods {

private val networkinfo = Global.objectMapper.writeValueAsBytes(
mapOf(
Expand All @@ -49,7 +50,6 @@ class DefaultBitcoinMethods : CallMethods {
"getbestblockhash",
"getblocknumber",
"getblockcount",
"listunspent",
"getreceivedbyaddress",
"getblockchaininfo",
).sorted()
Expand All @@ -63,8 +63,12 @@ class DefaultBitcoinMethods : CallMethods {
"sendrawtransaction",
).sorted()

private val withBalances = listOf(
"listunspent",
)

private val allowedMethods =
(freshMethods + anyResponseMethods + headVerifiedMethods + broadcastMethods).sorted()
(freshMethods + anyResponseMethods + headVerifiedMethods + broadcastMethods + if (balances) withBalances else listOf()).sorted()

override fun createQuorumFor(method: String): CallQuorum {
return when {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class GenericUpstreamMock extends GenericUpstream {
static CallMethods allMethods() {
new AggregatedCallMethods([
new DefaultEthereumMethods(Chain.ETHEREUM__MAINNET, false),
new DefaultBitcoinMethods(),
new DefaultBitcoinMethods(true),
new DirectCallMethods(["eth_test"])
])
}
Expand Down

0 comments on commit 30aeb2f

Please sign in to comment.