Skip to content

Commit

Permalink
TokenAndTypeCheckFix (#9672) (#9844)
Browse files Browse the repository at this point in the history
Signed-off-by: ilko-iliev-lime <ilko.iliev@limechain.tech>
  • Loading branch information
ilko-iliev-lime committed Nov 13, 2023
1 parent 66101b1 commit d7078a7
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.istoken;

import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS;
import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult;
import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult;
import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.istoken.IsTokenTranslator.IS_TOKEN;
import static java.util.Objects.requireNonNull;
Expand Down Expand Up @@ -56,15 +55,12 @@ public IsTokenCall(
@Override
protected @NonNull FullResult viewCallResultWith(
@NonNull final ResponseCodeEnum status, final long gasRequirement) {
return fullResultsFor(status, gasRequirement, false);
return fullResultsFor(SUCCESS, gasRequirement, false);
}

private @NonNull FullResult fullResultsFor(
@NonNull final ResponseCodeEnum status, final long gasRequirement, final boolean isToken) {
// @Future remove to revert #9065 after modularization is completed
if (isStaticCall && status != SUCCESS) {
return revertResult(status, gasRequirement);
}
return successResult(IS_TOKEN.getOutputs().encodeElements(status.protoOrdinal(), isToken), gasRequirement);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,31 @@

package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokentype;

import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID;
import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS;
import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult;
import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult;
import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_PRECOMPILE_ADDRESS;
import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly;
import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokentype.TokenTypeTranslator.TOKEN_TYPE;
import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asEvmContractId;
import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultFailedFor;
import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultSuccessFor;
import static java.util.Objects.requireNonNull;

import com.hedera.hapi.node.base.ContractID;
import com.hedera.hapi.node.base.ResponseCodeEnum;
import com.hedera.hapi.node.state.token.Token;
import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator;
import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract;
import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult;
import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall;
import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater;
import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.Nullable;
import org.apache.tuweni.bytes.Bytes;
import org.hyperledger.besu.datatypes.Address;

public class TokenTypeCall extends AbstractNonRevertibleTokenViewCall {
private final boolean isStaticCall;
Expand Down Expand Up @@ -68,4 +78,36 @@ public TokenTypeCall(
}
return successResult(TOKEN_TYPE.getOutputs().encodeElements(status.protoOrdinal(), tokenType), gasRequirement);
}

@Override
public @NonNull PricedResult execute() {
PricedResult result;
long gasRequirement;
Bytes output;

ContractID contractID = asEvmContractId(Address.fromHexString(HTS_PRECOMPILE_ADDRESS));
if (token == null) {
result = gasOnly(viewCallResultWith(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement()));

gasRequirement = result.fullResult().gasRequirement();
enhancement
.systemOperations()
.externalizeResult(
contractFunctionResultFailedFor(gasRequirement, INVALID_TOKEN_ID.toString(), contractID),
SystemContractUtils.ResultStatus.IS_ERROR,
INVALID_TOKEN_ID);
} else {
result = gasOnly(resultOfViewingToken(token));

gasRequirement = result.fullResult().gasRequirement();
output = result.fullResult().result().getOutput();
enhancement
.systemOperations()
.externalizeResult(
contractFunctionResultSuccessFor(gasRequirement, output, contractID),
SystemContractUtils.ResultStatus.IS_SUCCESS,
SUCCESS);
}
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,8 @@

package com.hedera.node.app.service.contract.impl.test.exec.systemcontracts.hts.istoken;

import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID;
import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS;
import static com.hedera.node.app.service.contract.impl.test.TestHelpers.FUNGIBLE_TOKEN;
import static com.hedera.node.app.service.contract.impl.test.TestHelpers.revertOutputFor;
import static org.junit.jupiter.api.Assertions.assertEquals;

import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.iskyc.IsKycTranslator;
Expand Down Expand Up @@ -58,18 +56,8 @@ void returnsIsTokenForMissingToken() {
assertEquals(
Bytes.wrap(IsKycTranslator.IS_KYC
.getOutputs()
.encodeElements(INVALID_TOKEN_ID.protoOrdinal(), false)
.encodeElements(SUCCESS.protoOrdinal(), false)
.array()),
result.getOutput());
}

@Test
void returnsIsTokenForMissingTokenStaticCall() {
final var subject = new IsTokenCall(gasCalculator, mockEnhancement(), true, null);

final var result = subject.execute().fullResult().result();

assertEquals(MessageFrame.State.REVERT, result.getState());
assertEquals(revertOutputFor(INVALID_TOKEN_ID), result.getOutput());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ private HapiSpec checkTokenAndTypeStandardCases() {
.then();
}

@HapiTest
private HapiSpec checkTokenAndTypeNegativeCases() {
final AtomicReference<TokenID> vanillaTokenID = new AtomicReference<>();
final var notAnAddress = new byte[20];
Expand Down

0 comments on commit d7078a7

Please sign in to comment.