Skip to content

Commit

Permalink
call with result
Browse files Browse the repository at this point in the history
  • Loading branch information
hendrikebbers committed Jun 24, 2024
1 parent d5521c1 commit 992739e
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.openelements.spring.hedera.api.protocol;

import com.hedera.hashgraph.sdk.ContractFunctionResult;
import com.hedera.hashgraph.sdk.ContractId;
import com.hedera.hashgraph.sdk.Status;
import com.hedera.hashgraph.sdk.TransactionId;

public record ContractCallResult(TransactionId transactionId, Status status) implements TransactionResult {
public record ContractCallResult(TransactionId transactionId, Status status, ContractFunctionResult contractFunctionResult) implements TransactionResult {

}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public HederaAutoConfiguration(final HederaProperties properties) {
throw new IllegalArgumentException("Can not parse 'spring.hedera.accountId' property", e);
}
try {
System.out.println("privateKey: '" + properties.getPrivateKey() + "'");
privateKey = PrivateKey.fromString(properties.getPrivateKey());
} catch (Exception e) {
throw new IllegalArgumentException("Can not parse 'spring.hedera.privateKey' property", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.hedera.hashgraph.sdk.ContractCreateTransaction;
import com.hedera.hashgraph.sdk.ContractExecuteTransaction;
import com.hedera.hashgraph.sdk.ContractFunctionParameters;
import com.hedera.hashgraph.sdk.ContractFunctionResult;
import com.hedera.hashgraph.sdk.ContractId;
import com.hedera.hashgraph.sdk.FileAppendTransaction;
import com.hedera.hashgraph.sdk.FileContentsQuery;
Expand All @@ -16,6 +17,7 @@
import com.hedera.hashgraph.sdk.Query;
import com.hedera.hashgraph.sdk.Transaction;
import com.hedera.hashgraph.sdk.TransactionReceipt;
import com.hedera.hashgraph.sdk.TransactionRecord;
import com.hedera.hashgraph.sdk.TransactionResponse;
import com.openelements.spring.hedera.api.HederaClient;
import com.openelements.spring.hedera.api.HederaException;
Expand Down Expand Up @@ -133,15 +135,15 @@ public AccountBalanceResponse executeAccountBalanceQuery(AccountBalanceRequest r
final AccountBalanceQuery query = new AccountBalanceQuery().setAccountId(request.accountId())
.setQueryPayment(request.queryPayment())
.setMaxQueryPayment(request.maxQueryPayment());
final AccountBalance balance = execute(query);
final AccountBalance balance = executeQueryAndWait(query);
return new AccountBalanceResponse(balance.hbars);
}

public FileContentsResponse executeFileContentsQuery(FileContentsRequest request) throws HederaException {
final FileContentsQuery query = new FileContentsQuery().setFileId(request.fileId())
.setQueryPayment(request.queryPayment())
.setMaxQueryPayment(request.maxQueryPayment());
final ByteString byteString = execute(query);
final ByteString byteString = executeQueryAndWait(query);
final byte[] bytes = byteString.toByteArray();
return new FileContentsResponse(bytes);
}
Expand All @@ -155,7 +157,7 @@ public FileCreateResult executeFileCreateTransaction(FileCreateRequest request)
.setTransactionMemo(request.fileMemo())
.setKeys(Objects.requireNonNull(client.getOperatorPublicKey()));

final TransactionReceipt receipt = execute(transaction);
final TransactionReceipt receipt = executeTransactionAndWaitOnReceipt(transaction);
return new FileCreateResult(receipt.transactionId, receipt.status, receipt.fileId);
}

Expand All @@ -168,7 +170,7 @@ public FileAppendResult executeFileAppendRequestTransaction(FileAppendRequest re
.setTransactionValidDuration(request.transactionValidDuration())
.setTransactionMemo(request.fileMemo());

final TransactionReceipt receipt = execute(transaction);
final TransactionReceipt receipt = executeTransactionAndWaitOnReceipt(transaction);
return new FileAppendResult(receipt.transactionId, receipt.status, receipt.fileId);
}

Expand All @@ -178,7 +180,7 @@ public FileDeleteResult executeFileDeleteTransaction(FileDeleteRequest request)
.setFileId(request.fileId())
.setMaxTransactionFee(request.maxTransactionFee())
.setTransactionValidDuration(request.transactionValidDuration());
final TransactionReceipt receipt = execute(transaction);
final TransactionReceipt receipt = executeTransactionAndWaitOnReceipt(transaction);
return FileDeleteResult.create(receipt.transactionId);
}

Expand All @@ -191,7 +193,7 @@ public ContractCreateResult executeContractCreateTransaction(ContractCreateReque
.setGas(DEFAULT_GAS)
.setTransactionValidDuration(request.transactionValidDuration())
.setConstructorParameters(constructorParams);
final TransactionReceipt receipt = execute(transaction);
final TransactionReceipt receipt = executeTransactionAndWaitOnReceipt(transaction);
return new ContractCreateResult(receipt.transactionId, receipt.status, receipt.contractId);
}

Expand All @@ -204,8 +206,8 @@ public ContractCallResult executeContractCallTransaction(ContractCallRequest req
.setMaxTransactionFee(request.maxTransactionFee())
.setGas(DEFAULT_GAS)
.setTransactionValidDuration(request.transactionValidDuration());
final TransactionReceipt receipt = execute(transaction);
return new ContractCallResult(receipt.transactionId, receipt.status);
final TransactionRecord record = executeTransactionAndWaitOnRecord(transaction);
return new ContractCallResult(record.transactionId, record.receipt.status, record.contractFunctionResult);
}

private ContractFunctionParameters createParameters(List<ContractParam<?>> params) {
Expand All @@ -216,7 +218,7 @@ private ContractFunctionParameters createParameters(List<ContractParam<?>> param
return constructorParams;
}

private <T extends Transaction<T>, R> TransactionReceipt execute(T transaction) throws HederaException {
private <T extends Transaction<T>> TransactionReceipt executeTransactionAndWaitOnReceipt(T transaction) throws HederaException {
try {
log.debug("Sending transaction of type {}", transaction.getClass().getSimpleName());
final TransactionResponse response = transaction.execute(client);
Expand All @@ -231,7 +233,22 @@ private <T extends Transaction<T>, R> TransactionReceipt execute(T transaction)
}
}

private <R, Q extends Query<R, Q>> R execute(Q query) throws HederaException {
private <T extends Transaction<T>> TransactionRecord executeTransactionAndWaitOnRecord(T transaction) throws HederaException {
try {
log.debug("Sending transaction of type {}", transaction.getClass().getSimpleName());
final TransactionResponse response = transaction.execute(client);
try {
log.debug("Waiting for receipt of transaction '{}' of type {}", response.transactionId, transaction.getClass().getSimpleName());
return response.getRecord(client);
} catch (Exception e) {
throw new HederaException("Failed to receive record of transaction '" + response.transactionId + "' of type " + transaction.getClass(), e);
}
} catch (Exception e) {
throw new HederaException("Failed to execute transaction of type " + transaction.getClass().getSimpleName(), e);
}
}

private <R, Q extends Query<R, Q>> R executeQueryAndWait(Q query) throws HederaException {
try {
log.debug("Sending query of type {}", query.getClass().getSimpleName());
return query.execute(client);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

public enum HederaNetwork {

PREVIEWNET("previewnet", 297, "https://previewnet.hashio.io/api"),
TESTNET("testnet", 296, "https://testnet.hashio.io/api"),
MAINNET("mainnet", 295, "https://mainnet.hashio.io/api");
PREVIEWNET("previewnet", 297, "https://previewnet.mirrornode.hedera.com/", "https://previewnet.hashio.io/api"),
TESTNET("testnet", 296, "https://testnet.mirrornode.hedera.com/", "https://testnet.hashio.io/api"),
MAINNET("mainnet", 295, "https://mainnet.mirrornode.hedera.com/","https://mainnet.hashio.io/api");

/**
* See https://docs.web3j.io/4.8.7/smart_contracts/interacting_with_smart_contract/#specifying-the-chain-id-on-transactions-eip-155
Expand All @@ -22,9 +22,12 @@ public enum HederaNetwork {
*/
private final String name;

HederaNetwork(final String name, final long chainId, final String relayUrl) {
private final String mirrornodeEndpoint;

HederaNetwork(final String name, final long chainId, final String mirrornodeEndpoint, final String relayUrl) {
this.name = name;
this.chainId = chainId;
this.mirrornodeEndpoint = mirrornodeEndpoint;
this.relayUrl = relayUrl;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,6 @@ void testGetBalance() throws Exception {
Assertions.assertNotNull(accountBalanceResult);
Assertions.assertNotNull(accountBalanceResult.hbars());
Assertions.assertTrue(accountBalanceResult.hbars().toTinybars() > 0);
System.out.println("Balance: " + accountBalanceResult.hbars().toString() + " HBARs");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -139,5 +139,21 @@ void testCallFunctionWithParam() throws Exception {
Assertions.assertNotNull(result);
}

@Test
void testCallFunctionResult() throws Exception {
//given
final Path path = Path.of(ContractServiceTest.class.getResource("/uint_getter_setter_contract.bin").getPath());
final ContractId contract = hederaClient.createContract(path);
final ContractCallRequest setRequest = ContractCallRequest.of(contract, "set", int256(123));
final ContractCallResult setResult = hederaClient.executeContractCallTransaction(setRequest);
final ContractCallRequest getRequest = ContractCallRequest.of(contract, "get");

//when
final ContractCallResult getResult = hederaClient.executeContractCallTransaction(getRequest);

//then
Assertions.assertNotNull(getResult);
Assertions.assertEquals(BigInteger.valueOf(123), getResult.contractFunctionResult().getInt256(0));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ void testSimpleUpload() throws Exception {
//given
final byte[] contents = IntStream.range(0, 500).mapToObj(i -> "Hello, Hedera!")
.reduce((a, b) -> a + b)
.orElse("")
.get()
.getBytes();

//when
Expand Down
1 change: 1 addition & 0 deletions src/test/resources/small_contract.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
608060405234801561001057600080fd5b50610118806100206000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c8063b4598503146037578063fe17e8b7146070575b600080fd5b60408051808201909152600d81526c48656c6c6f2c20576f726c642160981b60208201525b604051606791906096565b60405180910390f35b60408051808201909152600b81526a48656c6c6f2c204f48472160a81b6020820152605c565b600060208083528351808285015260005b8181101560c15785810183015185820160400152820160a7565b506000604082860101526040601f19601f830116850101925050509291505056fea264697066735822122092e0b690eaa3de2581f4b757d0675c3bebfaba72b6d17ddb72855d915865693864736f6c63430008110033

0 comments on commit 992739e

Please sign in to comment.