Deploy a Contract Using the Hedera Token Service

Summary

In this example, you will learn how to create a Solidity contract that interacts with the Hedera Token Service (HTS). The initial release of this feature supports token mint, burn, associate, dissociate, and transfer transactions.

The example does not cover the environment setup or creating certain variables that may be seen in the code blocks. The full coding example can be found at the end of the page.

Prerequisites

We recommend you complete the following introduction to get a basic understanding of Hedera transactions. This example does not build upon the previous examples.

1. Create Your "HTS" Smart Contract

In this example, you will associate a token to an account and transfer tokens to the associated account by interacting with the HTS contract deployed to Hedera. The HTS contract has three functions that allow you to associate, transfer, and dissociate tokens from a Hedera account.

  • tokenAssociate

  • tokenTransfer

  • tokenDissociate

The HTS.sol will serve as a reference to the contract that was compiled. The HTS.json file contains the data.bytecode.object field that will be used to store the contract bytecode in a file on the Hedera network.

To write a contract using HTS, you will need to add the HTS Solidity support libraries to your project and import them into your contract. Please see the HTS.sol example for reference. The IHederaTokenService.sol will need to be in the same directory as the other two files. An explanation of the functions can be found here.

2. Store the Smart Contract Bytecode on Hedera

Create a file using the FileCreateTransaction() API to store the hex-encoded byte code of the "HTS" contract. Once the file is created, you can obtain the file ID from the receipt of the transaction.

3. Deploy a Hedera Smart Contract

Create the contract and set the file ID to the file that contains the hex-encoded bytecode from the previous step. You will need to set the gas high enough to deploy the contract. The gas should be estimated to be within 25% of the actual gas cost to avoid paying extra gas. You can read more about gas and fees here.

4. Call the tokenAssociate Contract Function

The tokenAssociate function in the contract will associate a token that was created using the native Hedera Token Service. You can create a new token using HTS or using an existing token in this example. Use the ContractExecuteTransaction() API to call the contract's tokenAssociate function. You will pass the token ID and account ID in Solidity address format to the contract function. The contract function parameters must be provided in the order expected by the function to execute successfully.

5. Get the tokenAssociate Transaction Record

The contract execute transaction that triggered a subsequent token associate transaction in the contract is an example of a nested transaction. The contract execute transaction is the parent transaction and the token associate transaction is referred to as the child transaction. Both parent and child transactions share the same payer account ID and transaction valid duration with the exception of the child transaction having a nonce value at the end. The nonce value increments for each subsequent child transaction.

  • Parent Transaction ID: 0.0.2252@1640119571.329880313

  • Child Transaction ID: 0.0.2252@1640119571.329880313/1

The parent transaction record, receipt, or response will only return the parent transaction information. If you would like to get the child transaction record, receipt, or response you will need to use the TransactionRecordQuery() or TransactionReceiptQuery() and set children equal to true. The child transaction record will also have a parentConsensusTimestamp field populated with the consensus timestamp of the parent transaction.

To confirm the account was associated with the token, request the balance of the account. The account balance should show the ID of the token that was associated with a zero balance.

6. Call the tokenTransfer Contract Function

Transfer 100 units of the token to the account that was associated with the token. You will use the ContractExecuteTransaction() API and set the contract function to tokenTransfer. The contract function parameters must be provided in the order of the function expects to receive them.

The transaction must be signed by the account that is sending the tokens. In this case, it is the treasury account.

You can verify the transfer was successful by checking the account token balance!

Note: Check out our smart contract mirror node rest APIs that return information about a contract like contract results and logs!

Congratulations 🎉! You have learned how to deploy a contract using the Hedera Token Service and completed the following:

  • Created a smart contract that calls HTS transactions

  • Associated an HTS token by using the deployed contract

  • Requested a transaction record for a nested transaction

  • Transferred tokens using the deployed contract

Code Check ✅

Java
JavaScript
Go

Happy Building! Feel free to reach out if you have any questions:

Have a question? Ask it on StackOverflow

Last updated