All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hedera.hashgraph.sdk.TransactionResponse Maven / Gradle / Ivy

The newest version!
/*-
 *
 * Hedera Java SDK
 *
 * Copyright (C) 2020 - 2024 Hedera Hashgraph, LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package com.hedera.hashgraph.sdk;

import com.google.common.base.MoreObjects;
import java.time.Duration;
import java.util.Collections;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeoutException;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import javax.annotation.Nullable;
import org.bouncycastle.util.encoders.Hex;

/**
 * When the client sends the node a transaction of any kind, the node
 * replies with this, which simply says that the transaction passed
 * the pre-check (so the node will submit it to the network) or it failed
 * (so it won't). To learn the consensus result, the client should later
 * obtain a receipt (free), or can buy a more detailed record (not free).
 * 
* See Hedera Documentation */ public final class TransactionResponse { /** * The node ID */ public final AccountId nodeId; /** * The transaction hash */ public final byte[] transactionHash; /** * The transaction ID */ public final TransactionId transactionId; /** * The scheduled transaction ID */ @Nullable @Deprecated public final TransactionId scheduledTransactionId; private boolean validateStatus = true; /** * Constructor. * * @param nodeId the node id * @param transactionId the transaction id * @param transactionHash the transaction hash * @param scheduledTransactionId the scheduled transaction id */ TransactionResponse( AccountId nodeId, TransactionId transactionId, byte[] transactionHash, @Nullable TransactionId scheduledTransactionId ) { this.nodeId = nodeId; this.transactionId = transactionId; this.transactionHash = transactionHash; this.scheduledTransactionId = scheduledTransactionId; } /** * * @return whether getReceipt() or getRecord() will throw an exception if the receipt status is not SUCCESS */ public boolean getValidateStatus() { return validateStatus; } /** * * @param validateStatus whether getReceipt() or getRecord() will throw an exception if the receipt status is not SUCCESS * @return {@code this} */ public TransactionResponse setValidateStatus(boolean validateStatus) { this.validateStatus = validateStatus; return this; } /** * Fetch the receipt of the transaction. * * @param client The client with which this will be executed. * @return the transaction receipt * @throws TimeoutException when the transaction times out * @throws PrecheckStatusException when the precheck fails * @throws ReceiptStatusException when there is an issue with the receipt */ public TransactionReceipt getReceipt(Client client) throws TimeoutException, PrecheckStatusException, ReceiptStatusException { return getReceipt(client, client.getRequestTimeout()); } /** * Fetch the receipt of the transaction. * * @param client The client with which this will be executed. * @param timeout The timeout after which the execution attempt will be cancelled. * @return the transaction receipt * @throws TimeoutException when the transaction times out * @throws PrecheckStatusException when the precheck fails * @throws ReceiptStatusException when there is an issue with the receipt */ public TransactionReceipt getReceipt(Client client, Duration timeout) throws TimeoutException, PrecheckStatusException, ReceiptStatusException { var receipt = getReceiptQuery() .execute(client, timeout) .validateStatus(validateStatus); return receipt; } /** * Create receipt query from the {@link #transactionId} and {@link #transactionHash} * * @return {@link com.hedera.hashgraph.sdk.TransactionReceiptQuery} */ public TransactionReceiptQuery getReceiptQuery() { return new TransactionReceiptQuery() .setTransactionId(transactionId) .setNodeAccountIds(Collections.singletonList(nodeId)); } /** * Fetch the receipt of the transaction asynchronously. * * @param client The client with which this will be executed. * @return future result of the transaction receipt */ public CompletableFuture getReceiptAsync(Client client) { return getReceiptAsync(client, client.getRequestTimeout()); } /** * Fetch the receipt of the transaction asynchronously. * * @param client The client with which this will be executed. * @param timeout The timeout after which the execution attempt will be cancelled. * @return the transaction receipt */ public CompletableFuture getReceiptAsync(Client client, Duration timeout) { return getReceiptQuery() .executeAsync(client, timeout) .thenCompose(receipt -> { try { return CompletableFuture.completedFuture(receipt.validateStatus(validateStatus)); } catch (ReceiptStatusException e) { return CompletableFuture.failedFuture(e); } }); } /** * Fetch the receipt of the transaction asynchronously. * * @param client The client with which this will be executed. * @param callback a BiConsumer which handles the result or error. */ public void getReceiptAsync(Client client, BiConsumer callback) { ConsumerHelper.biConsumer(getReceiptAsync(client), callback); } /** * Fetch the receipt of the transaction asynchronously. * * @param client The client with which this will be executed. * @param timeout The timeout after which the execution attempt will be cancelled. * @param callback a BiConsumer which handles the result or error. */ public void getReceiptAsync(Client client, Duration timeout, BiConsumer callback) { ConsumerHelper.biConsumer(getReceiptAsync(client, timeout), callback); } /** * Fetch the receipt of the transaction asynchronously. * * @param client The client with which this will be executed. * @param onSuccess a Consumer which consumes the result on success. * @param onFailure a Consumer which consumes the error on failure. */ public void getReceiptAsync(Client client, Consumer onSuccess, Consumer onFailure) { ConsumerHelper.twoConsumers(getReceiptAsync(client), onSuccess, onFailure); } /** * Fetch the receipt of the transaction asynchronously. * * @param client The client with which this will be executed. * @param timeout The timeout after which the execution attempt will be cancelled. * @param onSuccess a Consumer which consumes the result on success. * @param onFailure a Consumer which consumes the error on failure. */ public void getReceiptAsync(Client client, Duration timeout, Consumer onSuccess, Consumer onFailure) { ConsumerHelper.twoConsumers(getReceiptAsync(client, timeout), onSuccess, onFailure); } /** * Fetch the record of the transaction. * * @param client The client with which this will be executed. * @return the transaction record * @throws TimeoutException when the transaction times out * @throws PrecheckStatusException when the precheck fails * @throws ReceiptStatusException when there is an issue with the receipt */ public TransactionRecord getRecord(Client client) throws TimeoutException, PrecheckStatusException, ReceiptStatusException { return getRecord(client, client.getRequestTimeout()); } /** * Fetch the record of the transaction. * * @param client The client with which this will be executed. * @param timeout The timeout after which the execution attempt will be cancelled. * @return the transaction record * @throws TimeoutException when the transaction times out * @throws PrecheckStatusException when the precheck fails * @throws ReceiptStatusException when there is an issue with the receipt */ public TransactionRecord getRecord(Client client, Duration timeout) throws TimeoutException, PrecheckStatusException, ReceiptStatusException { getReceipt(client, timeout); return getRecordQuery().execute(client, timeout); } /** * Create record query from the {@link #transactionId} and {@link #transactionHash} * * @return {@link com.hedera.hashgraph.sdk.TransactionRecordQuery} */ public TransactionRecordQuery getRecordQuery() { return new TransactionRecordQuery() .setTransactionId(transactionId) .setNodeAccountIds(Collections.singletonList(nodeId)); } /** * Fetch the record of the transaction asynchronously. * * @param client The client with which this will be executed. * @return future result of the transaction record */ public CompletableFuture getRecordAsync(Client client) { return getRecordAsync(client, client.getRequestTimeout()); } /** * Fetch the record of the transaction asynchronously. * * @param client The client with which this will be executed. * @param timeout The timeout after which the execution attempt will be cancelled. * @return future result of the transaction record */ public CompletableFuture getRecordAsync(Client client, Duration timeout) { return getReceiptAsync(client, timeout).thenCompose((receipt) -> getRecordQuery().executeAsync(client, timeout)); } /** * Fetch the record of the transaction asynchronously. * * @param client The client with which this will be executed. * @param callback a BiConsumer which handles the result or error. */ public void getRecordAsync(Client client, BiConsumer callback) { ConsumerHelper.biConsumer(getRecordAsync(client), callback); } /** * Fetch the record of the transaction asynchronously. * * @param client The client with which this will be executed. * @param timeout The timeout after which the execution attempt will be cancelled. * @param callback a BiConsumer which handles the result or error. */ public void getRecordAsync(Client client, Duration timeout, BiConsumer callback) { ConsumerHelper.biConsumer(getRecordAsync(client, timeout), callback); } /** * Fetch the record of the transaction asynchronously. * * @param client The client with which this will be executed. * @param onSuccess a Consumer which consumes the result on success. * @param onFailure a Consumer which consumes the error on failure. */ public void getRecordAsync(Client client, Consumer onSuccess, Consumer onFailure) { ConsumerHelper.twoConsumers(getRecordAsync(client), onSuccess, onFailure); } /** * Fetch the record of the transaction asynchronously. * * @param client The client with which this will be executed. * @param timeout The timeout after which the execution attempt will be cancelled. * @param onSuccess a Consumer which consumes the result on success. * @param onFailure a Consumer which consumes the error on failure. */ public void getRecordAsync(Client client, Duration timeout, Consumer onSuccess, Consumer onFailure) { ConsumerHelper.twoConsumers(getRecordAsync(client, timeout), onSuccess, onFailure); } @Override public String toString() { return MoreObjects.toStringHelper(this) .add("nodeId", nodeId) .add("transactionHash", Hex.toHexString(transactionHash)) .add("transactionId", transactionId) .toString(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy