From b20d27c3b80795a952e175fba23e504d85354ff8 Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Wed, 4 Dec 2024 10:54:50 +0100 Subject: [PATCH 1/5] Support state overrides in `linea_estimateGas` (#113) Signed-off-by: Fabio Di Fabio --- .../acc/test/rpc/linea/EstimateGasTest.java | 43 ++++++++++++++++++- .../linea/rpc/methods/LineaEstimateGas.java | 33 +++++++++++--- 2 files changed, 68 insertions(+), 8 deletions(-) diff --git a/acceptance-tests/src/test/java/linea/plugin/acc/test/rpc/linea/EstimateGasTest.java b/acceptance-tests/src/test/java/linea/plugin/acc/test/rpc/linea/EstimateGasTest.java index f4e17cec..42eece1e 100644 --- a/acceptance-tests/src/test/java/linea/plugin/acc/test/rpc/linea/EstimateGasTest.java +++ b/acceptance-tests/src/test/java/linea/plugin/acc/test/rpc/linea/EstimateGasTest.java @@ -23,7 +23,9 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.List; +import java.util.Map; import linea.plugin.acc.test.LineaPluginTestBase; import linea.plugin.acc.test.TestCommandLineOptionsBuilder; @@ -122,6 +124,36 @@ public void passingGasPriceFieldWorks() { assertThat(respLinea.getResult()).isNotNull(); } + @Test + public void passingStateOverridesWorks() { + + final Account sender = accounts.getSecondaryBenefactor(); + + final var actualBalance = minerNode.execute(ethTransactions.getBalance(sender)); + + assertThat(actualBalance).isGreaterThan(BigInteger.ONE); + + final CallParams callParams = + new CallParams( + sender.getAddress(), + sender.getAddress(), + "1", + Bytes.EMPTY.toHexString(), + "0", + "0x1234"); + + final var zeroBalance = Map.of("balance", Wei.ZERO.toHexString()); + + final var stateOverrides = Map.of(accounts.getSecondaryBenefactor().getAddress(), zeroBalance); + + final var reqLinea = new LineaEstimateGasRequest(callParams, stateOverrides); + final var respLinea = reqLinea.execute(minerNode.nodeRequests()); + assertThat(respLinea.hasError()).isTrue(); + assertThat(respLinea.getError().getMessage()) + .isEqualTo( + "transaction up-front cost 0x208cbab601 exceeds transaction sender account balance 0x0"); + } + @Test public void lineaEstimateGasIsProfitable() { @@ -258,9 +290,16 @@ protected void assertMinGasPriceLowerBound(final Wei baseFee, final Wei estimate static class LineaEstimateGasRequest implements Transaction { private final CallParams callParams; + private final Map> stateOverrides; public LineaEstimateGasRequest(final CallParams callParams) { + this(callParams, null); + } + + public LineaEstimateGasRequest( + final CallParams callParams, final Map> stateOverrides) { this.callParams = callParams; + this.stateOverrides = stateOverrides; } @Override @@ -268,7 +307,7 @@ public LineaEstimateGasResponse execute(final NodeRequests nodeRequests) { try { return new Request<>( "linea_estimateGas", - List.of(callParams), + Arrays.asList(callParams, stateOverrides), nodeRequests.getWeb3jService(), LineaEstimateGasResponse.class) .send(); @@ -337,4 +376,6 @@ static class RawEstimateGasResponse extends org.web3j.protocol.core.Response maybeStateOverrides, + final Transaction transaction, + final long logId) { final var estimateGasTracer = new EstimateGasOperationTracer(); final var chainHeadHeader = blockchainService.getChainHeadHeader(); @@ -272,7 +279,8 @@ private Long estimateGasUsed( final var chainHeadHash = chainHeadHeader.getBlockHash(); final var maybeSimulationResults = - transactionSimulationService.simulate(transaction, chainHeadHash, zkAndGasTracer, false); + transactionSimulationService.simulate( + transaction, maybeStateOverrides, chainHeadHash, zkAndGasTracer, false); ModuleLimitsValidationResult moduleLimit = moduleLineCountValidator.validate(zkTracer.getModulesLineCount()); @@ -319,6 +327,7 @@ private Long estimateGasUsed( final var lowResult = transactionSimulationService.simulate( createTransactionForSimulation(callParameters, lowGasEstimation), + maybeStateOverrides, chainHeadHash, estimateGasTracer, true); @@ -354,6 +363,7 @@ private Long estimateGasUsed( final var binarySearchResult = transactionSimulationService.simulate( createTransactionForSimulation(callParameters, mid), + maybeStateOverrides, chainHeadHash, estimateGasTracer, true); @@ -409,7 +419,7 @@ private Long estimateGasUsed( RpcErrorType.PLUGIN_INTERNAL_ERROR, "Empty result from simulation")); } - private JsonCallParameter parseRequest(final Object[] params) { + private JsonCallParameter parseCallParameters(final Object[] params) { final JsonCallParameter callParameters; try { callParameters = parameterParser.required(params, 0, JsonCallParameter.class); @@ -417,11 +427,11 @@ private JsonCallParameter parseRequest(final Object[] params) { throw new InvalidJsonRpcParameters( "Invalid call parameters (index 0)", RpcErrorType.INVALID_CALL_PARAMS); } - validateParameters(callParameters); + validateCallParameters(callParameters); return callParameters; } - private void validateParameters(final JsonCallParameter callParameters) { + private void validateCallParameters(final JsonCallParameter callParameters) { if (callParameters.getGasPrice() != null && isBaseFeeTransaction(callParameters)) { throw new InvalidJsonRpcParameters( "gasPrice cannot be used with maxFeePerGas or maxPriorityFeePerGas or maxFeePerBlobGas"); @@ -434,6 +444,15 @@ private void validateParameters(final JsonCallParameter callParameters) { } } + protected Optional getAddressAccountOverrideMap(final Object[] params) { + try { + return parameterParser.optional(params, 1, AccountOverrideMap.class); + } catch (JsonRpcParameter.JsonRpcParameterException e) { + throw new InvalidJsonRpcRequestException( + "Invalid account overrides parameter (index 1)", RpcErrorType.INVALID_CALL_PARAMS, e); + } + } + private boolean isBaseFeeTransaction(final JsonCallParameter callParameters) { return (callParameters.getMaxFeePerGas().isPresent() || callParameters.getMaxPriorityFeePerGas().isPresent() From 84598c201a304b60e69b374393fb8eae1f1b6869 Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Mon, 9 Dec 2024 03:42:21 +0100 Subject: [PATCH 2/5] Make `linea_estimateGas` to simulate tx on pending block (#116) Signed-off-by: Fabio Di Fabio --- gradle.properties | 2 +- .../net/consensys/linea/rpc/methods/LineaEstimateGas.java | 7 +++---- .../txpoolvalidation/validators/SimulationValidator.java | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/gradle.properties b/gradle.properties index ae194b4f..1975ec14 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ releaseVersion=0.8.0-rc6.1 -besuVersion=24.11-delivery39 +besuVersion=24.12-develop-cf50479 arithmetizationVersion=0.8.0-rc6 besuArtifactGroup=io.consensys.linea-besu distributionIdentifier=linea-sequencer diff --git a/sequencer/src/main/java/net/consensys/linea/rpc/methods/LineaEstimateGas.java b/sequencer/src/main/java/net/consensys/linea/rpc/methods/LineaEstimateGas.java index 0a8f1101..f3250aa1 100644 --- a/sequencer/src/main/java/net/consensys/linea/rpc/methods/LineaEstimateGas.java +++ b/sequencer/src/main/java/net/consensys/linea/rpc/methods/LineaEstimateGas.java @@ -277,10 +277,9 @@ private Long estimateGasUsed( final var zkTracer = createZkTracer(chainHeadHeader, blockchainService.getChainId().get()); final TracerAggregator zkAndGasTracer = TracerAggregator.create(estimateGasTracer, zkTracer); - final var chainHeadHash = chainHeadHeader.getBlockHash(); final var maybeSimulationResults = transactionSimulationService.simulate( - transaction, maybeStateOverrides, chainHeadHash, zkAndGasTracer, false); + transaction, maybeStateOverrides, Optional.empty(), zkAndGasTracer, false); ModuleLimitsValidationResult moduleLimit = moduleLineCountValidator.validate(zkTracer.getModulesLineCount()); @@ -328,7 +327,7 @@ private Long estimateGasUsed( transactionSimulationService.simulate( createTransactionForSimulation(callParameters, lowGasEstimation), maybeStateOverrides, - chainHeadHash, + Optional.empty(), estimateGasTracer, true); @@ -364,7 +363,7 @@ private Long estimateGasUsed( transactionSimulationService.simulate( createTransactionForSimulation(callParameters, mid), maybeStateOverrides, - chainHeadHash, + Optional.empty(), estimateGasTracer, true); diff --git a/sequencer/src/main/java/net/consensys/linea/sequencer/txpoolvalidation/validators/SimulationValidator.java b/sequencer/src/main/java/net/consensys/linea/sequencer/txpoolvalidation/validators/SimulationValidator.java index 75204eb6..7d9638d6 100644 --- a/sequencer/src/main/java/net/consensys/linea/sequencer/txpoolvalidation/validators/SimulationValidator.java +++ b/sequencer/src/main/java/net/consensys/linea/sequencer/txpoolvalidation/validators/SimulationValidator.java @@ -89,8 +89,7 @@ public Optional validateTransaction( final var zkTracer = createZkTracer(chainHeadHeader, blockchainService.getChainId().get()); final var maybeSimulationResults = - transactionSimulationService.simulate( - transaction, chainHeadHeader.getBlockHash(), zkTracer, true); + transactionSimulationService.simulate(transaction, Optional.empty(), zkTracer, true); ModuleLimitsValidationResult moduleLimitResult = moduleLineCountValidator.validate(zkTracer.getModulesLineCount()); From eaeb684eaa987d7e6f888e4b10735b57ff62c9e2 Mon Sep 17 00:00:00 2001 From: Sally MacFarlane Date: Mon, 9 Dec 2024 14:44:46 +1000 Subject: [PATCH 3/5] update to 24.12 besu (#117) * update to 24.12 besu Signed-off-by: Sally MacFarlane --------- Signed-off-by: Sally MacFarlane --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1975ec14..04ebe504 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ releaseVersion=0.8.0-rc6.1 -besuVersion=24.12-develop-cf50479 +besuVersion=24.12-delivery40 arithmetizationVersion=0.8.0-rc6 besuArtifactGroup=io.consensys.linea-besu distributionIdentifier=linea-sequencer -distributionBaseUrl=https://artifacts.consensys.net/public/linea-besu/raw/names/linea-besu.tar.gz/versions/ \ No newline at end of file +distributionBaseUrl=https://artifacts.consensys.net/public/linea-besu/raw/names/linea-besu.tar.gz/versions/ From 4bc4233e6f02419ada87d5530007d0313b0d8554 Mon Sep 17 00:00:00 2001 From: Sally MacFarlane Date: Tue, 10 Dec 2024 19:48:59 +1000 Subject: [PATCH 4/5] add trivial change clause to contributing md (#119) Signed-off-by: Sally MacFarlane --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 252acfc8..6f65ab78 100644 --- a/README.md +++ b/README.md @@ -37,10 +37,13 @@ Linea abstracts away the complexity of this technical architecture to allow deve ## How to contribute -Contributions of any kind are welcome! +Contributions are welcome! + +### Guidelines for Non-Code and other Trivial Contributions +Please keep in mind that we do not accept non-code contributions like fixing comments, typos or some other trivial fixes. Although we appreciate the extra help, managing lots of these small contributions is unfeasible, and puts extra pressure in our continuous delivery systems (running all tests, etc). Feel free to open an issue pointing any of those errors, and we will batch them into a single change. 1. [Create an issue](https://github.com/Consensys/linea-sequencer/issues). -> If the proposed update is non-trivial, also tag us for discussion. +> If the proposed update requires input, also tag us for discussion. 2. Submit the update as a pull request from your [fork of this repo](https://github.com/Consensys/linea-sequencer/fork), and tag us for review. > Include the issue number in the pull request description and (optionally) in the branch name. From 852d34cec008208985749796e90de62fb219747b Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Tue, 10 Dec 2024 17:18:43 +0100 Subject: [PATCH 5/5] Use Besu BOM (#121) Signed-off-by: Fabio Di Fabio --- acceptance-tests/build.gradle | 17 +---- gradle.properties | 6 +- gradle/allowed-licenses.json | 14 ++++ gradle/common-dependencies.gradle | 17 ++--- gradle/dependency-management.gradle | 109 ++-------------------------- sequencer/build.gradle | 46 ++++-------- 6 files changed, 49 insertions(+), 160 deletions(-) diff --git a/acceptance-tests/build.gradle b/acceptance-tests/build.gradle index b338e9f8..e84ef399 100644 --- a/acceptance-tests/build.gradle +++ b/acceptance-tests/build.gradle @@ -52,27 +52,14 @@ tasks.register('acceptanceTests', Test) { dependencies { testImplementation project(":native:compress") - testImplementation project(":sequencer") - testImplementation "${besuArtifactGroup}:besu-datatypes" - testImplementation "${besuArtifactGroup}:evm" - testImplementation "${besuArtifactGroup}:plugin-api" + testImplementation project(":sequencer") - testImplementation "${besuArtifactGroup}.internal:algorithms" - testImplementation "${besuArtifactGroup}.internal:api" - testImplementation "${besuArtifactGroup}.internal:core" testImplementation "${besuArtifactGroup}.internal:dsl" - testImplementation "${besuArtifactGroup}.internal:eth" - - testImplementation 'io.tmio:tuweni-bytes' - testImplementation 'io.tmio:tuweni-units' - testImplementation 'org.web3j:abi' - testImplementation 'org.web3j:besu' - testImplementation 'org.web3j:core' + testImplementation 'net.consensys.linea.zktracer:arithmetization' testImplementation 'org.awaitility:awaitility' - testImplementation 'com.splunk.logging:splunk-library-javalogging' } test.enabled = false diff --git a/gradle.properties b/gradle.properties index 04ebe504..26d2049b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ -releaseVersion=0.8.0-rc6.1 +releaseVersion=0.8.0-rc8.1 besuVersion=24.12-delivery40 -arithmetizationVersion=0.8.0-rc6 +arithmetizationVersion=0.8.0-rc8 besuArtifactGroup=io.consensys.linea-besu distributionIdentifier=linea-sequencer -distributionBaseUrl=https://artifacts.consensys.net/public/linea-besu/raw/names/linea-besu.tar.gz/versions/ +distributionBaseUrl=https://artifacts.consensys.net/public/linea-besu/raw/names/linea-besu.tar.gz/versions/ \ No newline at end of file diff --git a/gradle/allowed-licenses.json b/gradle/allowed-licenses.json index 25de3c9a..948cef55 100644 --- a/gradle/allowed-licenses.json +++ b/gradle/allowed-licenses.json @@ -32,6 +32,10 @@ "moduleLicense": "Eclipse Distribution License - v 1.0", "moduleLicenseUrl": "http://www.eclipse.org/legal/epl-v10.html" }, + { + "moduleLicense": "Eclipse Public License - v 1.0", + "moduleLicenseUrl": "http://www.eclipse.org/legal/epl-v10.html" + }, { "moduleLicense": "Eclipse Public License - v 2.0", "moduleLicenseUrl": "https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt" @@ -64,6 +68,16 @@ { "moduleName": "org.jetbrains.kotlin:kotlin-stdlib-common", "moduleVersion": "1.9.22" + }, + { + "moduleLicense": "CDDL-1.0", + "moduleVersion": "3.0.2", + "moduleName": "org.jupnp:org.jupnp" + }, + { + "moduleLicense": "CDDL-1.0", + "moduleVersion": "3.0.2", + "moduleName": "org.jupnp:org.jupnp.support" } ] } \ No newline at end of file diff --git a/gradle/common-dependencies.gradle b/gradle/common-dependencies.gradle index 03663674..fcf0c25b 100644 --- a/gradle/common-dependencies.gradle +++ b/gradle/common-dependencies.gradle @@ -16,24 +16,21 @@ dependencies { api 'org.slf4j:slf4j-api' - implementation 'org.apache.logging.log4j:log4j-api' - implementation 'org.apache.logging.log4j:log4j-core' - implementation 'org.apache.logging.log4j:log4j-slf4j2-impl' - - implementation 'commons-io:commons-io' - implementation 'com.slack.api:slack-api-client' - testImplementation 'org.apache.commons:commons-lang3' testImplementation 'com.google.guava:guava' testImplementation 'org.assertj:assertj-core' testImplementation 'org.junit.jupiter:junit-jupiter-api' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' testImplementation 'org.junit.jupiter:junit-jupiter-params' - testRuntimeOnly 'org.junit.vintage:junit-vintage-engine' testImplementation 'org.mockito:mockito-core' testImplementation 'org.mockito:mockito-junit-jupiter' - testImplementation "org.wiremock:wiremock" + testImplementation 'org.wiremock:wiremock' + + testRuntimeOnly 'org.apache.logging.log4j:log4j-api' + testRuntimeOnly 'org.apache.logging.log4j:log4j-core' + testRuntimeOnly 'org.apache.logging.log4j:log4j-slf4j2-impl' + + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' } diff --git a/gradle/dependency-management.gradle b/gradle/dependency-management.gradle index 2b4d17c7..04b0edce 100644 --- a/gradle/dependency-management.gradle +++ b/gradle/dependency-management.gradle @@ -44,12 +44,6 @@ repositories { mavenLocal() } -configurations.all { - resolutionStrategy { - cacheChangingModulesFor 0, 'seconds' - } -} - apply plugin: 'io.spring.dependency-management' dependencyManagement { @@ -57,108 +51,19 @@ dependencyManagement { generatedPomCustomization { enabled = false } + imports { + mavenBom "${besuArtifactGroup}:bom:${besuVersion}" + } dependencies { dependencySet(group: "net.consensys.linea.zktracer", version: "${arithmetizationVersion}") { entry "arithmetization" } - // Besu dependencies - dependencySet(group: "${besuArtifactGroup}", version: "${besuVersion}") { - entry "besu-datatypes" - entry "evm" - entry "plugin-api" - } - - // Besu internal dependencies - dependencySet(group: "${besuArtifactGroup}.internal", version: "${besuVersion}") { - entry "algorithms" - entry "api" - entry "core" - entry "dsl" - entry "eth" - entry "rlp" - entry "besu" - } - - dependencySet(group: 'ch.qos.logback', version: '1.5.6') { - entry 'logback-core' - entry 'logback-classic' - } - - dependency 'com.fasterxml.jackson.core:jackson-databind:2.17.2' - dependency 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.17.2' - dependency 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.17.2' - - dependency 'com.google.auto.service:auto-service:1.1.1' - - dependency 'com.google.guava:guava:33.3.0-jre' - - dependency 'commons-io:commons-io:2.16.1' - - dependency 'com.slack.api:slack-api-client:1.32.1' - - dependency 'com.splunk.logging:splunk-library-javalogging:1.11.8' - - dependencySet(group: 'info.picocli', version: '4.7.6') { - entry 'picocli' - entry 'picocli-codegen' - } - - dependency 'com.squareup.okhttp3:okhttp:4.12.0' - - dependencySet(group: 'io.tmio', version: '2.4.2') { - entry 'tuweni-bytes' - entry 'tuweni-net' - entry 'tuweni-toml' - entry 'tuweni-units' - } - - dependency 'io.vertx:vertx-core:4.5.9' - - dependency 'net.java.dev.jna:jna:5.14.0' - - dependency 'org.assertj:assertj-core:3.26.3' - - dependency 'org.apache.commons:commons-lang3:3.17.0' - - dependencySet(group: 'org.apache.logging.log4j', version: '2.23.1') { - entry 'log4j-api' - entry 'log4j-core' - entry 'log4j-slf4j2-impl' - } - - dependency 'org.awaitility:awaitility:4.2.2' - - dependencySet(group: 'org.bouncycastle', version: '1.78.1') { - entry 'bcpkix-jdk18on' - entry 'bcprov-jdk18on' - entry 'jcajce' - } - - dependency 'org.hibernate.validator:hibernate-validator:8.0.1.Final' - - dependencySet(group: 'org.junit.jupiter', version: '5.11.0') { - entry 'junit-jupiter-api' - entry 'junit-jupiter-engine' - entry 'junit-jupiter-params' - } - dependency 'org.junit.vintage:junit-vintage-engine:5.11.0' - - dependencySet(group: 'org.mockito', version: '5.13.0') { - entry 'mockito-core' - entry 'mockito-junit-jupiter' - } - - dependency 'org.slf4j:slf4j-api:2.0.16' - - dependencySet(group: 'org.web3j', version: '4.12.1') { - entry 'abi' - entry 'besu' - entry 'core' - entry 'crypto' - } + dependency 'com.google.code.gson:gson:2.11.0' - dependency "org.wiremock:wiremock:3.9.1" + // ToDo: remove when fixed in Besu, force version to avoid conflict with previous version + dependency 'org.apache.logging.log4j:log4j-api:2.24.1' + dependency 'org.apache.logging.log4j:log4j-core:2.24.1' } } diff --git a/sequencer/build.gradle b/sequencer/build.gradle index dea8ed49..b50c552a 100644 --- a/sequencer/build.gradle +++ b/sequencer/build.gradle @@ -32,49 +32,35 @@ dependencies { // annotationProcessor generates the file META-INF/services/org.hyperledger.besu.plugin.BesuPlugin annotationProcessor 'com.google.auto.service:auto-service' - compileOnly "${besuArtifactGroup}:besu-datatypes" - compileOnly "${besuArtifactGroup}:evm" - compileOnly "${besuArtifactGroup}:plugin-api" - compileOnly "${besuArtifactGroup}.internal:algorithms" - compileOnly "${besuArtifactGroup}.internal:api" - compileOnly "${besuArtifactGroup}.internal:core" - compileOnly "${besuArtifactGroup}.internal:rlp" - - compileOnly 'com.google.auto.service:auto-service' - compileOnly 'com.google.auto.service:auto-service-annotations' + implementation project(":native:compress") - compileOnly 'info.picocli:picocli' + implementation "${besuArtifactGroup}:besu-datatypes" + implementation "${besuArtifactGroup}:evm" + implementation "${besuArtifactGroup}:plugin-api" + implementation "${besuArtifactGroup}.internal:algorithms" + implementation "${besuArtifactGroup}.internal:api" + implementation "${besuArtifactGroup}.internal:core" + implementation "${besuArtifactGroup}.internal:rlp" - compileOnly 'io.vertx:vertx-core' + implementation 'com.google.auto.service:auto-service' - compileOnly 'com.squareup.okhttp3:okhttp' + implementation 'com.google.code.gson:gson' - implementation project(":native:compress") - - implementation 'com.fasterxml.jackson.core:jackson-databind' - implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml' + implementation 'info.picocli:picocli' implementation 'io.tmio:tuweni-bytes' implementation 'io.tmio:tuweni-units' implementation 'io.tmio:tuweni-toml' - implementation 'org.bouncycastle:bcprov-jdk18on' - implementation 'org.hibernate.validator:hibernate-validator' + implementation 'net.consensys.linea.zktracer:arithmetization' - implementation ('net.consensys.linea.zktracer:arithmetization') { - transitive = false - } + implementation 'org.hibernate.validator:hibernate-validator' - testImplementation "${besuArtifactGroup}:evm" - testImplementation "${besuArtifactGroup}:besu-datatypes" - testImplementation "${besuArtifactGroup}.internal:core" - testImplementation "${besuArtifactGroup}.internal:rlp" - testImplementation "${besuArtifactGroup}:plugin-api" testImplementation "${besuArtifactGroup}.internal:besu" - testImplementation "org.awaitility:awaitility" - // workaround for bug https://github.com/dnsjava/dnsjava/issues/329, remove when upgraded upstream - testImplementation 'dnsjava:dnsjava:3.6.1' + + + testImplementation 'org.awaitility:awaitility' } configurations {