diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/evm/Evm46ValidationSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/evm/Evm46ValidationSuite.java index 5689b24a4bc7..55871af07f0f 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/evm/Evm46ValidationSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/evm/Evm46ValidationSuite.java @@ -125,7 +125,6 @@ public class Evm46ValidationSuite extends HapiSuite { private static final String DYNAMIC_EVM_PROPERTY = "contracts.evm.version.dynamic"; private static final String EVM_VERSION_046 = "v0.46"; private static final String BALANCE_OF = "balanceOf"; - public static final List nonExistingSystemAccounts = List.of(0L, 1L, 9L, 10L, 358L, 359L, 360L, 361L, 750L, 751L); public static final List existingSystemAccounts = List.of(999L, 1000L); diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeCopyOperationSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeCopyOperationSuite.java index 270bff9caab6..86c3d8a07780 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeCopyOperationSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeCopyOperationSuite.java @@ -30,6 +30,9 @@ import static com.hedera.services.bdd.spec.utilops.CustomSpecAssert.allRunFor; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.withOpContext; import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.FULLY_NONDETERMINISTIC; +import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_FUNCTION_PARAMETERS; +import static com.hedera.services.bdd.suites.contract.Utils.mirrorAddrWith; +import static com.hedera.services.bdd.suites.contract.evm.Evm46ValidationSuite.systemAccounts; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS; @@ -37,6 +40,7 @@ import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; +import com.hedera.services.bdd.spec.HapiSpecOperation; import com.hedera.services.bdd.suites.HapiSuite; import java.util.List; import org.apache.logging.log4j.LogManager; @@ -56,7 +60,7 @@ public static void main(String[] args) { @Override public List getSpecsInSuite() { - return List.of(verifiesExistence()); + return List.of(verifiesExistence(), testExtCodeCopyWithSystemAccounts()); } @Override @@ -123,6 +127,40 @@ contract, codeCopyOf, asHeadlongAddress(contractAddress)) })); } + @HapiTest + HapiSpec testExtCodeCopyWithSystemAccounts() { + final var contract = "ExtCodeOperationsChecker"; + final var emptyBytecode = ByteString.EMPTY; + final var codeCopyOf = "codeCopyOf"; + final var account = "account"; + final HapiSpecOperation[] opsArray = new HapiSpecOperation[systemAccounts.size() * 2]; + + for (int i = 0; i < systemAccounts.size(); i++) { + // add contract call for all accounts in the list + opsArray[i] = contractCall(contract, codeCopyOf, mirrorAddrWith(systemAccounts.get(i))) + .hasKnownStatus(SUCCESS); + + // add contract call local for all accounts in the list + int finalI = i; + opsArray[systemAccounts.size() + i] = withOpContext((spec, opLog) -> { + final var accountSolidityAddress = mirrorAddrWith(systemAccounts.get(finalI)); + + final var accountCodeCallLocal = contractCallLocal(contract, codeCopyOf, accountSolidityAddress) + .saveResultTo("accountCode"); + allRunFor(spec, accountCodeCallLocal); + + final var accountCode = spec.registry().getBytes("accountCode"); + + Assertions.assertArrayEquals(emptyBytecode.toByteArray(), accountCode); + }); + } + + return defaultHapiSpec("testExtCodeCopyWithSystemAccounts", NONDETERMINISTIC_FUNCTION_PARAMETERS) + .given(uploadInitCode(contract), contractCreate(contract), cryptoCreate(account)) + .when() + .then(opsArray); + } + @Override protected Logger getResultsLogger() { return LOG; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeHashOperationSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeHashOperationSuite.java index 3cd80d060e29..d00bfaffbe5e 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeHashOperationSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeHashOperationSuite.java @@ -30,6 +30,10 @@ import static com.hedera.services.bdd.spec.utilops.CustomSpecAssert.allRunFor; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.withOpContext; import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_FUNCTION_PARAMETERS; +import static com.hedera.services.bdd.suites.contract.Utils.FunctionType.FUNCTION; +import static com.hedera.services.bdd.suites.contract.Utils.getABIFor; +import static com.hedera.services.bdd.suites.contract.Utils.mirrorAddrWith; +import static com.hedera.services.bdd.suites.contract.evm.Evm46ValidationSuite.systemAccounts; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS; @@ -37,6 +41,8 @@ import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; +import com.hedera.services.bdd.spec.HapiSpecOperation; +import com.hedera.services.bdd.spec.assertions.ContractFnResultAsserts; import com.hedera.services.bdd.suites.HapiSuite; import java.util.List; import org.apache.logging.log4j.LogManager; @@ -58,7 +64,7 @@ public static void main(String[] args) { @Override public List getSpecsInSuite() { - return List.of(verifiesExistence()); + return List.of(verifiesExistence(), testExtCodeHashWithSystemAccounts()); } @Override @@ -124,6 +130,33 @@ contract, hashOf, asHeadlongAddress(contractAddress)) })); } + @HapiTest + HapiSpec testExtCodeHashWithSystemAccounts() { + final var contract = "ExtCodeOperationsChecker"; + final var hashOf = "hashOf"; + final String account = "account"; + final HapiSpecOperation[] opsArray = new HapiSpecOperation[systemAccounts.size() * 2]; + + for (int i = 0; i < systemAccounts.size(); i++) { + // add contract call for all accounts in the list + opsArray[i] = contractCall(contract, hashOf, mirrorAddrWith(systemAccounts.get(i))) + .hasKnownStatus(SUCCESS); + + // add contract call local for all accounts in the list + opsArray[systemAccounts.size() + i] = contractCallLocal( + contract, hashOf, mirrorAddrWith(systemAccounts.get(i))) + .has(ContractFnResultAsserts.resultWith() + .resultThruAbi( + getABIFor(FUNCTION, hashOf, contract), + ContractFnResultAsserts.isLiteralResult(new Object[] {new byte[32]}))); + } + + return defaultHapiSpec("testExtCodeHashWithSystemAccounts", NONDETERMINISTIC_FUNCTION_PARAMETERS) + .given(uploadInitCode(contract), contractCreate(contract), cryptoCreate(account)) + .when() + .then(opsArray); + } + @Override protected Logger getResultsLogger() { return LOG; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeSizeOperationSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeSizeOperationSuite.java index 55a91aa00216..1c1d0c100f18 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeSizeOperationSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeSizeOperationSuite.java @@ -35,12 +35,15 @@ import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_FUNCTION_PARAMETERS; import static com.hedera.services.bdd.suites.contract.Utils.FunctionType.FUNCTION; import static com.hedera.services.bdd.suites.contract.Utils.getABIFor; +import static com.hedera.services.bdd.suites.contract.Utils.mirrorAddrWith; +import static com.hedera.services.bdd.suites.contract.evm.Evm46ValidationSuite.systemAccounts; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS; import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; +import com.hedera.services.bdd.spec.HapiSpecOperation; import com.hedera.services.bdd.spec.assertions.ContractFnResultAsserts; import com.hedera.services.bdd.suites.HapiSuite; import java.math.BigInteger; @@ -62,7 +65,7 @@ public static void main(String[] args) { @Override public List getSpecsInSuite() { - return List.of(verifiesExistence()); + return List.of(verifiesExistence(), testExtCodeSizeWithSystemAccounts()); } @Override @@ -128,6 +131,33 @@ contract, sizeOf, asHeadlongAddress(contractAddress)) })); } + @HapiTest + HapiSpec testExtCodeSizeWithSystemAccounts() { + final var contract = "ExtCodeOperationsChecker"; + final var sizeOf = "sizeOf"; + final var account = "account"; + final HapiSpecOperation[] opsArray = new HapiSpecOperation[systemAccounts.size() * 2]; + + for (int i = 0; i < systemAccounts.size(); i++) { + // add contract call for all accounts in the list + opsArray[i] = contractCall(contract, sizeOf, mirrorAddrWith(systemAccounts.get(i))) + .hasKnownStatus(SUCCESS); + + // add contract call local for all accounts in the list + opsArray[systemAccounts.size() + i] = contractCallLocal( + contract, sizeOf, mirrorAddrWith(systemAccounts.get(i))) + .has(ContractFnResultAsserts.resultWith() + .resultThruAbi( + getABIFor(FUNCTION, sizeOf, contract), + ContractFnResultAsserts.isLiteralResult(new Object[] {BigInteger.valueOf(0L)}))); + } + + return defaultHapiSpec("testExtCodeSizeWithSystemAccounts", NONDETERMINISTIC_FUNCTION_PARAMETERS) + .given(uploadInitCode(contract), contractCreate(contract), cryptoCreate(account)) + .when() + .then(opsArray); + } + @Override protected Logger getResultsLogger() { return LOG;