Skip to content

Commit 57b2b54

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

6 files changed

Lines changed: 182 additions & 2 deletions

File tree

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ jobs:
180180
with:
181181
installMirrorNode: true
182182
hieroVersion: v0.65.0
183-
mirrorNodeVersion: v0.136.1
183+
mirrorNodeVersion: v0.138.0
184184

185185
- name: Build SDK
186186
run: ./gradlew assemble
@@ -239,7 +239,7 @@ jobs:
239239
with:
240240
installMirrorNode: true
241241
hieroVersion: v0.65.0
242-
mirrorNodeVersion: v0.136.1
242+
mirrorNodeVersion: v0.138.0
243243

244244
- name: Build SDK
245245
run: ./gradlew assemble

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,9 @@ public long getGas() {
252252
*/
253253
public ContractCreateTransaction setGas(long gas) {
254254
requireNotFrozen();
255+
if (gas < 0) {
256+
throw new IllegalArgumentException("Gas must be non-negative");
257+
}
255258
this.gas = gas;
256259
return this;
257260
}

sdk/src/test/java/com/hedera/hashgraph/sdk/ContractCreateTransactionTest.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.hedera.hashgraph.sdk.proto.ContractCreateTransactionBody;
78
import com.hedera.hashgraph.sdk.proto.SchedulableTransactionBody;
@@ -108,4 +109,22 @@ void fromScheduledTransaction() {
108109

109110
assertThat(tx).isInstanceOf(ContractCreateTransaction.class);
110111
}
112+
113+
@Test
114+
void setGasShouldRejectNegativeValues() {
115+
var tx = new ContractCreateTransaction();
116+
var ex = assertThrows(IllegalArgumentException.class, () -> tx.setGas(-1));
117+
assertThat(ex.getMessage()).isEqualTo("Gas must be non-negative");
118+
}
119+
120+
@Test
121+
void setGasShouldAcceptZeroAndPositiveValues() {
122+
var tx = new ContractCreateTransaction();
123+
124+
tx.setGas(0);
125+
assertThat(tx.getGas()).isEqualTo(0);
126+
127+
tx.setGas(123456);
128+
assertThat(tx.getGas()).isEqualTo(123456);
129+
}
111130
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
package com.hedera.hashgraph.tck.methods.sdk;
3+
4+
import com.google.protobuf.InvalidProtocolBufferException;
5+
import com.hedera.hashgraph.sdk.*;
6+
import com.hedera.hashgraph.tck.annotation.JSONRPC2Method;
7+
import com.hedera.hashgraph.tck.annotation.JSONRPC2Service;
8+
import com.hedera.hashgraph.tck.methods.AbstractJSONRPC2Service;
9+
import com.hedera.hashgraph.tck.methods.sdk.param.contract.CreateContractParams;
10+
import com.hedera.hashgraph.tck.methods.sdk.response.ContractResponse;
11+
import com.hedera.hashgraph.tck.util.KeyUtils;
12+
import java.time.Duration;
13+
import org.bouncycastle.util.encoders.Hex;
14+
15+
@JSONRPC2Service
16+
public class ContractService extends AbstractJSONRPC2Service {
17+
private static final Duration DEFAULT_GRPC_DEADLINE = Duration.ofSeconds(10L);
18+
private final SdkService sdkService;
19+
20+
public ContractService(SdkService sdkService) {
21+
this.sdkService = sdkService;
22+
}
23+
24+
@JSONRPC2Method("createContract")
25+
public ContractResponse createContract(final CreateContractParams params) throws Exception {
26+
ContractCreateTransaction transaction = new ContractCreateTransaction().setGrpcDeadline(DEFAULT_GRPC_DEADLINE);
27+
28+
params.getAdminKey().ifPresent(key -> {
29+
try {
30+
transaction.setAdminKey(KeyUtils.getKeyFromString(key));
31+
} catch (InvalidProtocolBufferException e) {
32+
throw new IllegalArgumentException(e);
33+
}
34+
});
35+
36+
params.getAutoRenewPeriod()
37+
.ifPresent(periodStr -> transaction.setAutoRenewPeriod(Duration.ofSeconds(Long.parseLong(periodStr))));
38+
39+
params.getGas().ifPresent(gasStr -> transaction.setGas(Long.parseLong(gasStr)));
40+
41+
params.getAutoRenewAccountId()
42+
.ifPresent(accountIdStr -> transaction.setAutoRenewAccountId(AccountId.fromString(accountIdStr)));
43+
44+
params.getInitialBalance()
45+
.ifPresent(balanceStr -> transaction.setInitialBalance(Hbar.fromTinybars(Long.parseLong(balanceStr))));
46+
47+
params.getInitcode().ifPresent(hex -> transaction.setBytecode(Hex.decode(hex)));
48+
49+
params.getBytecodeFileId().ifPresent(fileIdStr -> transaction.setBytecodeFileId(FileId.fromString(fileIdStr)));
50+
51+
params.getStakedAccountId()
52+
.ifPresent(accountIdStr -> transaction.setStakedAccountId(AccountId.fromString(accountIdStr)));
53+
54+
params.getStakedNodeId().ifPresent(nodeIdStr -> transaction.setStakedNodeId(Long.parseLong(nodeIdStr)));
55+
56+
params.getDeclineStakingReward().ifPresent(transaction::setDeclineStakingReward);
57+
58+
params.getMemo().ifPresent(transaction::setContractMemo);
59+
60+
params.getMaxAutomaticTokenAssociations()
61+
.ifPresent(maxAuto -> transaction.setMaxAutomaticTokenAssociations(maxAuto.intValue()));
62+
63+
params.getConstructorParameters().ifPresent(hex -> transaction.setConstructorParameters(Hex.decode(hex)));
64+
65+
params.getCommonTransactionParams()
66+
.ifPresent(common -> common.fillOutTransaction(transaction, sdkService.getClient()));
67+
68+
TransactionReceipt receipt = transaction.execute(sdkService.getClient()).getReceipt(sdkService.getClient());
69+
70+
String contractId = "";
71+
if (receipt.status == Status.SUCCESS && receipt.contractId != null) {
72+
contractId = receipt.contractId.toString();
73+
}
74+
75+
return new ContractResponse(contractId, receipt.status);
76+
}
77+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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+
* CreateContractParams for contract create method
15+
*/
16+
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
17+
@Getter
18+
@AllArgsConstructor
19+
@NoArgsConstructor
20+
public class CreateContractParams extends JSONRPC2Param {
21+
private Optional<String> adminKey;
22+
private Optional<String> autoRenewPeriod;
23+
private Optional<String> autoRenewAccountId;
24+
private Optional<String> initialBalance;
25+
private Optional<String> bytecodeFileId;
26+
private Optional<String> initcode; // hex string
27+
private Optional<String> stakedAccountId;
28+
private Optional<String> stakedNodeId;
29+
private Optional<String> gas;
30+
private Optional<Boolean> declineStakingReward;
31+
private Optional<String> memo;
32+
private Optional<Long> maxAutomaticTokenAssociations;
33+
private Optional<String> constructorParameters; // hex string
34+
private Optional<CommonTransactionParams> commonTransactionParams;
35+
36+
@Override
37+
public CreateContractParams parse(Map<String, Object> jrpcParams) throws Exception {
38+
var parsedAdminKey = Optional.ofNullable((String) jrpcParams.get("adminKey"));
39+
var parsedAutoRenewPeriod = Optional.ofNullable((String) jrpcParams.get("autoRenewPeriod"));
40+
var parsedAutoRenewAccountId = Optional.ofNullable((String) jrpcParams.get("autoRenewAccountId"));
41+
var parsedInitialBalance = Optional.ofNullable((String) jrpcParams.get("initialBalance"));
42+
var parsedBytecodeFileId = Optional.ofNullable((String) jrpcParams.get("bytecodeFileId"));
43+
var parsedInitcode = Optional.ofNullable((String) jrpcParams.get("initcode"));
44+
var parsedStakedAccountId = Optional.ofNullable((String) jrpcParams.get("stakedAccountId"));
45+
var parsedStakedNodeId = Optional.ofNullable((String) jrpcParams.get("stakedNodeId"));
46+
var parsedGas = Optional.ofNullable((String) jrpcParams.get("gas"));
47+
var parsedDeclineStakingReward = Optional.ofNullable((Boolean) jrpcParams.get("declineStakingReward"));
48+
var parsedMemo = Optional.ofNullable((String) jrpcParams.get("memo"));
49+
var parsedMaxAutomaticTokenAssociations =
50+
Optional.ofNullable((Long) jrpcParams.get("maxAutomaticTokenAssociations"));
51+
var parsedConstructorParameters = Optional.ofNullable((String) jrpcParams.get("constructorParameters"));
52+
var parsedCommonTransactionParams = JSONRPCParamParser.parseCommonTransactionParams(jrpcParams);
53+
54+
return new CreateContractParams(
55+
parsedAdminKey,
56+
parsedAutoRenewPeriod,
57+
parsedAutoRenewAccountId,
58+
parsedInitialBalance,
59+
parsedBytecodeFileId,
60+
parsedInitcode,
61+
parsedStakedAccountId,
62+
parsedStakedNodeId,
63+
parsedGas,
64+
parsedDeclineStakingReward,
65+
parsedMemo,
66+
parsedMaxAutomaticTokenAssociations,
67+
parsedConstructorParameters,
68+
parsedCommonTransactionParams);
69+
}
70+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
package com.hedera.hashgraph.tck.methods.sdk.response;
3+
4+
import com.hedera.hashgraph.sdk.Status;
5+
import lombok.Data;
6+
7+
@Data
8+
public class ContractResponse {
9+
private final String contractId;
10+
private final Status status;
11+
}

0 commit comments

Comments
 (0)