Hedera
Search…
Create a smart contract
A transaction that creates a new smart contract instance. After the contract is created you can get the new contract ID by requesting the receipt of the transaction. To create the solidity smart contract, you can use remix or another Solidity compiler. After you have the hex-encoded bytecode of the smart contract you need to store that on a file using the Hedera File Service. Then you will create the smart contract instance that will run the bytecode stored in the Hedera file, referenced by file ID. Alternatively, you can use the ContractCreateFlow() API to create the file storing the bytecode and contract in a single step.
The constructor will be executed using the given amount of gas, and any unspent gas will be refunded to the paying account. Constructor inputs are passed in the constructorParameters.
If this constructor stores information, it is charged gas to store it. There is a fee in hbars to maintain that storage until the expiration time, and that fee is added as part of the transaction fee.
Smart contract entity auto renewal and expiry will be enabled in a future release. Please check out HIP-16 for more information.
Solidity Support The latest version of Solidity is supported on all networks (v0.8.9).
Smart Contract State Size and Gas Limits
The Hedera Services 0.22 release increases the contract state size to 10 MB and the system gas throttle to 15 million gas per second. Contract call and contract create are throttled at 5 million gas per second.
Transaction Signing Requirements
  • The client operator account is required to sign the transaction
  • The admin key, if specified
Transaction Fees
  • Please see the transaction and query fees table for base transaction fee
  • Please use the Hedera fee estimator to estimate your transaction fee cost
Smart Contract Properties
Field
Description
Admin Key
Sets the state of the instance and its fields can be modified arbitrarily if this key signs a transaction to modify it. If this is null, then such modifications are not possible, and there is no administrator that can override the normal operation of this smart contract instance. Note that if it is created with no admin keys, then there is no administrator to authorize changing the admin keys, so there can never be any admin keys for that instance.
Gas
The gas to run the constructor.
Initial Balance
The initial number of hbars to put into the cryptocurrency account associated with and owned by the smart contract.
Byte Code File
The file containing the hex encoded smart contract byte code.
Proxy Account
The ID of the account to which this account is proxy staked. If proxyAccountID is null, or is an invalid account, or is an account that isn't a node, then this account is automatically proxy staked to a node chosen by the network, but without earning payments. If the proxyAccountID account refuses to accept proxy staking, or if it is not currently running a node, then it will behave as if proxyAccountID was null. (disabled)
Auto Renew Account ID
An account to charge for auto-renewal of this contract. If not set, or set to an account with zero hbar balance, the contract's own hbar balance will be used to cover auto-renewal fees. (disabled)
Auto Renew Period
The period that the instance will charge its account every this many seconds to renew. (disabled)
Automatic Token Associations
The maximum number of tokens that this contract can be automatically associated with (i.e., receive air-drops from).
Constructor Parameters
The constructor parameters to pass.
Memo
The memo to be associated with this contract. (max 100 bytes)

ContractCreateFlow()

The ContractCreateFlow()streamlines the creation of a contract by taking the bytecode of the contract and creating the file on Hedera to store the bytecode for you.
First, a FileCreateTransaction() will be executed to create a file on Hedera to store the specified contract bytecode. Second, the ContractCreateTransaction() will be executed to create the contract instance on Hedera.
The response will return the contract create transaction information like the new contract ID. You will not get the ID of the file that was created that stored your contract bytecode. If you would like to know the file ID of your contract bytecode, you can create a file and use the ContractCreateTransaction() API directly.
Constructor
Description
new ContractCreateFlow()
Initializes the ContractCreateFlow() object

Methods

V2
Note: Please refer to ContractCreateTransaction() for a complete list of applicable methods.
Method
Type
setBytecode(<bytecode>)
byte
setBytecode(<bytecode>)
String
setBytecode(<bytecode>)
ByteString
Java
1
//Create the transaction
2
ContractCreateFlow contractCreate = new ContractCreateFlow()
3
.setBytecode(bytecode)
4
.setGas(100_000);
5
​
6
//Sign the transaction with the client operator key and submit to a Hedera network
7
TransactionResponse txResponse = contractCreate.execute(client);
8
​
9
//Get the receipt of the transaction
10
TransactionReceipt receipt = txResponse.getReceipt(client);
11
​
12
//Get the new contract ID
13
ContractId newContractId = receipt.contractId;
14
15
System.out.println("The new contract ID is " +newContractId);
16
//SDK Version: v2.10.0-beta.1
Copied!
JavaScript
1
//Create the transaction
2
const contractCreate = new ContractCreateFlow()
3
.setGas(100000)
4
.setBytecode(bytecode);
5
​
6
//Sign the transaction with the client operator key and submit to a Hedera network
7
const txResponse = contractCreate.execute(client);
8
​
9
//Get the receipt of the transaction
10
const receipt = (await txResponse).getReceipt(client);
11
​
12
//Get the new contract ID
13
const newContractId = (await receipt).contractId;
14
15
console.log("The new contract ID is " +newContractId);
16
//SDK Version: v2.11.0-beta.1
Copied!
Go
1
//Create the transaction
2
contractCreate := hedera.NewContractCreateFlow().
3
SetGas(100000).
4
SetBytecode(byteCode)
5
​
6
//Sign the transaction with the client operator key and submit to a Hedera network
7
txResponse, err := contractCreate.Execute(client)
8
if err != nil {
9
panic(err)
10
}
11
​
12
//Request the receipt of the transaction
13
receipt, err = txResponse.GetReceipt(client)
14
if err != nil {
15
panic(err)
16
}
17
​
18
//Get the topic ID
19
newContractId := *receipt.ContractID
20
​
21
fmt.Printf("The new topic ID is %v\n", newContractId)
22
//SDK Version: 2.11.0-beta.1
Copied!

ContractCreateTransaction()

Creates a smart contract instance using the file ID of the contract bytecode.
Constructor
Description
new ContractCreateTransaction()
Initializes the ContractCreateTransaction() object

Methods

V2
V1
Method
Type
Requirement
setGas(<gas>)
long
Required
setBytecodeFileId(<fileId>)
​FileId​
Required
setInitialBalance(<initialBalance>)
Hbar
Optional
setAdminKey(<keys>)
Key
Optional
setProxyAccountId(<accountId>)
​AccountId​
Optional
setConstructorParameters(<constructorParameters>)
byte [ ]
Optional
setConstructorParameters(<constructorParameters>)
ContractFunctionParameters
Optional
setContractMemo(<memo>)
String
Optional
setAutoRenewAccountId(<accountId)
AccountId
Disabled
setAutoRenewPeriod(<autoRenewPeriod>)
Duration
Disabled
setMaxAutomaticTokenAssociations()
int
Optional
Java
1
//Create the transaction
2
ContractCreateTransaction transaction = new ContractCreateTransaction()
3
.setGas(100_000)
4
.setBytecodeFileId(bytecodeFileId);
5
6
//Modify the default max transaction fee (default: 1 hbar)
7
ContractCreateTransaction modifyTransactionFee = transaction.setMaxTransactionFee(new Hbar(16));
8
​
9
//Sign the transaction with the client operator key and submit to a Hedera network
10
TransactionResponse txResponse = modifyTransactionFee.execute(client);
11
​
12
//Get the receipt of the transaction
13
TransactionReceipt receipt = txResponse.getReceipt(client);
14
​
15
//Get the new contract ID
16
ContractId newContractId = receipt.contractId;
17
18
System.out.println("The new contract ID is " +newContractId);
19
//v2.0.0
Copied!
JavaScript
1
//Create the transaction
2
const transaction = new ContractCreateTransaction()
3
.setGas(100_000)
4
.setBytecodeFileId(bytecodeFileId);
5
​
6
//Modify the default max transaction fee (default: 1 hbar)
7
const modifyTransactionFee = transaction.setMaxTransactionFee(new Hbar(16));
8
​
9
//Sign the transaction with the client operator key and submit to a Hedera network
10
const txResponse = await modifyTransactionFee.execute(client);
11
​
12
//Get the receipt of the transaction
13
const receipt = await txResponse.getReceipt(client);
14
​
15
//Get the new contract ID
16
const newContractId = receipt.contractId;
17
18
console.log("The new contract ID is " +newContractId);
19
​
Copied!
Go
1
//Create the transaction
2
transaction := hedera.NewContractCreateTransaction().
3
SetGas(100000).
4
SetBytecodeFileID(byteCodeFileID)
5
​
6
//Sign the transaction with the client operator key and submit to a Hedera network
7
txResponse, err := transaction.Execute(client)
8
if err != nil {
9
panic(err)
10
}
11
​
12
//Request the receipt of the transaction
13
receipt, err = txResponse.GetReceipt(client)
14
if err != nil {
15
panic(err)
16
}
17
​
18
//Get the topic ID
19
newContractId := *receipt.ContractID
20
​
21
fmt.Printf("The new topic ID is %v\n", newContractId)
22
//v2.0.0
Copied!
Method
Type
Requirement
setGas(<gas>)
long
Required
setBytecodeFileId(<fileId>)
​FileId​
Required
setInitialBalance(<initialBalance>)
long/Hbar
Optional
setAdminKey(<publicKeys>)
Ed25519PublicKey
Optional
setProxyAccountId(<accountId>)
AccountId
Optional
setConstructorParameters(<constructorParameters>)
byte [ ]
Optional
setConstructorParameters(<constructorParameters>)
ContractFunctionParameters
Optional
setContractMemo(<memo>)
String
Optional
setAutoRenewPeriod(<autoRenewPeriod>)
Duration
Optional
Java
1
//Create the transaction
2
ContractCreateTransaction transaction = new ContractCreateTransaction()
3
.setBytecodeFileId(fileId)
4
.setGas(100_000_000)
5
.setConstructorParams(new ContractFunctionParams().addString("hello from hedera!"));
6
​
7
//Sign with the client operator account private key, submit to a Hedera network
8
TransactionId txId = transaction.execute(client);
9
​
10
//Get the receipt of the transaction
11
TransactionReceipt receipt = txId.getReceipt(client);
12
​
13
//Get the new contract ID
14
ContractId newContractId = receipt.getContractId();
15
16
System.out.println("The new contract ID is " + newContractId);
17
​
18
//v1.3.2
Copied!
JavaScript
1
//Create the transaction
2
const transaction = new ContractCreateTransaction()
3
.setBytecodeFileId(fileId)
4
.setGas(100_000_000)
5
.setConstructorParams(new ContractFunctionParams().addString("hello from hedera!"));
6
​
7
//Sign with the client operator account private key, submit to a Hedera network
8
const txId = await transaction.execute(client);
9
​
10
//Get the receipt of the transaction
11
const receipt = await txId.getReceipt(client);
12
​
13
//Get the new contract ID
14
const newContractId = receipt.getContractId();
15
16
System.out.println("The new contract ID is " + newContractId);
17
​
18
//v1.4.4
19
​
Copied!

Get transaction values

V2
Method
Type
Requirement
getAdminKey(<keys>)
Key
Optional
getGas(<gas>)
long
Optional
getInitialBalance(<initialBalance>)
Hbar
Optional
getBytecodeFileId(<fileId>)
FileId
Optional
getProxyAccountId(<accountId>)
AccountId
Optional
getConstructorParameters(<constructorParameters>)
ByteString
Optional
getContractMemo(<memo>)
String
Optional
getAutoRenewPeriod(<autoRenewPeriod>)
Duration
Optional
Java
1
//Create the transaction
2
ContractCreateTransaction transaction = new ContractCreateTransaction()
3
.setGas(500)
4
.setBytecodeFileId(bytecodeFileId)
5
.setAdminKey(adminKey);
6
​
7
//Get admin key
8
transaction.getAdminKey()
9
​
10
//v2.0.0
Copied!
JavaScript
1
//Create the transaction
2
const transaction = await new ContractCreateTransaction()
3
.setGas(500)
4
.setBytecodeFileId(bytecodeFileId)
5
.setAdminKey(adminKey);
6
​
7
//Get admin key
8
transaction.getAdminKey()
9
​
10
//v2.0.0
Copied!
Go
1
//Create the transaction
2
transaction := hedera.NewContractCreateTransaction().
3
SetGas(500).
4
SetBytecodeFileID(byteCodeFileID).
5
SetAdminKey(adminKey)
6
​
7
//Get admin key
8
transaction.GetAdminKey()
9
​
10
//v2.0.0
Copied!
​

​