support arbitrum nove, polygon zkevm, zksync

This commit is contained in:
a10zn8
2023-06-22 14:34:52 +03:00
parent 3c71700ca1
commit 49ec476c7a
10 changed files with 161 additions and 16 deletions

View File

@@ -15,7 +15,12 @@ enum class BlockchainType {
chain == Chain.ETHEREUM || chain == Chain.ETHEREUM ||
chain == Chain.TESTNET_SEPOLIA || chain == Chain.TESTNET_SEPOLIA ||
chain == Chain.TESTNET_ARBITRUM || chain == Chain.TESTNET_ARBITRUM ||
chain == Chain.TESTNET_OPTIMISM chain == Chain.TESTNET_OPTIMISM ||
chain == Chain.ARBITRUM_NOVA ||
chain == Chain.POLYGON_ZKEVM ||
chain == Chain.TESTNET_POLYGON_ZKEVM ||
chain == Chain.ZKSYNC ||
chain == Chain.TESTNET_ZKSYNC
) { ) {
return EVM_POS return EVM_POS
} }

View File

@@ -35,7 +35,20 @@ enum class Chain(val id: Int, val chainCode: String, val chainName: String) {
"Arbitrum" "Arbitrum"
), ),
OPTIMISM(1005, "OPTIMISM", "Optimism"), OPTIMISM(1005, "OPTIMISM", "Optimism"),
BSC(1006, "BSC", "Binance Smart Chain"), // Testnets BSC(1006, "BSC", "Binance Smart Chain"),
POLYGON_ZKEVM(
1007,
"POLYGON_ZKEVM",
"Polygon ZK-EVM"
),
ARBITRUM_NOVA(
1008,
"ARBITRUM_NOVA",
"Arbitrum Nova"
),
ZKSYNC(1009, "ZKSYNC", "ZkSync Era"),
// Testnets
TESTNET_MORDEN(10001, "MORDEN", "Morden Testnet"), TESTNET_MORDEN(10001, "MORDEN", "Morden Testnet"),
TESTNET_KOVAN(10002, "KOVAN", "Kovan Testnet"), TESTNET_KOVAN(10002, "KOVAN", "Kovan Testnet"),
TESTNET_BITCOIN( TESTNET_BITCOIN(
@@ -56,7 +69,17 @@ enum class Chain(val id: Int, val chainCode: String, val chainName: String) {
"ARBITRUM_TESTNET", "ARBITRUM_TESTNET",
"Arbitrum Testnet" "Arbitrum Testnet"
), ),
TESTNET_OPTIMISM(10010, "OPTIMISM_TESTNET", "Optimism Testnet"); TESTNET_OPTIMISM(10010, "OPTIMISM_TESTNET", "Optimism Testnet"),
TESTNET_POLYGON_ZKEVM(
10011,
"POLYGON_ZKEVM_TESTNET",
"Polygon ZK-EVM Testnet"
),
TESTNET_ZKSYNC(
10012,
"ZKS_TESTNET",
"ZkSync Testnet"
);
companion object { companion object {
fun byId(id: Int): Chain { fun byId(id: Int): Chain {

View File

@@ -71,6 +71,11 @@ class Global {
"sepolia-testnet" to Chain.TESTNET_SEPOLIA, "sepolia-testnet" to Chain.TESTNET_SEPOLIA,
"optimism-testnet" to Chain.TESTNET_OPTIMISM, "optimism-testnet" to Chain.TESTNET_OPTIMISM,
"arbitrum-testnet" to Chain.TESTNET_ARBITRUM, "arbitrum-testnet" to Chain.TESTNET_ARBITRUM,
"arbitrum-nova" to Chain.ARBITRUM_NOVA,
"polygon-zkevm" to Chain.POLYGON_ZKEVM,
"polygon-zkevm-testnet" to Chain.TESTNET_POLYGON_ZKEVM,
"zksync" to Chain.ZKSYNC,
"zksync-testnet" to Chain.TESTNET_ZKSYNC,
) )
fun chainById(id: String?): Chain { fun chainById(id: String?): Chain {

View File

@@ -14,7 +14,8 @@ class ChainsConfigReader(
override fun read(input: MappingNode?): ChainsConfig { override fun read(input: MappingNode?): ChainsConfig {
val default = readInternal(defaultConfig) val default = readInternal(defaultConfig)
val current = readInternal(input) val current = readInternal(input)
return default.patch(current) val res = default.patch(current)
return res
} }
fun readInternal(input: InputStream): ChainsConfig { fun readInternal(input: InputStream): ChainsConfig {

View File

@@ -90,7 +90,6 @@ open class UpstreamsConfig {
fun getDefaults(): PartialOptions { fun getDefaults(): PartialOptions {
val options = PartialOptions() val options = PartialOptions()
options.minPeers = 1 options.minPeers = 1
options.disableValidation = false
return options return options
} }
} }

View File

@@ -230,7 +230,8 @@ open class ConfiguredUpstreams(
config.id!!, config.id!!,
hash, hash,
chain, chain,
options, config.role, options,
config.role,
methods, methods,
QuorumForLabels.QuorumItem(1, config.labels), QuorumForLabels.QuorumItem(1, config.labels),
connectorFactory, connectorFactory,

View File

@@ -263,12 +263,12 @@ abstract class Multistream(
} }
override fun start() { override fun start() {
val repeated = Flux.interval(Duration.ofSeconds(30)) val repeated = Flux.interval(Duration.ofSeconds(3))
val whenChanged = observeStatus() val whenChanged = observeStatus()
.distinctUntilChanged() .distinctUntilChanged()
subscription = Flux.merge(repeated, whenChanged) subscription = Flux.merge(repeated, whenChanged)
// print status _change_ every 15 seconds, at most; otherwise prints it on interval of 30 seconds // print status _change_ every 15 seconds, at most; otherwise prints it on interval of 30 seconds
.sample(Duration.ofSeconds(15)) .sample(Duration.ofSeconds(3))
.subscribe { printStatus() } .subscribe { printStatus() }
observeUpstreamsStatuses() observeUpstreamsStatuses()

View File

@@ -172,7 +172,7 @@ class DefaultEthereumMethods(
private fun getChainSpecificMethods(chain: Chain): List<String> { private fun getChainSpecificMethods(chain: Chain): List<String> {
return when (chain) { return when (chain) {
Chain.OPTIMISM -> listOf( Chain.OPTIMISM, Chain.TESTNET_OPTIMISM -> listOf(
"rollup_gasPrices" "rollup_gasPrices"
) )
Chain.POLYGON -> listOf( Chain.POLYGON -> listOf(
@@ -183,6 +183,37 @@ class DefaultEthereumMethods(
"bor_getSignersAtHash", "bor_getSignersAtHash",
"eth_getRootHash" "eth_getRootHash"
) )
Chain.POLYGON_ZKEVM, Chain.TESTNET_POLYGON_ZKEVM -> listOf(
"zkevm_consolidatedBlockNumber",
"zkevm_isBlockConsolidated",
"zkevm_isBlockVirtualized",
"zkevm_batchNumberByBlockNumber",
"zkevm_batchNumber",
"zkevm_virtualBatchNumber",
"zkevm_verifiedBatchNumber",
"zkevm_getBatchByNumber",
"zkevm_getBroadcastURI"
)
Chain.ZKSYNC, Chain.TESTNET_ZKSYNC -> listOf(
"zks_estimateFee",
"zks_estimateGasL1ToL2",
"zks_getAllAccountBalances",
"zks_getBlockDetails",
"zks_getBridgeContracts",
"zks_getBytecodeByHash",
"zks_getConfirmedTokens",
"zks_getL1BatchBlockRange",
"zks_getL1BatchDetails",
"zks_getL2ToL1LogProof",
"zks_getL2ToL1MsgProof",
"zks_getMainContract",
"zks_getRawBlockTransactions",
"zks_getTestnetPaymaster",
"zks_getTokenPrice",
"zks_getTransactionDetails",
"zks_L1BatchNumber",
"zks_L1ChainId"
)
else -> emptyList() else -> emptyList()
} }
} }
@@ -260,6 +291,26 @@ class DefaultEthereumMethods(
"\"420\"" "\"420\""
} }
Chain.ARBITRUM_NOVA == chain -> {
"\"42170\""
}
Chain.POLYGON_ZKEVM == chain -> {
"\"1101\""
}
Chain.TESTNET_POLYGON_ZKEVM == chain -> {
"\"1442\""
}
Chain.ZKSYNC == chain -> {
"\"324\""
}
Chain.TESTNET_ZKSYNC == chain -> {
"\"280\""
}
else -> throw RpcException(-32602, "Invalid chain") else -> throw RpcException(-32602, "Invalid chain")
} }
} }
@@ -318,6 +369,26 @@ class DefaultEthereumMethods(
"\"0x1A4\"" "\"0x1A4\""
} }
Chain.ARBITRUM_NOVA == chain -> {
"\"0xa4ba\""
}
Chain.POLYGON_ZKEVM == chain -> {
"\"0x44d\""
}
Chain.TESTNET_POLYGON_ZKEVM == chain -> {
"\"0x5a2\""
}
Chain.ZKSYNC == chain -> {
"\"0x144\""
}
Chain.TESTNET_ZKSYNC == chain -> {
"\"0x118\""
}
else -> throw RpcException(-32602, "Invalid chain") else -> throw RpcException(-32602, "Invalid chain")
} }
} }

View File

@@ -65,14 +65,24 @@ open class EthereumMultistream(
private val reader: EthereumCachingReader = EthereumCachingReader(this, this.caches, getMethodsFactory(), tracer) private val reader: EthereumCachingReader = EthereumCachingReader(this, this.caches, getMethodsFactory(), tracer)
private var subscribe = EthereumEgressSubscription(this, headScheduler, NoPendingTxes()) private var subscribe = EthereumEgressSubscription(this, headScheduler, NoPendingTxes())
private val supportsEIP1559 = when (chain) { private val supportsEIP1559set = setOf(
Chain.ETHEREUM, Chain.TESTNET_ROPSTEN, Chain.ETHEREUM, Chain.TESTNET_ROPSTEN,
Chain.TESTNET_GOERLI, Chain.TESTNET_RINKEBY, Chain.TESTNET_GOERLI,
Chain.TESTNET_SEPOLIA, Chain.ARBITRUM, Chain.TESTNET_RINKEBY,
Chain.OPTIMISM, Chain.TESTNET_ARBITRUM, Chain.TESTNET_SEPOLIA,
Chain.TESTNET_OPTIMISM -> true Chain.ARBITRUM,
else -> false Chain.OPTIMISM,
} Chain.TESTNET_ARBITRUM,
Chain.TESTNET_OPTIMISM,
Chain.POLYGON_ZKEVM,
Chain.TESTNET_POLYGON_ZKEVM,
Chain.ZKSYNC,
Chain.TESTNET_ZKSYNC,
Chain.ARBITRUM_NOVA
)
private val supportsEIP1559 = supportsEIP1559set.contains(chain)
private val feeEstimation = if (supportsEIP1559) EthereumPriorityFees(this, reader, 256) private val feeEstimation = if (supportsEIP1559) EthereumPriorityFees(this, reader, 256)
else EthereumLegacyFees(this, reader, 256) else EthereumLegacyFees(this, reader, 256)

View File

@@ -38,3 +38,33 @@ chain-settings:
lags: lags:
syncing: 20 syncing: 20
lagging: 10 lagging: 10
- id: arbitrum-nova
options:
disable-validation: true
lags:
syncing: 20
lagging: 10
- id: polygon-zkevm
options:
disable-validation: true
lags:
syncing: 20
lagging: 10
- id: polygon-zkevm-testnet
options:
disable-validation: true
lags:
syncing: 20
lagging: 10
- id: zksync
options:
disable-validation: true
lags:
syncing: 20
lagging: 10
- id: zksync-testnet
options:
disable-validation: true
lags:
syncing: 20
lagging: 10