Skip to content

Commit aef471d

Browse files
authored
feat(TCK): endpoint for ContractExecute (#2476)
Signed-off-by: emiliyank <e.kadiyski@gmail.com>
1 parent 57b2b54 commit aef471d

4 files changed

Lines changed: 87 additions & 0 deletions

File tree

sdk/src/main/java/com/hedera/hashgraph/sdk/ContractExecuteTransaction.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ public long getGas() {
109109
*/
110110
public ContractExecuteTransaction setGas(long gas) {
111111
requireNotFrozen();
112+
if (gas < 0) {
113+
throw new IllegalArgumentException("Gas must be non-negative");
114+
}
112115
this.gas = gas;
113116
return this;
114117
}

sdk/src/test/java/com/hedera/hashgraph/sdk/ContractExecuteTransactionTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package com.hedera.hashgraph.sdk;
33

44
import static org.assertj.core.api.Assertions.assertThat;
5+
import static org.junit.jupiter.api.Assertions.assertThrows;
56

67
import com.google.protobuf.ByteString;
78
import com.hedera.hashgraph.sdk.proto.ContractCallTransactionBody;
@@ -71,4 +72,22 @@ void fromScheduledTransaction() {
7172

7273
assertThat(tx).isInstanceOf(ContractExecuteTransaction.class);
7374
}
75+
76+
@Test
77+
void setGasShouldRejectNegativeValues() {
78+
var tx = new ContractExecuteTransaction();
79+
var ex = assertThrows(IllegalArgumentException.class, () -> tx.setGas(-1));
80+
assertThat(ex.getMessage()).isEqualTo("Gas must be non-negative");
81+
}
82+
83+
@Test
84+
void setGasShouldAcceptZeroAndPositiveValues() {
85+
var tx = new ContractExecuteTransaction();
86+
87+
tx.setGas(0);
88+
assertThat(tx.getGas()).isEqualTo(0);
89+
90+
tx.setGas(123456);
91+
assertThat(tx.getGas()).isEqualTo(123456);
92+
}
7493
}

tck/src/main/java/com/hedera/hashgraph/tck/methods/sdk/ContractService.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
// SPDX-License-Identifier: Apache-2.0
22
package com.hedera.hashgraph.tck.methods.sdk;
33

4+
import com.google.protobuf.ByteString;
45
import com.google.protobuf.InvalidProtocolBufferException;
56
import com.hedera.hashgraph.sdk.*;
67
import com.hedera.hashgraph.tck.annotation.JSONRPC2Method;
78
import com.hedera.hashgraph.tck.annotation.JSONRPC2Service;
89
import com.hedera.hashgraph.tck.methods.AbstractJSONRPC2Service;
910
import com.hedera.hashgraph.tck.methods.sdk.param.contract.CreateContractParams;
11+
import com.hedera.hashgraph.tck.methods.sdk.param.contract.ExecuteContractParams;
1012
import com.hedera.hashgraph.tck.methods.sdk.response.ContractResponse;
1113
import com.hedera.hashgraph.tck.util.KeyUtils;
1214
import java.time.Duration;
@@ -74,4 +76,29 @@ public ContractResponse createContract(final CreateContractParams params) throws
7476

7577
return new ContractResponse(contractId, receipt.status);
7678
}
79+
80+
@JSONRPC2Method("executeContract")
81+
public ContractResponse executeContract(final ExecuteContractParams params) throws Exception {
82+
ContractExecuteTransaction transaction =
83+
new ContractExecuteTransaction().setGrpcDeadline(DEFAULT_GRPC_DEADLINE);
84+
85+
if (params.getContractId() != null) {
86+
transaction.setContractId(ContractId.fromString(params.getContractId()));
87+
}
88+
89+
params.getGas().ifPresent(gasStr -> transaction.setGas(Long.parseLong(gasStr)));
90+
91+
params.getAmount()
92+
.ifPresent(amountStr -> transaction.setPayableAmount(Hbar.fromTinybars(Long.parseLong(amountStr))));
93+
94+
params.getFunctionParameters()
95+
.ifPresent(hex -> transaction.setFunctionParameters(ByteString.copyFrom(Hex.decode(hex))));
96+
97+
params.getCommonTransactionParams()
98+
.ifPresent(common -> common.fillOutTransaction(transaction, sdkService.getClient()));
99+
100+
TransactionReceipt receipt = transaction.execute(sdkService.getClient()).getReceipt(sdkService.getClient());
101+
102+
return new ContractResponse("", receipt.status);
103+
}
77104
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
package com.hedera.hashgraph.tck.methods.sdk.param.contract;
3+
4+
import com.hedera.hashgraph.tck.methods.JSONRPC2Param;
5+
import com.hedera.hashgraph.tck.methods.sdk.param.CommonTransactionParams;
6+
import com.hedera.hashgraph.tck.util.JSONRPCParamParser;
7+
import java.util.Map;
8+
import java.util.Optional;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Getter;
11+
import lombok.NoArgsConstructor;
12+
13+
/**
14+
* ExecuteContractParams for contract execute method
15+
*/
16+
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
17+
@Getter
18+
@AllArgsConstructor
19+
@NoArgsConstructor
20+
public class ExecuteContractParams extends JSONRPC2Param {
21+
private String contractId;
22+
private Optional<String> gas;
23+
private Optional<String> amount;
24+
private Optional<String> functionParameters; // hex string
25+
private Optional<CommonTransactionParams> commonTransactionParams;
26+
27+
@Override
28+
public ExecuteContractParams parse(Map<String, Object> jrpcParams) throws Exception {
29+
var parsedContractId = (String) jrpcParams.get("contractId");
30+
var parsedGas = Optional.ofNullable((String) jrpcParams.get("gas"));
31+
var parsedAmount = Optional.ofNullable((String) jrpcParams.get("amount"));
32+
var parsedFunctionParameters = Optional.ofNullable((String) jrpcParams.get("functionParameters"));
33+
var parsedCommonTransactionParams = JSONRPCParamParser.parseCommonTransactionParams(jrpcParams);
34+
35+
return new ExecuteContractParams(
36+
parsedContractId, parsedGas, parsedAmount, parsedFunctionParameters, parsedCommonTransactionParams);
37+
}
38+
}

0 commit comments

Comments
 (0)