diff --git a/CHANGELOG.md b/CHANGELOG.md
index 96e1511eea..5ce29955d1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,8 @@
# Changelog
## [Unreleased]
+- Add configuration of Consolidation Request Contract Address via genesis configuration [#7647](https://github.com/hyperledger/besu/pull/7647)
+
### Upcoming Breaking Changes
- k8s (KUBERNETES) Nat method is now deprecated and will be removed in a future release
diff --git a/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java b/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java
index d6323ee9bf..07ddd0d7ea 100644
--- a/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java
+++ b/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java
@@ -539,4 +539,11 @@ public interface GenesisConfigOptions {
* @return the deposit address
*/
Optional
getDepositContractAddress();
+
+ /**
+ * The consolidation request contract address
+ *
+ * @return the consolidation request contract address
+ */
+ Optional getConsolidationRequestContractAddress();
}
diff --git a/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java b/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java
index 67114b29bf..83b1f48fb4 100644
--- a/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java
+++ b/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java
@@ -52,6 +52,8 @@ public class JsonGenesisConfigOptions implements GenesisConfigOptions {
private static final String WITHDRAWAL_REQUEST_CONTRACT_ADDRESS_KEY =
"withdrawalrequestcontractaddress";
private static final String DEPOSIT_CONTRACT_ADDRESS_KEY = "depositcontractaddress";
+ private static final String CONSOLIDATION_REQUEST_CONTRACT_ADDRESS_KEY =
+ "consolidationrequestcontractaddress";
private final ObjectNode configRoot;
private final Map configOverrides = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
@@ -453,6 +455,13 @@ public class JsonGenesisConfigOptions implements GenesisConfigOptions {
return inputAddress.map(Address::fromHexString);
}
+ @Override
+ public Optional getConsolidationRequestContractAddress() {
+ Optional inputAddress =
+ JsonUtil.getString(configRoot, CONSOLIDATION_REQUEST_CONTRACT_ADDRESS_KEY);
+ return inputAddress.map(Address::fromHexString);
+ }
+
@Override
public Map asMap() {
final ImmutableMap.Builder builder = ImmutableMap.builder();
@@ -504,6 +513,8 @@ public class JsonGenesisConfigOptions implements GenesisConfigOptions {
getWithdrawalRequestContractAddress()
.ifPresent(l -> builder.put("withdrawalRequestContractAddress", l));
getDepositContractAddress().ifPresent(l -> builder.put("depositContractAddress", l));
+ getConsolidationRequestContractAddress()
+ .ifPresent(l -> builder.put("consolidationRequestContractAddress", l));
if (isClique()) {
builder.put("clique", getCliqueConfigOptions().asMap());
diff --git a/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java b/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java
index efe56a086d..ee9584fd3a 100644
--- a/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java
+++ b/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java
@@ -467,6 +467,11 @@ public class StubGenesisConfigOptions implements GenesisConfigOptions, Cloneable
return Optional.empty();
}
+ @Override
+ public Optional getConsolidationRequestContractAddress() {
+ return Optional.empty();
+ }
+
/**
* Homestead block stub genesis config options.
*
diff --git a/config/src/test/java/org/hyperledger/besu/config/GenesisConfigOptionsTest.java b/config/src/test/java/org/hyperledger/besu/config/GenesisConfigOptionsTest.java
index 219ea4fcf8..69494a9c9c 100644
--- a/config/src/test/java/org/hyperledger/besu/config/GenesisConfigOptionsTest.java
+++ b/config/src/test/java/org/hyperledger/besu/config/GenesisConfigOptionsTest.java
@@ -382,6 +382,33 @@ class GenesisConfigOptionsTest {
.containsValue(Address.ZERO);
}
+ @Test
+ void shouldGetConsolidationRequestContractAddress() {
+ final GenesisConfigOptions config =
+ fromConfigOptions(
+ singletonMap(
+ "consolidationRequestContractAddress",
+ "0x00000000219ab540356cbb839cbe05303d7705fa"));
+ assertThat(config.getConsolidationRequestContractAddress())
+ .hasValue(Address.fromHexString("0x00000000219ab540356cbb839cbe05303d7705fa"));
+ }
+
+ @Test
+ void shouldNotHaveConsolidationRequestContractAddressWhenEmpty() {
+ final GenesisConfigOptions config = fromConfigOptions(emptyMap());
+ assertThat(config.getConsolidationRequestContractAddress()).isEmpty();
+ }
+
+ @Test
+ void asMapIncludesConsolidationRequestContractAddress() {
+ final GenesisConfigOptions config =
+ fromConfigOptions(Map.of("consolidationRequestContractAddress", "0x0"));
+
+ assertThat(config.asMap())
+ .containsOnlyKeys("consolidationRequestContractAddress")
+ .containsValue(Address.ZERO);
+ }
+
private GenesisConfigOptions fromConfigOptions(final Map configOptions) {
final ObjectNode rootNode = JsonUtil.createEmptyObjectNode();
final ObjectNode options = JsonUtil.objectNodeFromMap(configOptions);
diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java
index e6d7a88cbd..b5b2f678d6 100644
--- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java
+++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java
@@ -14,10 +14,8 @@
*/
package org.hyperledger.besu.ethereum.mainnet;
-import static org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor.DEFAULT_DEPOSIT_CONTRACT_ADDRESS;
import static org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator.pragueRequestsProcessors;
import static org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator.pragueRequestsValidator;
-import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestProcessor.DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS;
import org.hyperledger.besu.config.GenesisConfigOptions;
import org.hyperledger.besu.config.PowAlgorithm;
@@ -41,6 +39,7 @@ import org.hyperledger.besu.ethereum.mainnet.blockhash.PragueBlockHashProcessor;
import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
import org.hyperledger.besu.ethereum.mainnet.parallelization.MainnetParallelBlockProcessor;
+import org.hyperledger.besu.ethereum.mainnet.requests.RequestContractAddresses;
import org.hyperledger.besu.ethereum.privacy.PrivateTransactionProcessor;
import org.hyperledger.besu.ethereum.privacy.PrivateTransactionValidator;
import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater;
@@ -767,12 +766,8 @@ public abstract class MainnetProtocolSpecs {
final boolean isParallelTxProcessingEnabled,
final MetricsSystem metricsSystem) {
- final Address withdrawalRequestContractAddress =
- genesisConfigOptions
- .getWithdrawalRequestContractAddress()
- .orElse(DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS);
- final Address depositContractAddress =
- genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS);
+ RequestContractAddresses requestContractAddresses =
+ RequestContractAddresses.fromGenesis(genesisConfigOptions);
return cancunDefinition(
chainId,
@@ -794,10 +789,9 @@ public abstract class MainnetProtocolSpecs {
.precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::prague)
// EIP-7002 Withdrawals / EIP-6610 Deposits / EIP-7685 Requests
- .requestsValidator(pragueRequestsValidator(depositContractAddress))
+ .requestsValidator(pragueRequestsValidator(requestContractAddresses))
// EIP-7002 Withdrawals / EIP-6610 Deposits / EIP-7685 Requests
- .requestProcessorCoordinator(
- pragueRequestsProcessors(withdrawalRequestContractAddress, depositContractAddress))
+ .requestProcessorCoordinator(pragueRequestsProcessors(requestContractAddresses))
// change to accept EIP-7702 transactions
.transactionValidatorFactoryBuilder(
diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestProcessor.java
index 0a48d8278c..641720670f 100644
--- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestProcessor.java
+++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestProcessor.java
@@ -22,13 +22,18 @@ import org.apache.tuweni.bytes.Bytes;
public class ConsolidationRequestProcessor
extends AbstractSystemCallRequestProcessor {
- public static final Address CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS =
+ public static final Address CONSOLIDATION_REQUEST_CONTRACT_ADDRESS =
Address.fromHexString("0x00b42dbF2194e931E80326D950320f7d9Dbeac02");
private static final int ADDRESS_BYTES = 20;
private static final int PUBLIC_KEY_BYTES = 48;
private static final int CONSOLIDATION_REQUEST_BYTES_SIZE =
ADDRESS_BYTES + PUBLIC_KEY_BYTES + PUBLIC_KEY_BYTES;
+ private final Address consolidationRequestContractAddress;
+
+ public ConsolidationRequestProcessor(final Address consolidationRequestContractAddress) {
+ this.consolidationRequestContractAddress = consolidationRequestContractAddress;
+ }
/**
* Gets the call address for consolidation requests.
@@ -37,7 +42,7 @@ public class ConsolidationRequestProcessor
*/
@Override
protected Address getCallAddress() {
- return CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS;
+ return consolidationRequestContractAddress;
}
/**
diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java
index 6e61a0343c..9c86d18f7a 100644
--- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java
+++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java
@@ -14,27 +14,34 @@
*/
package org.hyperledger.besu.ethereum.mainnet.requests;
-import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.datatypes.RequestType;
public class MainnetRequestsValidator {
public static RequestsValidatorCoordinator pragueRequestsValidator(
- final Address depositContractAddress) {
+ final RequestContractAddresses requestContractAddresses) {
return new RequestsValidatorCoordinator.Builder()
.addValidator(RequestType.WITHDRAWAL, new WithdrawalRequestValidator())
.addValidator(RequestType.CONSOLIDATION, new ConsolidationRequestValidator())
- .addValidator(RequestType.DEPOSIT, new DepositRequestValidator(depositContractAddress))
+ .addValidator(
+ RequestType.DEPOSIT,
+ new DepositRequestValidator(requestContractAddresses.getDepositContractAddress()))
.build();
}
public static RequestProcessorCoordinator pragueRequestsProcessors(
- final Address withdrawalRequestContractAddress, final Address depositContractAddress) {
+ final RequestContractAddresses requestContractAddresses) {
return new RequestProcessorCoordinator.Builder()
.addProcessor(
RequestType.WITHDRAWAL,
- new WithdrawalRequestProcessor(withdrawalRequestContractAddress))
- .addProcessor(RequestType.CONSOLIDATION, new ConsolidationRequestProcessor())
- .addProcessor(RequestType.DEPOSIT, new DepositRequestProcessor(depositContractAddress))
+ new WithdrawalRequestProcessor(
+ requestContractAddresses.getWithdrawalRequestContractAddress()))
+ .addProcessor(
+ RequestType.CONSOLIDATION,
+ new ConsolidationRequestProcessor(
+ requestContractAddresses.getConsolidationRequestContractAddress()))
+ .addProcessor(
+ RequestType.DEPOSIT,
+ new DepositRequestProcessor(requestContractAddresses.getDepositContractAddress()))
.build();
}
}
diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestContractAddresses.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestContractAddresses.java
new file mode 100644
index 0000000000..b75677dda7
--- /dev/null
+++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestContractAddresses.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright contributors to Hyperledger Besu.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package org.hyperledger.besu.ethereum.mainnet.requests;
+
+import static org.hyperledger.besu.ethereum.mainnet.requests.ConsolidationRequestProcessor.CONSOLIDATION_REQUEST_CONTRACT_ADDRESS;
+import static org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor.DEFAULT_DEPOSIT_CONTRACT_ADDRESS;
+import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestProcessor.DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS;
+
+import org.hyperledger.besu.config.GenesisConfigOptions;
+import org.hyperledger.besu.datatypes.Address;
+
+public class RequestContractAddresses {
+ private final Address withdrawalRequestContractAddress;
+ private final Address depositContractAddress;
+ private final Address consolidationRequestContractAddress;
+
+ public RequestContractAddresses(
+ final Address withdrawalRequestContractAddress,
+ final Address depositContractAddress,
+ final Address consolidationRequestContractAddress) {
+ this.withdrawalRequestContractAddress = withdrawalRequestContractAddress;
+ this.depositContractAddress = depositContractAddress;
+ this.consolidationRequestContractAddress = consolidationRequestContractAddress;
+ }
+
+ public static RequestContractAddresses fromGenesis(
+ final GenesisConfigOptions genesisConfigOptions) {
+ return new RequestContractAddresses(
+ genesisConfigOptions
+ .getWithdrawalRequestContractAddress()
+ .orElse(DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS),
+ genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS),
+ genesisConfigOptions
+ .getConsolidationRequestContractAddress()
+ .orElse(CONSOLIDATION_REQUEST_CONTRACT_ADDRESS));
+ }
+
+ public Address getWithdrawalRequestContractAddress() {
+ return withdrawalRequestContractAddress;
+ }
+
+ public Address getDepositContractAddress() {
+ return depositContractAddress;
+ }
+
+ public Address getConsolidationRequestContractAddress() {
+ return consolidationRequestContractAddress;
+ }
+}
diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueRequestsValidatorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueRequestsValidatorTest.java
index 6c325b70a8..6158ba44c3 100644
--- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueRequestsValidatorTest.java
+++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueRequestsValidatorTest.java
@@ -17,8 +17,10 @@ package org.hyperledger.besu.ethereum.mainnet;
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode.NONE;
+import static org.hyperledger.besu.ethereum.mainnet.requests.ConsolidationRequestProcessor.CONSOLIDATION_REQUEST_CONTRACT_ADDRESS;
import static org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor.DEFAULT_DEPOSIT_CONTRACT_ADDRESS;
import static org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator.pragueRequestsValidator;
+import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestProcessor.DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.lenient;
@@ -31,6 +33,7 @@ import org.hyperledger.besu.ethereum.core.BlockDataGenerator;
import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil;
import org.hyperledger.besu.ethereum.core.Request;
import org.hyperledger.besu.ethereum.core.WithdrawalRequest;
+import org.hyperledger.besu.ethereum.mainnet.requests.RequestContractAddresses;
import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator;
import org.hyperledger.besu.evm.log.LogsBloomFilter;
@@ -52,9 +55,13 @@ class PragueRequestsValidatorTest {
@Mock private ProtocolSchedule protocolSchedule;
@Mock private ProtocolSpec protocolSpec;
@Mock private WithdrawalsValidator withdrawalsValidator;
+ private final RequestContractAddresses requestContractAddresses =
+ new RequestContractAddresses(
+ DEFAULT_WITHDRAWAL_REQUEST_CONTRACT_ADDRESS,
+ DEFAULT_DEPOSIT_CONTRACT_ADDRESS,
+ CONSOLIDATION_REQUEST_CONTRACT_ADDRESS);
- RequestsValidatorCoordinator requestValidator =
- pragueRequestsValidator(DEFAULT_DEPOSIT_CONTRACT_ADDRESS);
+ RequestsValidatorCoordinator requestValidator = pragueRequestsValidator(requestContractAddresses);
@BeforeEach
public void setUp() {