Skip to content

Commit

Permalink
merge from upstream
Browse files Browse the repository at this point in the history
Signed-off-by: Anthony Petrov <anthony@swirldslabs.com>
  • Loading branch information
anthony-swirldslabs committed Feb 12, 2024
2 parents f93c94f + 6ea8984 commit 36b45cd
Show file tree
Hide file tree
Showing 6 changed files with 159 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Long> nonExistingSystemAccounts =
List.of(0L, 1L, 9L, 10L, 358L, 359L, 360L, 361L, 750L, 751L);
public static final List<Long> existingSystemAccounts = List.of(999L, 1000L);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,17 @@
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;

import com.google.protobuf.ByteString;
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;
Expand All @@ -56,7 +60,7 @@ public static void main(String[] args) {

@Override
public List<HapiSpec> getSpecsInSuite() {
return List.of(verifiesExistence());
return List.of(verifiesExistence(), testExtCodeCopyWithSystemAccounts());
}

@Override
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,19 @@
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;

import com.google.protobuf.ByteString;
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;
Expand All @@ -58,7 +64,7 @@ public static void main(String[] args) {

@Override
public List<HapiSpec> getSpecsInSuite() {
return List.of(verifiesExistence());
return List.of(verifiesExistence(), testExtCodeHashWithSystemAccounts());
}

@Override
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -62,7 +65,7 @@ public static void main(String[] args) {

@Override
public List<HapiSpec> getSpecsInSuite() {
return List.of(verifiesExistence());
return List.of(verifiesExistence(), testExtCodeSizeWithSystemAccounts());
}

@Override
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoUpdate;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.fileUpdate;
import static com.hedera.services.bdd.spec.transactions.crypto.HapiCryptoTransfer.tinyBarsFromTo;
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.keyFromPem;
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.newKeyListNamed;
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.newKeyNamed;
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.withOpContext;
import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.AUTHORIZATION_FAILED;

Expand All @@ -38,11 +39,13 @@
import java.util.concurrent.atomic.AtomicReference;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Disabled;

@HapiTestSuite
public class Issue2319Spec extends HapiSuite {
private static final Logger log = LogManager.getLogger(Issue2319Spec.class);
private static final String NON_TREASURY_KEY = "nonTreasuryKey";
private static final String NON_TREASURY_ADMIN_KEY = "nonTreasuryAdminKey";
private static final String DEFAULT_ADMIN_KEY = "defaultAdminKey";

public static void main(String... args) {
new Issue2319Spec().runSuiteSync();
Expand All @@ -51,29 +54,27 @@ public static void main(String... args) {
@Override
public List<HapiSpec> getSpecsInSuite() {
return List.of(new HapiSpec[] {
sysFileSigReqsWaivedForMasterAndTreasury(),
sysAccountSigReqsWaivedForMasterAndTreasury(),
propsPermissionsSigReqsWaivedForAddressBookAdmin(),
sysFileImmutabilityWaivedForMasterAndTreasury(),
propsPermissionsSigReqsWaivedForAddressBookAdmin(),
sysAccountSigReqsWaivedForMasterAndTreasury(),
sysFileSigReqsWaivedForMasterAndTreasury()
});
}

@HapiTest
@Disabled("Failing or intermittently failing HAPI Test")
final HapiSpec propsPermissionsSigReqsWaivedForAddressBookAdmin() {
var pemLoc = "<PEM>";

return defaultHapiSpec("PropsPermissionsSigReqsWaivedForAddressBookAdmin")
.given(
keyFromPem(pemLoc).name("persistent").simpleWacl().passphrase("<SECRET>"),
newKeyNamed(NON_TREASURY_KEY),
newKeyListNamed(NON_TREASURY_ADMIN_KEY, List.of(NON_TREASURY_KEY)),
cryptoTransfer(tinyBarsFromTo(GENESIS, ADDRESS_BOOK_CONTROL, 1_000_000_000_000L)))
.when(
fileUpdate(APP_PROPERTIES)
.payingWith(ADDRESS_BOOK_CONTROL)
.wacl("persistent"),
.wacl(NON_TREASURY_ADMIN_KEY),
fileUpdate(API_PERMISSIONS)
.payingWith(ADDRESS_BOOK_CONTROL)
.wacl("persistent"))
.wacl(NON_TREASURY_ADMIN_KEY))
.then(
fileUpdate(APP_PROPERTIES)
.payingWith(ADDRESS_BOOK_CONTROL)
Expand All @@ -89,7 +90,7 @@ final HapiSpec propsPermissionsSigReqsWaivedForAddressBookAdmin() {

@HapiTest
final HapiSpec sysFileImmutabilityWaivedForMasterAndTreasury() {
return defaultHapiSpec("SysAccountSigReqsWaivedForMasterAndTreasury")
return defaultHapiSpec("sysFileImmutabilityWaivedForMasterAndTreasury")
.given(
cryptoCreate("civilian"),
cryptoTransfer(tinyBarsFromTo(GENESIS, SYSTEM_ADMIN, 1_000_000_000_000L)))
Expand All @@ -112,16 +113,17 @@ final HapiSpec sysFileImmutabilityWaivedForMasterAndTreasury() {
}

@HapiTest
@Disabled("Failing or intermittently failing HAPI Test")
final HapiSpec sysAccountSigReqsWaivedForMasterAndTreasury() {
var pemLoc = "<PEM>";

return defaultHapiSpec("SysAccountSigReqsWaivedForMasterAndTreasury")
.given(
newKeyNamed(NON_TREASURY_KEY),
newKeyListNamed(NON_TREASURY_ADMIN_KEY, List.of(NON_TREASURY_KEY)),
newKeyListNamed(DEFAULT_ADMIN_KEY, List.of(GENESIS)),
cryptoCreate("civilian"),
keyFromPem(pemLoc).name("persistent").passphrase("<SECReT>"),
cryptoTransfer(tinyBarsFromTo(GENESIS, SYSTEM_ADMIN, 1_000_000_000_000L)))
.when(cryptoUpdate(EXCHANGE_RATE_CONTROL).key("persistent"))
.when(cryptoUpdate(EXCHANGE_RATE_CONTROL)
.key(NON_TREASURY_ADMIN_KEY)
.receiverSigRequired(true))
.then(
cryptoUpdate(EXCHANGE_RATE_CONTROL)
.payingWith(SYSTEM_ADMIN)
Expand All @@ -133,25 +135,26 @@ final HapiSpec sysAccountSigReqsWaivedForMasterAndTreasury() {
.receiverSigRequired(true),
cryptoUpdate(EXCHANGE_RATE_CONTROL)
.payingWith("civilian")
.signedBy("civilian", GENESIS, "persistent")
.receiverSigRequired(true)
.hasPrecheck(AUTHORIZATION_FAILED),
cryptoUpdate(EXCHANGE_RATE_CONTROL).key("persistent").receiverSigRequired(false));
.signedBy("civilian", GENESIS, NON_TREASURY_ADMIN_KEY)
.receiverSigRequired(true),

// reset EXCHANGE_RATE_CONTROL to default state
cryptoUpdate(EXCHANGE_RATE_CONTROL)
.key(DEFAULT_ADMIN_KEY)
.receiverSigRequired(false)
.payingWith(GENESIS)
.signedBy(GENESIS));
}

@HapiTest
@Disabled("Failing or intermittently failing HAPI Test")
final HapiSpec sysFileSigReqsWaivedForMasterAndTreasury() {
var pemLoc = "<PEM>";
var validRates = new AtomicReference<ByteString>();

return defaultHapiSpec("SysFileSigReqsWaivedForMasterAndTreasury")
.given(
cryptoCreate("civilian"),
keyFromPem(pemLoc)
.name("persistent")
.passphrase("<SECRET>")
.simpleWacl(),
newKeyNamed(NON_TREASURY_KEY),
newKeyListNamed(NON_TREASURY_ADMIN_KEY, List.of(NON_TREASURY_KEY)),
withOpContext((spec, opLog) -> {
var fetch = getFileContents(EXCHANGE_RATES);
CustomSpecAssert.allRunFor(spec, fetch);
Expand All @@ -163,7 +166,7 @@ final HapiSpec sysFileSigReqsWaivedForMasterAndTreasury() {
cryptoTransfer(tinyBarsFromTo(GENESIS, SYSTEM_ADMIN, 1_000_000_000_000L)))
.when(fileUpdate(EXCHANGE_RATES)
.payingWith(EXCHANGE_RATE_CONTROL)
.wacl("persistent"))
.wacl(NON_TREASURY_ADMIN_KEY))
.then(
fileUpdate(EXCHANGE_RATES)
.payingWith(SYSTEM_ADMIN)
Expand All @@ -175,7 +178,7 @@ final HapiSpec sysFileSigReqsWaivedForMasterAndTreasury() {
.contents(ignore -> validRates.get()),
fileUpdate(EXCHANGE_RATES)
.payingWith("civilian")
.signedBy("civilian", GENESIS, "persistent")
.signedBy("civilian", GENESIS, NON_TREASURY_ADMIN_KEY)
.contents(ignore -> validRates.get())
.hasPrecheck(AUTHORIZATION_FAILED),
fileUpdate(EXCHANGE_RATES).payingWith(GENESIS).wacl(GENESIS));
Expand Down
Loading

0 comments on commit 36b45cd

Please sign in to comment.