Skip to content

Commit d668e78

Browse files
authored
chore: cherry pick # 13013 (#13024)
Signed-off-by: lukelee-sl <[email protected]>
1 parent b8aaad7 commit d668e78

File tree

5 files changed

+848
-2
lines changed

5 files changed

+848
-2
lines changed

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCallAddressChecks.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public HtsCallAddressChecks() {
3737
* @return true if the frame's parent is a delegate call
3838
*/
3939
public boolean hasParentDelegateCall(@NonNull final MessageFrame frame) {
40-
return isDelegateCall(parentOf(frame));
40+
return frame.getMessageFrameStack().size() > 1 && isDelegateCall(parentOf(frame));
4141
}
4242

4343
private MessageFrame parentOf(@NonNull final MessageFrame frame) {

hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/leaky/LeakyEthereumTestsSuite.java

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.hedera.services.bdd.suites.leaky;
1818

1919
import static com.hedera.services.bdd.junit.TestTags.SMART_CONTRACT;
20+
import static com.hedera.services.bdd.spec.HapiPropertySource.asContractIdWithEvmAddress;
2021
import static com.hedera.services.bdd.spec.HapiSpec.propertyPreservingHapiSpec;
2122
import static com.hedera.services.bdd.spec.assertions.TransactionRecordAsserts.recordWith;
2223
import static com.hedera.services.bdd.spec.keys.KeyFactory.KeyType.THRESHOLD;
@@ -25,21 +26,37 @@
2526
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoCreate;
2627
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoTransfer;
2728
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.ethereumCall;
29+
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.ethereumCallWithFunctionAbi;
30+
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.tokenAssociate;
31+
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.tokenCreate;
2832
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.uploadInitCode;
33+
import static com.hedera.services.bdd.spec.transactions.contract.HapiParserUtil.asHeadlongAddress;
2934
import static com.hedera.services.bdd.spec.transactions.crypto.HapiCryptoTransfer.tinyBarsFromAccountToAlias;
35+
import static com.hedera.services.bdd.spec.transactions.token.TokenMovement.moving;
3036
import static com.hedera.services.bdd.spec.utilops.CustomSpecAssert.allRunFor;
3137
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.newKeyNamed;
3238
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.overriding;
3339
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.resetToDefault;
3440
import static com.hedera.services.bdd.spec.utilops.UtilVerbs.withOpContext;
3541
import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_CONTRACT_CALL_RESULTS;
3642
import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_ETHEREUM_DATA;
43+
import static com.hedera.services.bdd.suites.contract.Utils.FunctionType.FUNCTION;
44+
import static com.hedera.services.bdd.suites.contract.Utils.asAddress;
45+
import static com.hedera.services.bdd.suites.contract.Utils.getABIFor;
46+
import static com.hedera.services.bdd.suites.crypto.CryptoCreateSuite.ACCOUNT;
47+
import static com.hedera.services.bdd.suites.leaky.LeakyContractTestsSuite.RECEIVER;
48+
import static com.hedera.services.bdd.suites.token.TokenAssociationSpecs.VANILLA_TOKEN;
49+
import static com.hedera.services.bdd.suites.token.TokenTransactSpecs.SUPPLY_KEY;
3750
import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS;
51+
import static com.hederahashgraph.api.proto.java.TokenType.FUNGIBLE_COMMON;
52+
import static com.swirlds.common.utility.CommonUtils.unhex;
3853

54+
import com.google.protobuf.ByteString;
3955
import com.hedera.node.app.hapi.utils.ethereum.EthTxData.EthTransactionType;
4056
import com.hedera.services.bdd.junit.HapiTest;
4157
import com.hedera.services.bdd.junit.HapiTestSuite;
4258
import com.hedera.services.bdd.spec.HapiSpec;
59+
import com.hedera.services.bdd.spec.transactions.contract.HapiParserUtil;
4360
import com.hedera.services.bdd.suites.HapiSuite;
4461
import com.hederahashgraph.api.proto.java.ResponseCodeEnum;
4562
import java.math.BigInteger;
@@ -56,6 +73,10 @@ public class LeakyEthereumTestsSuite extends HapiSuite {
5673

5774
private static final String PAY_RECEIVABLE_CONTRACT = "PayReceivable";
5875
private static final Logger log = LogManager.getLogger(LeakyEthereumTestsSuite.class);
76+
private static final String EVM_VERSION_PROPERTY = "contracts.evm.version";
77+
private static final String ALLOW_CALLS_TO_NON_CONTRACT_ACCOUNTS = "contracts.evm.allowCallsToNonContractAccounts";
78+
private static final String DYNAMIC_EVM_PROPERTY = "contracts.evm.version.dynamic";
79+
private static final String EVM_VERSION_046 = "v0.46";
5980

6081
public static void main(String... args) {
6182
new LeakyEthereumTestsSuite().runSuiteAsync();
@@ -68,7 +89,7 @@ public boolean canRunConcurrent() {
6889

6990
@Override
7091
public List<HapiSpec> getSpecsInSuite() {
71-
return Stream.of(legacyUnprotectedEtxBeforeEIP155(), legacyEtxAfterEIP155())
92+
return Stream.of(legacyUnprotectedEtxBeforeEIP155(), legacyEtxAfterEIP155(), callHtsSystemContractTest())
7293
.toList();
7394
}
7495

@@ -166,6 +187,64 @@ HapiSpec legacyEtxAfterEIP155() {
166187
resetToDefault(CHAIN_ID_PROP));
167188
}
168189

190+
@HapiTest
191+
final HapiSpec callHtsSystemContractTest() {
192+
final var callHtsSystemContractTxn = "callHtsSystemContractTxn";
193+
final var function = getABIFor(FUNCTION, "transferToken", "IHederaTokenService");
194+
final var HTS_SYSTEM_CONTRACT = "hts";
195+
final var HTS_SYSTEM_CONTRACT_ADDRESS = "0000000000000000000000000000000000000167";
196+
197+
return propertyPreservingHapiSpec("callHtsSystemContractTest")
198+
.preserving(EVM_VERSION_PROPERTY, DYNAMIC_EVM_PROPERTY, ALLOW_CALLS_TO_NON_CONTRACT_ACCOUNTS)
199+
.given(
200+
overriding(DYNAMIC_EVM_PROPERTY, "true"),
201+
overriding(EVM_VERSION_PROPERTY, EVM_VERSION_046),
202+
overriding(ALLOW_CALLS_TO_NON_CONTRACT_ACCOUNTS, "true"),
203+
newKeyNamed(SECP_256K1_SOURCE_KEY).shape(SECP_256K1_SHAPE),
204+
newKeyNamed(SUPPLY_KEY),
205+
cryptoTransfer(tinyBarsFromAccountToAlias(GENESIS, SECP_256K1_SOURCE_KEY, ONE_HUNDRED_HBARS)),
206+
cryptoCreate(RELAYER).balance(6 * ONE_MILLION_HBARS),
207+
cryptoCreate(ACCOUNT).balance(6 * ONE_MILLION_HBARS),
208+
cryptoCreate(TOKEN_TREASURY),
209+
cryptoCreate(RECEIVER),
210+
tokenCreate(VANILLA_TOKEN)
211+
.tokenType(FUNGIBLE_COMMON)
212+
.treasury(TOKEN_TREASURY)
213+
.supplyKey(SUPPLY_KEY)
214+
.initialSupply(1_000),
215+
tokenAssociate(ACCOUNT, VANILLA_TOKEN),
216+
tokenAssociate(RECEIVER, VANILLA_TOKEN),
217+
cryptoTransfer(moving(500, VANILLA_TOKEN).between(TOKEN_TREASURY, ACCOUNT)))
218+
.when(withOpContext((spec, opLog) -> {
219+
final var receiver1 =
220+
asHeadlongAddress(asAddress(spec.registry().getAccountID(RECEIVER)));
221+
final var sender =
222+
asHeadlongAddress(asAddress(spec.registry().getAccountID(ACCOUNT)));
223+
224+
spec.registry()
225+
.saveContractId(
226+
HTS_SYSTEM_CONTRACT,
227+
asContractIdWithEvmAddress(
228+
ByteString.copyFrom(unhex(HTS_SYSTEM_CONTRACT_ADDRESS))));
229+
allRunFor(
230+
spec,
231+
ethereumCallWithFunctionAbi(
232+
false,
233+
HTS_SYSTEM_CONTRACT,
234+
function,
235+
HapiParserUtil.asHeadlongAddress(
236+
asAddress(spec.registry().getTokenID(VANILLA_TOKEN))),
237+
sender,
238+
receiver1,
239+
1L)
240+
.payingWith(RELAYER)
241+
.type(EthTransactionType.EIP1559)
242+
.via(callHtsSystemContractTxn)
243+
.hasKnownStatus(SUCCESS));
244+
}))
245+
.then();
246+
}
247+
169248
@Override
170249
protected Logger getResultsLogger() {
171250
return log;

hedera-node/test-clients/src/main/resource/contract/contracts/IHederaTokenService/IHederaTokenService.bin

Whitespace-only changes.

hedera-node/test-clients/src/main/resource/contract/contracts/IHederaTokenService/IHederaTokenService.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)