> For the complete documentation index, see [llms.txt](https://abc.bharatblockchain.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://abc.bharatblockchain.io/hedera/tutorials/consensus-service/create-topic.md).

# Create Topic

To create your first topic, you will use the *<mark style="color:blue;">**`TopicCreateTransaction()`**</mark>*, set its properties, and submit it to the Hedera network. In this tutorial, you will create a **public topic** by not setting any properties on the topic. This means that anyone can send messages to your topic.

## Step 1 :  **Imports**

* The script imports necessary modules from the Hedera JavaScript SDK: `TopicCreateTransaction`, `Client`, and `PrivateKey`.
* It also imports the `dotenv` module to load environment variables from a `.env` file located in the `Consensus_Service` directory.

```javascript
const {
    TopicCreateTransaction,
    Client,
    PrivateKey
} = require("@hashgraph/sdk");
require('dotenv').config({ path: 'Consensus_Service/.env' });
```

## Step 2 : **Environment Variables Retrieval**

These lines retrieve environment variables such as `MY_ACCOUNT_ID` and `MY_PRIVATE_KEY` from the `.env` file using `process.env`.

```javascript
const myAccountId = process.env.MY_ACCOUNT_ID;
const myPrivateKey = PrivateKey.fromString(process.env.MY_PRIVATE_KEY);
```

## Step 3 : **Validation**

This block of code ensures that the required environment variables (`MY_ACCOUNT_ID` and `MY_PRIVATE_KEY`) are present. If not, it throws an error.

```javascript
if (myAccountId == null ||
    myPrivateKey == null ) {
    throw new Error("Environment variables myAccountId and myPrivateKey must be present");
}
```

## Step 4 :**Main Function**

* It creates a client instance for the Hedera testnet and sets the operator account using the user's account ID and private key.
* It creates a new `TopicCreateTransaction` object to create a new topic on the Hedera network.
* The transaction is executed, and the resulting transaction response (`txResponse`) is obtained.
* The receipt of the transaction is retrieved, and the new topic ID is extracted from it.
* The topic ID is logged to the console.
* There's a 5-second delay added using `setTimeout()` before exiting the process.

```javascript
async function main() {
    const client = Client.forTestnet(); // Create a client for the Hedera testnet
    client.setOperator(myAccountId, myPrivateKey); // Set the operator account for the client

    // Create a new topic
    let txResponse = await new TopicCreateTransaction().execute(client);

    // Get the receipt of the transaction
    let receipt = await txResponse.getReceipt(client);

    // Grab the new topic ID from the receipt
    let topicId = receipt.topicId;

    // Log the topic ID
    console.log(`Your topic ID is: ${topicId}`);

    // Wait 5 seconds between consensus topic creation and subscription
    await new Promise((resolve) => setTimeout(resolve, 5000));

    process.exit(); // Exit the process
}
```

## Step 5 : **Execution**

This line calls the `main()` function to start the execution of the script.

```javascript
main();
```

This script creates a new consensus topic on the Hedera network and logs the topic ID to the console.
