Skip to content

Commit

Permalink
Merge branch 'develop' into 9696-hollow-account-records
Browse files Browse the repository at this point in the history
  • Loading branch information
Neeharika-Sompalli committed Nov 17, 2023
2 parents fbe4d3d + c812f68 commit e3dc111
Show file tree
Hide file tree
Showing 51 changed files with 621 additions and 239 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/node-zxcron-release-fsts-regression.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
major="${BASH_REMATCH[1]}"
minor="${BASH_REMATCH[2]}"
if [[ "${major}" -eq 0 && "${minor}" -lt 43 ]]; then
if [[ "${major}" -eq 0 && "${minor}" -lt 44 ]]; then
continue
fi
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
major="${BASH_REMATCH[1]}"
minor="${BASH_REMATCH[2]}"
if [[ "${major}" -eq 0 && "${minor}" -lt 43 ]]; then
if [[ "${major}" -eq 0 && "${minor}" -lt 44 ]]; then
continue
fi
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,15 @@ public void handle(@NonNull final HandleContext context) throws HandleException
currentTransaction, currentConsensusTime, schedulingConfig.maxExpirationFutureSeconds());
checkSchedulableWhitelistHandle(provisionalSchedule, schedulingConfig);
context.attributeValidator().validateMemo(provisionalSchedule.memo());
context.attributeValidator()
.validateMemo(provisionalSchedule.scheduledTransaction().memo());
if (provisionalSchedule.hasAdminKey()) {
try {
context.attributeValidator().validateKey(provisionalSchedule.adminKeyOrThrow());
} catch (HandleException e) {
throw new HandleException(ResponseCodeEnum.INVALID_ADMIN_KEY);
}
}
final ResponseCodeEnum validationResult =
validate(provisionalSchedule, currentConsensusTime, isLongTermEnabled);
if (validationOk(validationResult)) {
Expand All @@ -164,8 +173,9 @@ public void handle(@NonNull final HandleContext context) throws HandleException
}
scheduleStore.put(finalSchedule);
final ScheduleRecordBuilder scheduleRecords = context.recordBuilder(ScheduleRecordBuilder.class);
scheduleRecords.scheduleID(finalSchedule.scheduleId());
scheduleRecords.scheduledTransactionID(HandlerUtility.transactionIdForScheduled(finalSchedule));
scheduleRecords
.scheduleID(finalSchedule.scheduleId())
.scheduledTransactionID(HandlerUtility.transactionIdForScheduled(finalSchedule));
} else {
throw new HandleException(validationResult);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ abstract class RandomOperationSignedBy<T extends HapiTxnOp<T>> implements OpProv
private final RegistrySourcedNameProvider<AccountID> accounts;

private final ResponseCodeEnum[] permissiblePrechecks =
standardPrechecksAnd(PAYER_ACCOUNT_NOT_FOUND, ACCOUNT_DELETED);
standardPrechecksAnd(PAYER_ACCOUNT_NOT_FOUND, ACCOUNT_DELETED, PAYER_ACCOUNT_DELETED);
private final ResponseCodeEnum[] permissibleOutcomes =
standardOutcomesAnd(TOKEN_ALREADY_ASSOCIATED_TO_ACCOUNT, ACCOUNT_DELETED, PAYER_ACCOUNT_DELETED);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import static com.hedera.services.bdd.suites.regression.factories.AccountCompletionFuzzingFactory.hollowAccountFuzzingWith;
import static com.hedera.services.bdd.suites.regression.factories.AccountCompletionFuzzingFactory.initOperations;

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.suites.HapiSuite;
Expand All @@ -47,6 +48,7 @@ public List<HapiSpec> getSpecsInSuite() {
return List.of(hollowAccountCompletionFuzzing());
}

@HapiTest
private HapiSpec hollowAccountCompletionFuzzing() {
return defaultHapiSpec("HollowAccountCompletionFuzzing")
.given(initOperations())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,7 @@ private HapiSpec recognizesIdenticalScheduleEvenWithDifferentDesignatedPayer() {
getReceipt(COPYCAT).hasSchedule(ORIGINAL).hasScheduledTxnId(ORIGINAL));
}

@HapiTest
private HapiSpec rejectsSentinelKeyListAsAdminKey() {
return defaultHapiSpec("RejectsSentinelKeyListAsAdminKey")
.given()
Expand All @@ -373,6 +374,7 @@ private HapiSpec rejectsSentinelKeyListAsAdminKey() {
.hasPrecheck(INVALID_ADMIN_KEY));
}

@HapiTest
private HapiSpec rejectsMalformedScheduledTxnMemo() {
return defaultHapiSpec("RejectsMalformedScheduledTxnMemo")
.given(
Expand All @@ -392,6 +394,7 @@ private HapiSpec rejectsMalformedScheduledTxnMemo() {
.hasPrecheck(INVALID_ZERO_BYTE_IN_STRING));
}

@HapiTest
private HapiSpec infoIncludesTxnIdFromCreationReceipt() {
return defaultHapiSpec("InfoIncludesTxnIdFromCreationReceipt")
.given(
Expand All @@ -406,6 +409,7 @@ private HapiSpec infoIncludesTxnIdFromCreationReceipt() {
.logged());
}

// @todo('9869')
private HapiSpec preservesRevocationServiceSemanticsForFileDelete() {
KeyShape waclShape = listOf(SIMPLE, threshOf(2, 3));
SigControl adequateSigs = waclShape.signedWith(sigs(OFF, sigs(ON, ON, OFF)));
Expand Down Expand Up @@ -488,6 +492,7 @@ NEVER_TO_BE, cryptoCreate("nope").key(GENESIS).receiverSigRequired(true))
.hasKnownStatus(ACCOUNT_ID_DOES_NOT_EXIST));
}

// Flaky test
public HapiSpec doesntTriggerUntilPayerSigns() {
return defaultHapiSpec("DoesntTriggerUntilPayerSigns")
.given(
Expand Down Expand Up @@ -528,6 +533,7 @@ public HapiSpec triggersImmediatelyWithBothReqSimpleSigs() {
getTxnRecord(BASIC_XFER).scheduled());
}

@HapiTest
public HapiSpec rejectsUnresolvableReqSigners() {
return defaultHapiSpec("RejectsUnresolvableReqSigners")
.given()
Expand All @@ -550,6 +556,7 @@ public HapiSpec rejectsFunctionlessTxn() {
.payingWith(GENESIS));
}

// Disabled because schedule throttle is not implemented yet
public HapiSpec functionlessTxnBusyWithNonExemptPayer() {
return defaultHapiSpec("FunctionlessTxnBusyWithNonExemptPayer")
.given()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@
package com.hedera.services.bdd.suites.token;

import static com.hedera.services.bdd.spec.HapiSpec.defaultHapiSpec;
import static com.hedera.services.bdd.spec.queries.QueryVerbs.getAccountInfo;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoCreate;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoDelete;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoTransfer;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.fileUpdate;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.grantTokenKyc;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.mintToken;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.revokeTokenKyc;
Expand All @@ -30,26 +28,20 @@
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.tokenFreeze;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.tokenUnfreeze;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.wipeTokenAccount;
import static com.hedera.services.bdd.spec.transactions.crypto.HapiCryptoTransfer.tinyBarsFromTo;
import static com.hedera.services.bdd.spec.transactions.token.TokenMovement.movingUnique;
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.newKeyNamed;
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.sleepFor;
import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.ACCOUNT_DELETED;
import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.ACCOUNT_EXPIRED_AND_PENDING_REMOVAL;
import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.ACCOUNT_FROZEN_FOR_TOKEN;
import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.ACCOUNT_KYC_NOT_GRANTED_FOR_TOKEN;
import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ACCOUNT_ID;
import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.TOKEN_NOT_ASSOCIATED_TO_ACCOUNT;

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.suites.HapiSuite;
import com.hedera.services.bdd.suites.autorenew.AutoRenewConfigChoices;
import com.hederahashgraph.api.proto.java.TokenType;
import java.util.List;
import java.util.Set;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Expand Down Expand Up @@ -82,55 +74,11 @@ public List<HapiSpec> getSpecsInSuite() {
uniqueTokenOperationsFailForFrozenAccount(),
/* Account Without KYC */
uniqueTokenOperationsFailForKycRevokedAccount(),
/* Expired Account */
uniqueTokenOperationsFailForExpiredAccount(),
/* Deleted Account */
uniqueTokenOperationsFailForDeletedAccount(),
/* AutoRemoved Account */
uniqueTokenOperationsFailForAutoRemovedAccount()
});
}

private HapiSpec uniqueTokenOperationsFailForAutoRemovedAccount() {
return defaultHapiSpec("UniqueTokenOperationsFailForAutoRemovedAccount")
.given(
fileUpdate(APP_PROPERTIES)
.payingWith(GENESIS)
.overridingProps(AutoRenewConfigChoices.propsForAccountAutoRenewOnWith(1, 0, 100, 10))
.erasingProps(Set.of("minimumAutoRenewDuration")),
newKeyNamed(SUPPLY_KEY),
newKeyNamed(FREEZE_KEY),
newKeyNamed(KYC_KEY),
newKeyNamed(WIPE_KEY),
cryptoCreate(TREASURY),
tokenCreate(UNIQUE_TOKEN_A)
.tokenType(TokenType.NON_FUNGIBLE_UNIQUE)
.initialSupply(0)
.supplyKey(SUPPLY_KEY)
.freezeKey(FREEZE_KEY)
.kycKey(KYC_KEY)
.wipeKey(WIPE_KEY)
.treasury(TREASURY),
mintToken(
UNIQUE_TOKEN_A,
List.of(ByteString.copyFromUtf8(MEMO_1), ByteString.copyFromUtf8(MEMO_2))))
.when(
cryptoCreate(CLIENT_1).autoRenewSecs(3L).balance(0L),
tokenAssociate(CLIENT_1, UNIQUE_TOKEN_A),
grantTokenKyc(UNIQUE_TOKEN_A, CLIENT_1),
cryptoTransfer(movingUnique(UNIQUE_TOKEN_A, 1L).between(TREASURY, CLIENT_1)),
sleepFor(3_500L),
cryptoTransfer(tinyBarsFromTo(GENESIS, NODE, 1L)))
.then(
cryptoTransfer(movingUnique(UNIQUE_TOKEN_A, 2L).between(TREASURY, CLIENT_1))
.hasKnownStatus(INVALID_ACCOUNT_ID),
revokeTokenKyc(UNIQUE_TOKEN_A, CLIENT_1).hasKnownStatus(INVALID_ACCOUNT_ID),
grantTokenKyc(UNIQUE_TOKEN_A, CLIENT_1).hasKnownStatus(INVALID_ACCOUNT_ID),
tokenFreeze(UNIQUE_TOKEN_A, CLIENT_1).hasKnownStatus(INVALID_ACCOUNT_ID),
tokenUnfreeze(UNIQUE_TOKEN_A, CLIENT_1).hasKnownStatus(INVALID_ACCOUNT_ID),
wipeTokenAccount(UNIQUE_TOKEN_A, CLIENT_1, List.of(1L)).hasKnownStatus(INVALID_ACCOUNT_ID));
}

@HapiTest
private HapiSpec uniqueTokenOperationsFailForDeletedAccount() {
return defaultHapiSpec("UniqueTokenOperationsFailForDeletedAccount")
Expand Down Expand Up @@ -165,52 +113,6 @@ private HapiSpec uniqueTokenOperationsFailForDeletedAccount() {
wipeTokenAccount(UNIQUE_TOKEN_A, CLIENT_1, List.of(1L)).hasKnownStatus(ACCOUNT_DELETED));
}

private HapiSpec uniqueTokenOperationsFailForExpiredAccount() {
return defaultHapiSpec("UniqueTokenOperationsFailForExpiredAccount")
.given(
fileUpdate(APP_PROPERTIES)
.payingWith(GENESIS)
.overridingProps(
AutoRenewConfigChoices.propsForAccountAutoRenewOnWith(1, 7776000, 100, 10))
.erasingProps(Set.of("minimumAutoRenewDuration")),
newKeyNamed(SUPPLY_KEY),
newKeyNamed(FREEZE_KEY),
newKeyNamed(KYC_KEY),
newKeyNamed(WIPE_KEY),
cryptoCreate(TREASURY).autoRenewSecs(THREE_MONTHS_IN_SECONDS),
tokenCreate(UNIQUE_TOKEN_A)
.tokenType(TokenType.NON_FUNGIBLE_UNIQUE)
.initialSupply(0)
.supplyKey(SUPPLY_KEY)
.freezeKey(FREEZE_KEY)
.kycKey(KYC_KEY)
.wipeKey(WIPE_KEY)
.treasury(TREASURY),
mintToken(
UNIQUE_TOKEN_A,
List.of(ByteString.copyFromUtf8(MEMO_1), ByteString.copyFromUtf8(MEMO_2))),
cryptoCreate(CLIENT_1).autoRenewSecs(10L).balance(0L),
getAccountInfo(CLIENT_1).logged(),
tokenAssociate(CLIENT_1, UNIQUE_TOKEN_A),
grantTokenKyc(UNIQUE_TOKEN_A, CLIENT_1),
cryptoTransfer(movingUnique(UNIQUE_TOKEN_A, 2L).between(TREASURY, CLIENT_1)))
.when(sleepFor(10_500L), cryptoTransfer(tinyBarsFromTo(DEFAULT_PAYER, FUNDING, 1L)))
.then(
getAccountInfo(CLIENT_1).logged(),
cryptoTransfer(movingUnique(UNIQUE_TOKEN_A, 2L).between(TREASURY, CLIENT_1))
.hasKnownStatus(ACCOUNT_EXPIRED_AND_PENDING_REMOVAL),
cryptoCreate(CLIENT_2),
tokenAssociate(CLIENT_2, UNIQUE_TOKEN_A),
cryptoTransfer(movingUnique(UNIQUE_TOKEN_A, 1L).between(CLIENT_1, CLIENT_2))
.hasKnownStatus(ACCOUNT_EXPIRED_AND_PENDING_REMOVAL),
tokenFreeze(UNIQUE_TOKEN_A, CLIENT_1).hasKnownStatus(ACCOUNT_EXPIRED_AND_PENDING_REMOVAL),
tokenUnfreeze(UNIQUE_TOKEN_A, CLIENT_1).hasKnownStatus(ACCOUNT_EXPIRED_AND_PENDING_REMOVAL),
grantTokenKyc(UNIQUE_TOKEN_A, CLIENT_1).hasKnownStatus(ACCOUNT_EXPIRED_AND_PENDING_REMOVAL),
revokeTokenKyc(UNIQUE_TOKEN_A, CLIENT_1).hasKnownStatus(ACCOUNT_EXPIRED_AND_PENDING_REMOVAL),
wipeTokenAccount(UNIQUE_TOKEN_A, CLIENT_1, List.of(1L))
.hasKnownStatus(ACCOUNT_EXPIRED_AND_PENDING_REMOVAL));
}

@HapiTest
private HapiSpec uniqueTokenOperationsFailForKycRevokedAccount() {
return defaultHapiSpec("UniqueTokenOperationsFailForKycRevokedAccount")
Expand Down
Loading

0 comments on commit e3dc111

Please sign in to comment.