From 6582f75a0ec35765ce536160449c8256f6be2ba5 Mon Sep 17 00:00:00 2001 From: ilko-iliev-lime <147391430+ilko-iliev-lime@users.noreply.github.com> Date: Mon, 20 Nov 2023 11:22:01 +0200 Subject: [PATCH] #9427: Revert after INVALID_ACCOUNT_ID static call (#9931) Signed-off-by: ilko-iliev-lime --- .../hts/allowance/GetAllowanceCall.java | 4 +++ .../hts/allowance/GetAllowanceCallTest.java | 28 ++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/allowance/GetAllowanceCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/allowance/GetAllowanceCall.java index 810a349fa89c..702a1b1f0f5d 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/allowance/GetAllowanceCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/allowance/GetAllowanceCall.java @@ -84,6 +84,10 @@ protected FullResult resultOfViewingToken(@NonNull final Token token) { } final var ownerID = addressIdConverter.convert(owner); final var ownerAccount = nativeOperations().getAccount(ownerID.accountNumOrThrow()); + if (isStaticCall && ownerAccount == null) { + return FullResult.revertResult( + com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_ACCOUNT_ID, gasRequirement); + } final var spenderID = addressIdConverter.convert(spender); if (!spenderID.hasAccountNum() && !isStaticCall) { return FullResult.successResult( diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/allowance/GetAllowanceCallTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/allowance/GetAllowanceCallTest.java index 01f489be5b43..b29de7db8fb4 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/allowance/GetAllowanceCallTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/allowance/GetAllowanceCallTest.java @@ -16,14 +16,9 @@ package com.hedera.node.app.service.contract.impl.test.exec.systemcontracts.hts.allowance; +import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; -import static com.hedera.node.app.service.contract.impl.test.TestHelpers.APPROVED_HEADLONG_ADDRESS; -import static com.hedera.node.app.service.contract.impl.test.TestHelpers.B_NEW_ACCOUNT_ID; -import static com.hedera.node.app.service.contract.impl.test.TestHelpers.FUNGIBLE_TOKEN; -import static com.hedera.node.app.service.contract.impl.test.TestHelpers.NON_FUNGIBLE_TOKEN; -import static com.hedera.node.app.service.contract.impl.test.TestHelpers.OPERATOR; -import static com.hedera.node.app.service.contract.impl.test.TestHelpers.OWNER_HEADLONG_ADDRESS; -import static com.hedera.node.app.service.contract.impl.test.TestHelpers.revertOutputFor; +import static com.hedera.node.app.service.contract.impl.test.TestHelpers.*; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; @@ -63,6 +58,25 @@ void revertsWithFungibleToken() { assertEquals(revertOutputFor(INVALID_TOKEN_ID), result.getOutput()); } + @Test + void revertsWithInvalidAccountId() { + subject = new GetAllowanceCall( + addressIdConverter, + gasCalculator, + mockEnhancement(), + FUNGIBLE_TOKEN, + OWNER_HEADLONG_ADDRESS, + APPROVED_HEADLONG_ADDRESS, + true, + true); + given(addressIdConverter.convert(OWNER_HEADLONG_ADDRESS)).willReturn(A_NEW_ACCOUNT_ID); + given(nativeOperations.getAccount(A_NEW_ACCOUNT_ID.accountNum())).willReturn(null); + final var result = subject.execute().fullResult().result(); + + assertEquals(MessageFrame.State.REVERT, result.getState()); + assertEquals(revertOutputFor(INVALID_ACCOUNT_ID), result.getOutput()); + } + @Test void ERCGetAllowance() { subject = new GetAllowanceCall(