com.hedera.hashgraph.sdk.TopicCreateTransaction Maven / Gradle / Ivy
Show all versions of sdk-full Show documentation
/*-
*
* 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.protobuf.InvalidProtocolBufferException;
import com.hedera.hashgraph.sdk.proto.ConsensusCreateTopicTransactionBody;
import com.hedera.hashgraph.sdk.proto.ConsensusServiceGrpc;
import com.hedera.hashgraph.sdk.proto.SchedulableTransactionBody;
import com.hedera.hashgraph.sdk.proto.TransactionBody;
import com.hedera.hashgraph.sdk.proto.TransactionResponse;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import io.grpc.MethodDescriptor;
import java.time.Duration;
import javax.annotation.Nullable;
import java.util.LinkedHashMap;
import java.util.Objects;
/**
* Create a topic to be used for consensus.
*
* If an autoRenewAccount is specified, that account must also sign this transaction.
*
* If an adminKey is specified, the adminKey must sign the transaction.
*
* On success, the resulting TransactionReceipt contains the newly created TopicId.
*
* See Hedera Documentation
* See Hedera Documentation
*/
public final class TopicCreateTransaction extends Transaction {
/**
* Optional account to be used at the topic's expirationTime to extend
* the life of the topic (once autoRenew functionality is supported by
* HAPI).
*
* The topic lifetime will be extended up to a maximum of the
* autoRenewPeriod or however long the topic can be extended using all
* funds on the account (whichever is the smaller duration/amount and
* if any extension is possible with the account's funds).
* If specified, there must be an adminKey and the autoRenewAccount
* must sign this transaction.
*/
@Nullable
private AccountId autoRenewAccountId = null;
/**
* The initial lifetime of the topic and the amount of time to attempt
* to extend the topic's lifetime by,automatically at the topic's
* expirationTime if the autoRenewAccount is configured (once autoRenew
* functionality is supported by HAPI). Limited to MIN_AUTORENEW_PERIOD
* and MAX_AUTORENEW_PERIOD value by server-side configuration.
* Required.
*/
@Nullable
private Duration autoRenewPeriod = null;
/**
* Short publicly visible memo about the topic.
*
* No guarantee of uniqueness.
*
* 100 bytes max.
*/
private String topicMemo = "";
/**
* Access control for updateTopic/deleteTopic. Anyone can increase the
* topic's expirationTime via ConsensusService.updateTopic(), regardless
* of the adminKey. If no adminKey is specified, updateTopic may only be
* used to extend the topic's expirationTime, and deleteTopic is disallowed.
*/
@Nullable
private Key adminKey = null;
/**
* Access control for submitMessage. If unspecified, no access control
* is performed on ConsensusService.submitMessage (all submissions are
* allowed).
*/
@Nullable
private Key submitKey = null;
/**
* Constructor.
*/
public TopicCreateTransaction() {
setAutoRenewPeriod(DEFAULT_AUTO_RENEW_PERIOD);
}
/**
* Constructor.
*
* @param txs Compound list of transaction id's list of (AccountId, Transaction)
* records
* @throws InvalidProtocolBufferException when there is an issue with the protobuf
*/
TopicCreateTransaction(LinkedHashMap> txs) throws InvalidProtocolBufferException {
super(txs);
initFromTransactionBody();
}
/**
* Constructor.
*
* @param txBody protobuf TransactionBody
*/
TopicCreateTransaction(com.hedera.hashgraph.sdk.proto.TransactionBody txBody) {
super(txBody);
initFromTransactionBody();
}
/**
* Extract the topic memo.
*
* @return the topic memo
*/
public String getTopicMemo() {
return topicMemo;
}
/**
* Set a short publicly visible memo on the new topic.
*
* @param memo The memo to be set
* @return {@code this}
*/
public TopicCreateTransaction setTopicMemo(String memo) {
Objects.requireNonNull(memo);
requireNotFrozen();
topicMemo = memo;
return this;
}
/**
* Extract the admin key.
*
* @return the admin key
*/
@Nullable
public Key getAdminKey() {
return adminKey;
}
/**
* Set the admin key for the new topic.
*
* Access control for updateTopic/deleteTopic.
*
* Anyone can increase the topic's expirationTime regardless of the adminKey.
* If no adminKey is specified, updateTopic may only be used to extend the topic's expirationTime, and deleteTopic
* is disallowed.
*
* @param adminKey The Key to be set
* @return {@code this}
*/
public TopicCreateTransaction setAdminKey(Key adminKey) {
Objects.requireNonNull(adminKey);
requireNotFrozen();
this.adminKey = adminKey;
return this;
}
/**
* Extract the submit key.
*
* @return the submit key
*/
@Nullable
public Key getSubmitKey() {
return submitKey;
}
/**
* Set the submit key for the new topic.
*
* Access control for submitMessage.
* If unspecified, no access control is performed on ConsensusService.submitMessage (all submissions are allowed).
*
* @param submitKey The Key to be set
* @return {@code this}
*/
public TopicCreateTransaction setSubmitKey(Key submitKey) {
Objects.requireNonNull(submitKey);
requireNotFrozen();
this.submitKey = submitKey;
return this;
}
/**
* Extract the auto renew period.
*
* @return the auto renew period
*/
@Nullable
@SuppressFBWarnings(
value = "EI_EXPOSE_REP",
justification = "A Duration can't actually be mutated"
)
public Duration getAutoRenewPeriod() {
return autoRenewPeriod;
}
/**
* Set the auto renew period for the new topic.
*
* The initial lifetime of the topic and the amount of time to attempt to extend the topic's lifetime by
* automatically at the topic's expirationTime, if the autoRenewAccount is configured (once autoRenew functionality
* is supported by HAPI).
*
* @param autoRenewPeriod The Duration to be set for auto renewal
* @return {@code this}
*/
@SuppressFBWarnings(
value = "EI_EXPOSE_REP2",
justification = "A Duration can't actually be mutated"
)
public TopicCreateTransaction setAutoRenewPeriod(Duration autoRenewPeriod) {
Objects.requireNonNull(autoRenewPeriod);
requireNotFrozen();
this.autoRenewPeriod = autoRenewPeriod;
return this;
}
/**
* Extract the auto renew account id.
*
* @return the auto renew account id
*/
@Nullable
public AccountId getAutoRenewAccountId() {
return autoRenewAccountId;
}
/**
* Set the ID of the auto renew account for the new topic.
*
* Optional account to be used at the topic's expirationTime to extend the life of the topic (once autoRenew
* functionality is supported by HAPI).
*
* The topic lifetime will be extended up to a maximum of the autoRenewPeriod or however long the topic
* can be extended using all funds on the account (whichever is the smaller duration/amount and if any extension
* is possible with the account's funds).
*
* If specified, there must be an adminKey and the autoRenewAccount must sign this transaction.
*
* @param autoRenewAccountId The AccountId to be set for auto renewal
* @return {@code this}
*/
public TopicCreateTransaction setAutoRenewAccountId(AccountId autoRenewAccountId) {
Objects.requireNonNull(autoRenewAccountId);
requireNotFrozen();
this.autoRenewAccountId = autoRenewAccountId;
return this;
}
/**
* Initialize from the transaction body.
*/
void initFromTransactionBody() {
var body = sourceTransactionBody.getConsensusCreateTopic();
if (body.hasAutoRenewAccount()) {
autoRenewAccountId = AccountId.fromProtobuf(body.getAutoRenewAccount());
}
if (body.hasAdminKey()) {
adminKey = Key.fromProtobufKey(body.getAdminKey());
}
if (body.hasSubmitKey()) {
submitKey = Key.fromProtobufKey(body.getSubmitKey());
}
if (body.hasAutoRenewPeriod()) {
autoRenewPeriod = DurationConverter.fromProtobuf(body.getAutoRenewPeriod());
}
topicMemo = body.getMemo();
}
/**
* Build the transaction body.
*
* @return {@link
* com.hedera.hashgraph.sdk.proto.ConsensusCreateTopicTransactionBody}
*/
ConsensusCreateTopicTransactionBody.Builder build() {
var builder = ConsensusCreateTopicTransactionBody.newBuilder();
if (autoRenewAccountId != null) {
builder.setAutoRenewAccount(autoRenewAccountId.toProtobuf());
}
if (adminKey != null) {
builder.setAdminKey(adminKey.toProtobufKey());
}
if (submitKey != null) {
builder.setSubmitKey(submitKey.toProtobufKey());
}
if (autoRenewPeriod != null) {
builder.setAutoRenewPeriod(DurationConverter.toProtobuf(autoRenewPeriod));
}
builder.setMemo(topicMemo);
return builder;
}
@Override
void validateChecksums(Client client) throws BadEntityIdException {
if (autoRenewAccountId != null) {
autoRenewAccountId.validateChecksum(client);
}
}
@Override
MethodDescriptor getMethodDescriptor() {
return ConsensusServiceGrpc.getCreateTopicMethod();
}
@Override
void onFreeze(TransactionBody.Builder bodyBuilder) {
bodyBuilder.setConsensusCreateTopic(build());
}
@Override
void onScheduled(SchedulableTransactionBody.Builder scheduled) {
scheduled.setConsensusCreateTopic(build());
}
}