All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Support for multiple IPs per node
- New smart contract response codes
TransferTransaction
should deterministically order transfers before submitting transaction
- New smart contract response codes
WebClient
should be able to construct an emptyMirrorNetwork
- Bad imports while using Common JS
ContractUpdateTransaction.[set|get]ByteCodeFileId()
ContractCallQuery.[set|get]MaxResultSize()
- Bad imports while using Common JS
ContractUpdateTransaction.[set|get]ByteCodeFileId()
ContractCallQuery.[set|get]MaxResultSize()
- Bad imports while using Common JS
- TLS support
Client.[get|set]TransportSecurity()
- Enable/Disable TLS*Id.toSolidityAddress()
- Support for
number
in allContractFunctionParam.add[Uint|Int]*()
methods
*Id.fromSolidityAddress()
FreezeType
FreezeTransaction.[get|set]FreezeType()
FreezeTransaction.[get|set]FileId()
FreezeTransaction.[get|set]FileHash()
FreezeTransaction.[get|set]UpdateFileId()
, use.[get|set]FileId()
instead.
- gRPC client not timing out on unresponsive connections
- Support for HIP-24 (token pausing)
TokenInfo.pauseKey
TokenInfo.pauseStatus
TokenCreateTransaction.pauseKey
TokenUpdateTransaction.pauseKey
TokenPauseTransaction
TokenUnpauseTransaction
- UTF8 encoding and ecoding in React Native
- Support for automatic token associations
TransactionRecord.automaticTokenAssociations
AccountInfo.maxAutomaticTokenAssociations
AccountCreateTransaction.maxAutomaticTokenAssociations
AccountUpdateTransaction.maxAutomaticTokenAssociations
TokenRelationship.automaticAssociation
TokenAssociation
TransferTransaction.addHbarTransfer()
was not combining transfers
- Support for automatic token associations
TransactionRecord.automaticTokenAssociations
AccountInfo.maxAutomaticTokenAssociations
AccountCreateTransaction.maxAutomaticTokenAssociations
AccountUpdateTransaction.maxAutomaticTokenAssociations
TokenRelationship.automaticAssociation
TokenAssociation
TokenNftInfo.toString()
- Stringifies the JSON representation of the currentTokenNftInfo
TokenNftInfo.toJson()
- JSON representation of the currentTokenNftInfo
Timestamp.toString()
- displays as<seconds>.<nanos>
. UseTimestamp.toDate()
to print differently
TokenNftInfoQuery.[set|get]AccountId()
with no replacementTokenNftInfoQuery.[set|get]TokenId()
with no replacementTokenNftInfoQuery.[set|get]Start()
with no replacementTokenNftInfoQuery.[set|get]End()
with no replacementTokenMintTransaction.[add|set]Metadata()
support for string metadata
- Support for
CustomRoyaltyFees
- Updated
Status
with new response codes - Implemented
Client.[set|get]NetworkName()
Client.pingAll()
- pings all network nodesClient.[set|get]NodeWaitTime()
- minimum delay for nodes that are nto respondingClient.[set|get]MaxAttempts()
- max number of attempts for each requestClient.[set|get]MaxNodesPerTransaction()
- number of node account IDs to use per requestCustomFixedFee.[set|get]HbarAmount()
- helper method to set bothdenominatingTokenId
andamount
when fee is anHbar
amountCustomFixedFee.setDenominatingTokenToSameToken()
- helper method to setdenominatingTokenId
to0.0.0
which is not obvious
Client.ping()
will no longer throw an error
*[Transaction|Query].[set|get]MaxRetries()
- Use*[Transaction|Query].[set|get]MaxAttempts()
instead
PrivateKey.signTransaction()
andPublicKey.verifyTransaction()
should correctly freeze an unfrozen transaction
- Updated
Status
with new response codes - Support for
Hbar.[from|to]String()
to be reversible Client.setAutoValidateChecksums()
set whether checksums on ids will be automatically validated upon attempting to execute a transaction or query. Disabled by default. Check status withClient.isAutoValidateChecksumsEnabled()
*Id.toString()
no longer stringifies with checksums. Use*Id.getChecksum()
to get the checksum that was parsed, or use*Id.toStringWithChecksum(client)
to stringify with the correct checksum for that ID on the client's network.*Id.validateChecksum()
to validate a checksum. Throws newBadEntityIdException
- Free queries should not longer attempt to sign payment transactions
- All enitty IDs within response should no longer contain a checskum.
Use
*Id.toStringWithChecksum(Client)
to stringify with a checksum ReceiptStatusError
should contain a properly filled outTransactionReceipt
*Id.validate()
use*Id.validateChecksum()
instead
- Updated
Status
andFeeDataType
with new codes
TokenCreateTransaction.[get|set]FeeScheduleKey()
- Support for parsing file 0.0.111 using
FeeSchedules
TokenMintTransaction.[to|from]Bytes()
incorrectly parsing the transaction body
TokenCreateTransaction.addCustomFee()
- useTokenCreateTransaction.setCustomFees()
instead
- Support for NFTS
- Creating NFT tokens
- Minting NFTs
- Burning NFTs
- Transfering NFTs
- Wiping NFTs
- Query NFT information
- Support for Custom Fees on tokens:
- Setting custom fees on a token
- Updating custom fees on an existing token
- Loading keystore should no longer error when
CipherAlgorithm
doesn't match case PrivateKey.legacyDerive()
should now be consistent with the v1.4.6 JS SDK
Hbar.fromTinybar()
supportsBigNumber
Hbar.toString()
supportsHbarUnit
- Implemented to and from bytes for
TopicInfo
andTokenInfo
- Support for
sign-on-demand
- This is disabled by default to you'll need to enable it using
Client.setSignOnDemand(true)
- If
sign-on-demand
is enabled you'll need to useasync
versions of these methods:*Transaction.toBytes()
->*Transaction.toBytesAsync()
*Transaction.getSignatures()
->*Transaction.getSignaturesAsync()
*Transaction.getTransactionHash()
->*Transaction.getTransactionHashAsync()
- This is disabled by default to you'll need to enable it using
- All requests now retry on gRPC status
INTERNAL
if error returned containsRST_STREAM
- Added support for TLS on mirror node connections
- Implemented
*Id.clone()
(this is used internally to fix some issues that only surface in React Native) - Implement
Timestamp.plusNanos()
- Added support for entity ID checksums. The network will be extracted from the checksum of the entity ID and validated on each request to make sure a request is not happening on one network while an entity ID references another network. Entity IDs with a network will print with a checksum while entity IDs without a checksum will not print the checksum part.
TopicMessageQuery.startTime
not updating start time by one nanosecond causing a message to appear twice if the connection resetTopicMessageQuery
should log retriesTransactionReceipt
error handling; this should now throw an error contain the receipt
TopicMessageQuery.maxBackoff
was not being used at allTopicMessageQuery.limit
was being incorrectly update with fullTopicMessages
rather than per chunkTopicMessageQuery.startTime
was not being updated each time a message was receivedTopicMessageQuery.completionHandler
was be called at incorrect times
- Exposed
AccountBalance.tokenDecimals
- Support for
string
parameters inHbar.fromTinybars()
Hbar.toBigNumber()
which is a simple wrapper aroundHbar.to(HbarUnit.Hbar)
AccountBalance.toJSON()
- Support for
maxBackoff
,maxAttempts
,retryHandler
, andcompletionHandler
inTopicMessageQuery
- Default logging behavior to
TopicMessageQuery
if an error handler or completion handler was not set
TopicMessageQuery
retry handling; this should retry on more gRPC errorsTopicMessageQuery
max retry timeout; before this would could wait up to 4m with no feedback- Missing
@readonly
tag onTokenInfo.tokenMemo
Keystore
failing to recognize keystores generated by v1 SDKs- Errors caused by the use
?.
and??
within a node 12 context TopicMessageQuery
PrivateKey.legacyDerive()
- Derive private key using legacy derivationsHbar.fromTinybars()
supportsstring
parameterHbar.toBigNumber()
aliasesHbar.to(HbarUnit.Hbar)
AccountBalance.tokenDecimals
- Represents the decimals on a tokenAccountBalance.toString()
should print aJSON.stringified()
outputAccountBalance.toJSON()
Mnemonic.toLegacyPrivateKey()
no longer automaticaly derivesPrivateKey
, instead produces rootPrivateKey
UsePrivateKey.legacyDerive()
to derive the properPrivateKey
manually- Removed the use of
@hashgraph/protobufjs
in favor ofprotobufjs
The reason@hashgraph/protobufjs
even exists is becauseprotobufjs
containseval
which fails CSP in browser. However, while running integration tests throughvite
andmocha
it seems theeval
was never hit. - Moved from
yarn
topnpm
because of performance issues withyarn
- Scheduled transaction support:
ScheduleCreateTransaction
,ScheduleDeleteTransaction
, andScheduleSignTransaction
- React Native support
- Support for raw
proto.Transaction
bytes inTransaction.fromBytes()
- This means v1 SDK's
Transaction.toBytes()
will now be supported in v2Transaction.fromBytes()
However,Transaction.toBytes()
andTransaction.getTransactionHas()
in v2 will produce different results in the v1 SDK's.
- This means v1 SDK's
- addSignature() Behavior Differs Between Implementations [NCC-E001154-005]
- Decreased
CHUNK_SIZE
4096->1024 and increased default max chunks 10->20 - Export
StatusError
,PrecheckStatusError
,ReceiptStatusError
, andBadKeyError
KeyList.toString()
AccountBalance.toString()
new TransactionId(AccountId, Instant)
- UseTransactionId.withValidStart()
instead.
- addSignature() Behavior Differs Between Implementations [NCC-E001154-005]
- Decreased
CHUNK_SIZE
4096->1024 and increased default max chunks 10->20 - Renamed
ScheduleInfo.getTransaction()
->ScheduleInfo.getScheduledTransaction()
- React Native support
- Scheduled transactions should use new HAPI protobufs
- Removed
nonce
fromTransactionId
schedule-multi-sig-transaction
example to use new scheduled transaction API
ScheduleCreateTransaction.addScheduledSignature()
ScheduleCreateTransaction.scheduledSignatures()
ScheduleSignTransaction.addScheduledSignature()
ScheduleSignTransaction.scheduledSignatures()
- Support for raw
proto.Transaction
bytes inTransaction.fromBytes()
- This means v1 SDK's
Transaction.toBytes()
will now be supported in v2Transaction.fromBytes()
However,Transaction.toBytes()
andTransaction.getTransactionHas()
in v2 will produce different results in the v1 SDK's.
- This means v1 SDK's
- Export
StatusError
,PrecheckStatusError
,ReceiptStatusError
, andBadKeyError
- A few examples that did not work with
CONFIG_FILE
environment variable
- Support for setting signatures on the underlying scheduled transaction
TransactionReceipt.scheduledTransactionId
ScheduleInfo.scheduledTransactionId
TransactionRecord.scheduleRef
- Support for scheduled and nonce in
TransactionId
TransactionId.withNonce()
- Supports creating transaction ID with random bytes.TransactionId.[set|get]Scheduled()
- Supports scheduled transaction IDs.
memo
fields for both create and update transactions and info queriesAccount[Create|Update]Transaction.[set|get]AccountMemo()
File[Create|Update]Transaction.[set|get]AccountMemo()
Token[Create|Update]Transaction.[set|get]AccountMemo()
AccountInfoQuery.accountMemo
FileInfoQuery.fileMemo
TokenInfoQuery.tokenMemo
ScheduleInfo.*ID
field names should useId
Ex.ScheduleInfo.creatorAccountID
->ScheduleInfo.creatorAccountId
- Renamed
ScheduleInfo.memo
->ScheduleInfo.scheduleMemo
- Chunked transactions should not support scheduling if the data provided is too large
TopicMessageSubmitTransaction
FileAppendTransaction
- Support for scheduled transactions.
ScheduleCreateTransaction
- Create a new scheduled transactionScheduleSignTransaction
- Sign an existing scheduled transaction on the networkScheduleDeleteTransaction
- Delete a scheduled transactionScheduleInfoQuery
- Query the info includingbodyBytes
of a scheduled transactionScheduleId
KeyList.toString()
AccountBalance.toString()
new TransactionId(AccountId, Instant)
- UseTransactionId.withValidStart()
instead.
- Implement
Client.forName()
to support construction of client from network name. - Implement
PrivateKey.verifyTransaction()
to allow a user to verify a transaction was signed with a partiular key.
* All queries and transactions support setting fields in the constructor using
an object, e.g. `new AccountBalanceQuery({ accountId: "0.0.3" })`, or
`new AccountCreateTransaction({ key: client.operatorPublicKey, initialBalance: 10 })`.
* Almost all instances of `BigNumber` have been replaced with `Long`
-
Ed25519PrivateKey.fromMnemonic
regressed in v1.1.8 and was not working in the browser. -
Use detached signatures when signing the transaction. This should allow for much larger transactions to be submitted.
Ed25519PrivateKey.fromKeystore
regressed in v1.1.9 and was not working in the browser
-
Client.ping(id: AccountIdLike)
Pings a node by account ID. -
Ed25519PrivateKey.fromMnemonic
works with legacy 22-word phrases.
Client.getAccountBalance()
to match the Java SDK. UseAccountBalanceQuery
directly instead.
-
Allow BigNumber or String to be used as Tinybar where Tinybar was accepted
-
Add support for decoding
Ed25519PrivateKey
from a PEM file usingEd25519PrivateKey.fromPem()
-
Add support for passing no argument to
ContractFunctionResult.get*()
methods. -
Add
MnemonicValidationResult
which is the response type forMnemonic.validte()
-
Add public method
Mnemonic.validate(): MnemonicValidationResult
which validates if the mnemonic came from the same wordlist, in the right order, and without misspellings. -
Add
BadPemFileError
which is thrown when decoding a pem file fails.
-
Fixes
AddBytes32Array
-
Fixes
Hbar.isNegative()
failing withundefined
. -
Fixes
CryptoTransferTransaction.addTransfer()
not supportingBigNumber
ornumber
as arguments. -
Fixes
ConsensusTopicInfoQuery.setTopicId()
not supportingConsensusTopicIdLike
.
-
Deprecates
Client.maxTransactionFee
andClient.maxQueryPayment
getters. -
Deprecates
ConsensusTopicCreateTransaction.setAutoRenewAccount()
was simply renamed toConsensusTopicCreateTransaction.setAutoRenewAccountId()
. -
Deprecates
ConsensusTopicCreateTransaction.setExpirationTime()
with no replacement. -
Deprecates
ConsensusTopicCreateTransaction.setValidStart()
with no replacement. -
Deprecates
ConsensusTopicUpdateTransaction.setAutoRenewAccount()
with no replacement.
-
TransactionRecord.getContractCallResult
andTransactionRecord.getContractExecuteResult
were swapped internally and neither worked before. -
Export
ConsensusMessageSubmitTransaction
.
- Do not provide (and sign) a payment transaction for
AccountBalanceQuery
. It is not required.
-
Add
TransactionBuilder.getCost()
to return a very close estimate of the transaction fee (within 1%). -
Add additional error classes to allow more introspection on errors:
HederaPrecheckStatusError
- Thrown when the transaction fails at the node (the precheck)HederaReceiptStatusError
- Thrown when the receipt is checked and has a failing status. The error object contains the full receipt.HederaRecordStatusError
- Thrown when the record is checked and it has a failing status. The error object contains the full record.
-
console.log(obj)
now prints out nice debug information for several types in the SDK including receipts
-
Add
TransactionReceipt.getConsensusTopicId()
. -
Add
TransactionReceipt.getConsensusTopicRunningHash()
. -
Add
TransactionReceipt.getConsensusTopicSequenceNumber()
. -
Adds support for addresses with a leading
0x
prefix withContractFunctionParams.addAddress()
.
-
Deprecates
Client.putNode()
. UseClient.replaceNodes()
instead. -
Depreactes
Transaction.getReceipt()
andTransaction.getRecord()
. UseTransactionId.getReceipt()
orTransactionId.getRecord()
instead. Theexecute
method onTransaction
returns aTransactionId
. -
Deprecates
ConsensusSubmitMessageTransaction
. This was renamed toConsensusMessageSubmitTransaction
to match the Java SDK.
RECEIPT_NOT_FOUND
is properly considered and internally retried withinTransactionReceiptQuery
- Contract parameter encoding with BigNumbers
Add support for Hedera Consensus Service (HCS).
-
Add
ConsensusTopicCreateTransaction
,ConsensusTopicUpdateTransaction
,ConsensusTopicDeleteTransaction
, andConsensusMessageSubmitTransaction
transactions -
Add
ConsensusTopicInfoQuery
query (returnsConsensusTopicInfo
) -
Add
MirrorClient
andMirrorConsensusTopicQuery
which can be used to listen for HCS messages from a mirror node.
Minor version bumps may add deprecations as we improve parity between SDKs or fix reported issues. Do not worry about upgrading in a timely manner. All v1+ APIs will be continuously supported.
-
Deprecated
SystemDelete#setId
; replaced withSystemDelete#setFileId
orSystemDelete#setContractId
-
Deprecated
SystemUndelete#setId
; replaced withSystemUndelete#setFileId
orSystemUndelete#setContractId
-
Deprecated
Hbar.of(val)
; replaced withnew Hbar(val)
-
Deprecated
FreezeTransaction#setStartTime(Date)
; replaced withFreezeTransaction#setStartTime(hour: number, minute: number)
-
Deprecated
FreezeTransaction#setEndTime(Date)
; replaced withFreezeTransaction#setEndTime(hour: number, minute: number)
-
All previous exception types are no longer thrown. Instead there are a set of new exception types to match the Java SDK.
HederaError
becomesHederaStatusError
ValidationError
becomesLocalValidationError
TinybarValueError
becomesHbarRangeError
MaxPaymentExceededError
becomesMaxQueryPaymentExceededError
BadKeyError
is a new exception type when attempting to parse or otherwise use a key that doesn't look like a key
- Allow passing a string for a private key in
Client.setOperator
- Correct list of testnet node addresses
No significant changes since v1.0.0-beta.5
- Fix
getCost
for entity Info queries where the entity was deleted
-
Add support for unsigned integers (incl. Arrays) for contract encoding and decoding
-
Add
AccountUpdateTransaction.setReceiverSignatureRequired
-
Add
AccountUpdateTransaction.setProxyAccountId
- Rename
ContractExecuteTransaction.setAmount()
toContractExecuteTransaction.setPayableAmount()
-
Client.forTestnet
makes a new client configured to talk to TestNet (use.setOperator
to set an operater) -
Client.forMainnet
makes a new client configured to talk to Mainnet (use.setOperator
to set an operater)
-
Renamed
TransactionReceipt.accountId
,TransactionReceipt.contractId
,TransactionReceipt.fileId
, andTransactionReceipt.contractId
toTransactionReceipt.getAccountId()
, etc. to add an explicit illegal state check as these fields are mutually exclusive -
Renamed
TransactionRecord.contractCallResult
toTransactionRecord.getContractExecuteResult()
-
Renamed
TransactionRecord.contractCreateResult
toTransactionRecord.getContractCreateResult()
TransactionBuilder.setMemo
is renamed toTransactionBuilder.setTransactionMemo
to avoid confusion as there are 2 other kinds of memos on transactions
- Fix usage on Node versions less than 12.x
-
CallParams
is removed in favor ofContractFunctionParams
and closely mirrors type names from solidityaddInt32
addInt256Array
addString
- etc.
-
ContractFunctionResult
now closely mirrors the solidity type namesgetInt32
- etc.
-
setFunctionParams(params)
onContractCallQuery
andContractExecuteTransaction
is nowsetFunction(name, params)
-
ContractLogInfo.topicList
->ContractLogInfo.topics
-
FileInfo.deleted
->FileInfo.isDeleted
-
FileContentsQuery.execute
now directly returnsUint8Array
-
ContractRecordsQuery.execute
now directly returnsTransactionRecord[]
-
AccountAmount.amount
(String
) ->AccountAmount.amount
(Hbar
) -
TransactionReceipt
receiverSigRequired
->isReceiverSignatureRequired
autoRenewPeriodSeconds
->autoRenewPeriod
-
Remove incorrect local validation for FileCreateTransaction and FileUpdateTransaction
-
Any
key
fields on response types (e.g.,AccountInfo
) are nowPublicKey
and can be any of the applicable key types -
Fix transaction back-off when BUSY is returned
-
Default autoRenewPeriod on ContractCreate appropriately
-
Client constructor takes the network as
{ network: ... }
instead of{ nodes: ... }
-
Transactions and queries do not take
Client
in the constructor; instead,Client
is passed toexecute
. -
Removed
Transaction.executeForReceipt
andTransaction.executeForRecord
These methods have been identified as harmful as they hide too much. If one fails, you do not know if the transaction failed to execute; or, the receipt/record could not be retrieved. In a mission-critical application, that is, of course, an important distinction.
Now there is only
Transaction.execute
which returns aTransactionId
. If you don't care about waiting for consensus or retrieving a receipt/record in your application, you're done. Otherwise you can now use anyTransactionId
and ask for the receipt/record (with a stepped retry interval until consensus) withTransactionId.getReceipt
andTransactionId.getRecord
.v0.7.x and below
let newAccountId = new AccountCreateTransaction(hederaClient) .setKey(newKey.publicKey) .setInitialBalance(1000) .executeForReceipt() // TransactionReceipt .accountId;
v0.8.x and above
let newAccountId = new AccountCreateTransaction() .setKey(newKey.publicKey) .setInitialBalance(1000) .execute(hederaClient) // TranactionId .getReceipt(hederaClient) // TransactionReceipt .accountId;
-
Rename
setPaymentDefault
tosetPaymentAmount
-
All transaction and query types that were in the Java SDK but not yet in the JS SDK (GetBySolidityIdQuery, AccountStakersQuery, etc.)
-
TransactionId.getReceipt
-
TransactionId.getRecord
-
Transaction.toString
. This will dump the transaction (incl. the body) to a stringified JSON object representation of the transaction. Useful for debugging. -
A default of 1 Hbar is now set for both maximum transaction fees and maximum query payments.
-
Smart Contract type encoding and decoding to match Java.
-
To/From string methods on AccountId, FileId, etc.
-
Internal retry handling for Transactions and Queries (incl. BUSY)
Transaction
andQuery
types related to claims