TESTING.mdwith instructions for running unit and e2e tests, and.env.sampledocumenting required environment variables for tests/examples #1635
- Update protobufs from
hiero-servicesto v0.72.0, bumpmirrorNodeVersionto v0.151.0 andsoloVersionto v0.68.0 #1673 - Use
slices.Backward(Go 1.23) to simplify reverse-iteration loops #1675
- Corrected function and type names from
lambdatohook/evm_hookto match protobuf definitions #1667
- ECDSA key derivation failing due to missing zero-padding on key scalars.
big.Int.Bytes()strips leading zero bytes, so key scalars could return 31 bytes instead of 32, causing_DeriveECDSAChildKey()to reject the input #1654
- Reworked
TransactionFromBytesbody comparison to correctly handle chunked transaction types (FileAppendTransaction,TopicMessageSubmitTransaction) #1663
- Opt-in receipt/record query failover to other nodes. By default,
GetReceiptandGetRecordqueries remain pinned to the submitting node. When enabled viaClient.SetAllowReceiptNodeFailover(true), queries can advance to other healthy nodes if the submitting node becomes unavailable or overloaded #1628
TransactionResponse.GetReceiptQuery()andTransactionResponse.GetRecordQuery(), useGetReceiptQueryWithClientandGetRecordQueryWithClientinstead #1628
TransactionFromBytesnow validates full transaction body consistency usingprotobuf.Equalinstead of only comparing the protobuf type viareflect.TypeOf#1644- Revert p256 curve change #1643
- Extracted common transaction body construction into shared helper methods
buildTransactionBody()andbuildSchedulableTransactionBody()on the baseTransactionstruct, removing duplicated field assignments across all concrete transaction implementations #1642 - Replaced custom comparison logic with Go's built-in
max/minfunctions to simplify the code #1639 - Use
reflect.TypeForinstead ofreflect.TypeOfwhen the type is already known at compile time for improved type safety #1623 - Enhanced README with pre-requisites and setup instructions for new contributors #1621
- Simple fees that allows users to query expected transaction fees without submitting transactions to the network #1559
- Support Pectra EVM transaction encoding #1598
- Fix the potential data race #1581
- Support for HIP-1299: Enhanced retry mechanism to handle node account ID rotations in the Dynamic Address Book. #1547
- The SDK now treats
INVALID_NODE_ACCOUNT_IDas a retryable status code. - When this error is encountered, the affected node is automatically marked as unusable (increased backoff, removed from healthy nodes list).
- The client's network configuration is automatically updated with the latest node account IDs via an address book query.
- The transaction is automatically retried with another node.
- This ensures seamless handling of node account ID changes that occur when nodes update their account IDs in the Dynamic Address Book.
- The SDK now treats
- Support for hooks, programmable Hiero extension points that let users customize the behavior of their entities. The initial implementation focuses on EVM hooks and account allowance hooks as the first extension point. #1572
- Refactor and test mirror node grpc stream calls. #1558
- Grpc deadline and timeout to the client #1538
New APIs for
Client:GetGrpcDeadline&SetGrpcDeadline- the grpc deadline for a single grpc request New APIs for transactions and queries:GetRequestTimeout&SetRequestTimeout- the total time budget for a complete Transaction or Query execute operation
- The SDK not switching nodes when it receives bad grpc status code #1538
- Internal refactor for
FileAppendandMessageSubmitto share execute logic #1549 - Replace HasSuffix+TrimSuffix with CutSuffix #1548
- Usage metrics not being detected due to malformed version being passed as grpc metadata #1514
THROTTLED_AT_CONSENSUScausing null pointer for chunked transactions #1509
- Introduced Client.GetMirrorRestApiBaseUrl getter to provide the full Mirror Node REST API base URL, including scheme and port #1507
- Updated AccountId.populateAccountEvmAddress, AccountId.populateAccountNum MirrorNodeContractQuery to construct URLs using mirrorRestApiBaseUrl instead of manually parsing strings #1507
- Used
strings.BuilderinStringmethods for various structs #1508 - Replaced custom min func with built-in function min. #1506
TransactionSignandTransactionExecuteto work with chunked transactions by calling the overridden implementations #1505
- Validation to
NodeUpdateTransactionsetters to align with JS SDK #1490 slices.Equalto simplify code #1476
- Status codes
StatusServiceEndpointsExceededLimit,StatusInvalidGossipCaCertificate,StatusInvalidIPV4Addresshas swapped places #1486 - Freeze error not being checked in some flows #1486
- The ability to set AutoRenewPeriod in seconds
- Makes SetStakedAccountID and SetStakedNodeID explicitly mutually exclusive
- Support for Private and Public keys in SetAdminKey for contract update
- Adds the ability to remove autorenew account via setting it to
0.0.0 customFeeLimitsfor Scheduled Transactions (currently only forTopicSubmitTransaction)
- Introduced new method
DeleteGrpcWebProxyEndpointforNodeUpdateTransactionthat effectively sets the proxy tonullin the mirror node api and removes it from the address book state. #1444 - Chunk size option for
TopicMessageSubmitTransaction, addedSetChunkSizeandGetChunkSize#1448
- Now it's possible to update the topic memo to empty string using the setter, as previously the value would be ignored #1448
- Migrated to Go version 1.24 #1452
- Checks for
NodeUpdateandNodeDeleteto Return error whennodeIDis not explicitly set #1426- This prevents users from accidentally updating or deleting node with id 0
- Refactored usage of for loops with
slices.Contains, which can make the code more concise and easy to read #1442
ToEvmAddressmethod in AccountId, ContractId, DelegateContractId, FileId, TokenId, and TopicId #1391 These methods remove encoding shards and realm from evm address methods according to this proposal https://github.com/hiero-ledger/sdk-collaboration-hub/blob/main/proposals/remove-shard-and-realm-encoding-from-evm-address-generation.md
FromSolidityAddressin AccountId, ContractId, DelegateContractId, FileId, TokenId, and TopicId #1391ToSolidityAddressin AccountId, ContractId, DelegateContractId, FileId, TokenId, and TopicId #1391EthereumFlow, with the introduction of jumbo transactions, it should always be less cost and more efficient to useEthereumTransactioninstead #1428
- Add persistent shard and realm support to Client #1395
ClientForNetworkV2: extracts the shard and realm from the network map and persists itClientFromConfig: can now accept shard and realm into the json schemaGetShardGetRealm
ClientForMirrorNetworkWithRealmAndShard: UseClientForMirrorNetworkWithShardAndRealminstead.ClientForNetwork: UseClientForNetworkV2instead.
- Replaced bip39 library (https://github.com/tyler-smith/go-bip39), since it is no longer available #1418
- Transaction size APIs #1392
GetTransactionSizeGetTransactionBodySizeGetTransactionBodySizeAllChunks
- Pause/UnpauseTransaction's protobuf methods #1393
- Auto-setting
autoRenewAccountforTokenCreateTransactiononly if autorenew period is specified. #1386
- Now we validate
FileAppendTransaction's receipts for all chunks. This improves UX and removes false-positives. #1379
-
HIP-1064: Daily Rewards For Active Nodes https://hips.hedera.com/hip/hip-1064 #1383
-
HIP-1046: gRPC-Web proxy endpoints to the Address Book https://hips.hedera.com/hip/hip-1046 #1383 New APIs for
NodeCreateandNodeUpdate:- Endpoint GetGrpcWebProxyEndpoint()
- SetGrpcWebProxyEndpoint(Endpoint)
- bool GetDeclineReward()
- SetDeclineReward(bool)
-
Offline multi-node signing support #1378
New APIs forTransaction.goGetSignableBodyBytes: returns a list of SignableBody objects for each signed transaction in the transaction list.AddSignatureV2: adds signature for multi-node and multi-chunk transactions.
- New APIs
GetDataandSetDatainEthereumTransactionData. Used to modify the call data in ethereum #1336 - Response struct, containing the
NodeIDis returned byEthereumFlow.Executeeven if the transaction fails #1336
- Fixed an issue where the receipt children were not included when the transaction throttled, when
SetIncludeChildrenis set to true #1368
- New APIs for handling of non-zero shard and realms for static files #1363
- FileId.getAddressBookFileIdFor(uint64 realm, uint64 shard)
- FileId.getFeeScheduleFileIdFor(uint64 realm, uint64 shard)
- FileId.getExchangeRatesFileIdFor(uint64 realm, uint64 shard)
- Client.forMirrorNetwork(List, uint64 realm, uint64 shard)
- Support for HIP-551 Batch Transaction https://hips.hedera.com/hip/hip-551
It defines a mechanism to execute batch transactions such that a series of transactions (HAPI calls) depending on each other can be rolled into one transaction that passes the ACID test (atomicity, consistency, isolation, and durability). #1347
- New BatchTransaction struct that has a list of innerTransactions and innerTransactionIds.
- New
batchKeyfield in Transaction class that must sign the BatchTransaction - New
batchifymethod that sets the batch key and marks a transaction as part of a batch transaction (inner transaction). The transaction is signed by the client of the operator and frozen.
- Extend
SetKeyWithAliasfuncs to supportPublicKey#1348 - Support for deserializing transaction bytes, representing single transaction proto body. #1347
- Support for HIP-1021: Improve Assignment of Auto-Renew Account ID for Topics (https://hips.hedera.com/hip/hip-1021). The autoRenewAccountId will automatically be set to the payer_account_id of the transaction if an Admin Key is not provided during topic creation #1355
- Added a User-Agent header to outgoing gRPC requests via a unary interceptor. The header value includes the SDK identifier (hiero-sdk-go) and the version obtained from build information (defaulting to DEV if unavailable). This aids in tracking SDK usage metrics #1315
- Fixed
INVALID_NODE_ACCOUNTerror when setting nodes for paid queries. The issue was that we generated payment transactions for all the nodes in the q.nodeAccountIds list and not the current node we are pointing to. This caused problems because q.nodeAccountIDs._Advance() is called when we get the cost for the query and this moves the pointer to the next node in the list.
EIP-2930transaction type compatibility. A new structEthereumEIP2930Transactionis added for RLP encodingEIP-2930transactions. #1325- Specifying min TLS version for gRPC communication. #1308
- PublicKey
VerifySignedMessagemethod in place ofVerify. #1314 PrivateKey.GetRecoveryIdmethod. This method retrieves the recovery ID (also known as the 'v' value) associated with ECDSA signatures, facilitating signature verification processes. #1324
- Modification of the
PrivateKey.Signmethod output. TheSignmethod for ECDSA private keys has been updated to return only the r and s components of the signature, reducing the output from 65 bytes to 64 bytes.This change aligns the SDK's behavior with standard ECDSA signature formats, which typically include only the r and s values. #1324
- PublicKey
Verifysince it's not keytype agnostic and has different behavior for ed25519 and ecdsa keys. #1314 VerifySignatureis no longer maintained, since it requires the full 65 byte signature and pre-hashing using Keccak256Hash.PublicKey.VerifySignedMessageis preferred. #1324
- The PublicKey
VerifyTransactionmethod was building the proto transaction body, which overrides the signatures and causesINVALID_SIGNATUREerror. The build logic is now removed and a new check if the pubkey is in the transaction was added. #1314
TokenPauseTransactionandTokenUnpauseTransactionfromBytes.
- Automatic setting of autorenew account for topic create.
ScheduledNetworkUpdateexample.
- Docs for min/max values of some parameters.
- Support for HIP-1021: improve assignment of auto renew account id for topics
- Errors are returning as
nilin 2 functions forContractFunctionParameters. EthereumFlowfor creating large contracts.
AccountStakersQuery, since it was not supported in consensus node for a long time and now it's removed permanently.
Livehashtransactions and queriesSystemDeleteTransactionandSystemUndeleteTransaction.
NftIdstring format fromserial@tokenidtotokenid@serial.
- Support for HIP-991: revenue generating topics.
- Keeping the
transactionFeefor a transaction while serializing/deserializing when the transaction was not frozen.
- New APIs in
AccountCreateTransaction:SetECDSAKeyWithAlias(ECDSAKey),setKeyWithAlias(Key, ECDSAKey)andsetKeyWithoutAlias(Key).
- Deprecated
setKeyinAccountCreateTransaction. - Set default max fee for transaction to 2 HBars.
DeleteTokenNftAllowanceAllSerials()method inAccountAllowanceApproveTransaction
- Overriding the default values of properties in some transactions when doing
transaction.toBytes()and thenTransactionFromBytes(transaction).
- Moved all source files to
/sdkdirectory. The new way of importing the SDK isimport hiero "github.com/hiero-ledger/hiero-sdk-go/v2/sdk"
NextExchangeRatein theTransactionReceipt.ScheduleRefin theTransactionRecord.- 2 new queries
MirrorNodeContractCallQueryandMirrorNodeContractEstimateGasQueryfor estimation/simulation of contract operations. - Missing
RequestTypes inrequest_type.go. - Validation for creating ECDSA Public keys from bytes.
- Removed
ExpectedDecimalsfrom theTransactionRecord, as 'dead' property.
- Support for Long Term Scheduled Transactions (HIP-423).
- Renamed packages to hiero
- Max backoff for grpc requests
- Resubmit transaction in case of throttle status at record
- Getters for internal keys and threshold for
KeyList - New api for creating client without schedule network update -
ClientFromConfigWithoutScheduleNetworkUpdate - New api for creating client with mirror network -
ClientForMirrorNetwork
- Implemented generics in
Transaction.go - Replaced go-ethereum library
- Replace
/common/mathpackage from go-ethereum - Update protobufs from
hedera-services
- Reset
stakedAccountIDwhen settingstakedNodeIDand vice versa - Fix
FEE_SCHEDULE_FILE_PART_UPLOADEDmarked as error
- Functionality to pass a string in
SetMessagefunction forTopicMessageSubmitTransaction
- Resubmit transaction in case of throttle status at receipt
TokenClaimAirdropTransactionandTokenCancelAirdropTransaction(part of HIP-904)
- Handling of
0xprefix when constructing ECDSA keys
TokenAirdropTransaction(part of HIP-904)
- Handling of
THROTTLED_AT_CONSENSUSstatus code
NodeCreateTransaction,NodeUpdateTransaction,NodeDeleteTransaction(part of HIP-869)
Keyfunctions such asKeyFromBytesKeyToBytesKeyListfunctions such asSetThreshold
TokenRejectfunctionality (part of HIP-904)
TransactionReceiptQueryandAccountBalanceQueryexecution flows
- Modified
AccountUpdateTransactionto allowmaxAutomaticTokenAssociationsto support-1as a valid value
- Implemented custom derivation paths in Menmonic ECDSA private key derivation
- Revisited and fix failing examples
- Gracefully handle
PlatformNotActivestatus code
- Implemented HIP-540: Change or remove existing keys from a token
AccountBalanceQuery,AccountInfoQuery, andContractInfoQueryget all the data from consensus nodes again
AccountBalanceQuery,AccountInfoQuery, andContractInfoQueryget part of the data from the Mirror Node REST API (HIP-367)- Fungible Token Metadata Field (HIP-646)
- NFT Collection Token Metadata Field (HIP-765)
- Raise an error if the transaction is not frozen while signing
- Undeprecate
AccountBalance.TokenDecimals,AccountInfo.TokenRelationships - Account alias for hollow account Mirror Node Queries
TokenRelationship.Symbol, useTokenInfo.Symbolinstead
- METADATA key and possibility to update NFT metadata (HIP-657)
- Fungible Token Metadata Field (HIP-646)
- NFT Collection Token Metadata Field (HIP-765)
- updated protobufs
- Implemented HIP-844 (Add signerNonce field)
- Implemented HIP-745 (Serialize transaction without freezing)
- Fixed bug for fetching nodes from Client.
- Refactored structures
executable,transaction&queryto define common methods in one place and reduce the code repetition
PopulateAccounttoAccountID
MarshalJSONtoTransactionResponse,TransactionReceipt,TransactionRecordIsApprovedboolean toTransfer
- Node/Managed node concurrency issues
- Serialization issues with
FileAppendTransaction,TokenCreateTransaction,TopicCreateTransaction,TopicMessageSubmitTransaction
- SDK Panics if node account id not in the network list
- non-exhaustive switch statement errors for
AccountAllowanceApproveTransactionandAccountAllowanceDeleteTransaction
PopulateAccounttoAccountIDPopulateContracttoContractID
- Data race in
TopicMessageQuery
ContractCreateFlowto work with larger contract's bytecode
ContractNoncestoContractFunctionResultto support HIP-729
AddInt*BigIntfunctions toContractFunctionParametersfor sendingbig.intGetResultfunction toContractFunctionResultfor parsing result to an interfaceGetBigIntfunction toContractFunctionResultfor parsing result to abig.int
- DER and PEM formats for private and public keys
- Network concurrency issues
- Some
ContractFunctionParameterswere sent/received as wrong data/data type
- Added logging functionality to Client, Transaction and Query
- Option to create a client from config file without mirror network
- Finished LegderID implementation
- Comments on the rest of the functions
- Comments on
clientand allqueryandtransactiontypes
TransactionID.String()will now return the TransactionID string without trimming the leading zeroes
- Alias support in
AccountCreateTransaction CreateAccountWithAliasExampleCreateAccountWithAliasAndReceiverSignatureRequiredExample
CustomFractionalFee.SetAssessmentMethod()AccountAllowanceApproveTransaction.ApproveTokenNftAllowanceWithDelegatingSpender()PrivateKeyFromStringECDSA()- New mirror node endpoints, only 443 port is now supported
mainnet-public.mirrornode.hedera.com:443,testnet.mirrornode.hedera.com:443,previewnet.mirrornode.hedera.com:443
- Minimum query cost can now be less than 25 tinybars
TransactionFromBytes()now correctly sets transactionValidDuration
PrivateKeyFromStringECSDA()
- Support for HIP-583
- Example for HIP-583
account_create_token_transferwhich autocreates an account by sending HBAR to an Etherum Account Address Mnemonic.ToStandardEd25519PrivateKeywhich uses the correct derivation pathMnemonic.ToStandardECDSAsecp256k1PrivateKeywhich uses the correct derivation path
Mnemonic.ToPrivateKey()was using incorrect derivation pathPrivateKeyFromMnemonic()was using incorrect derivation path
- Panic in multiple node account id locking
- Regenerating transaction id, when not expired
- Signs more than once per node/transaction
- Not retrying other nodes when there are multiple nodes are locked
- Panic when locking multiple nodes
- Panic when too many nodes are not healthy
- INVALID_NODE_ACCOUNT error
- Setting MaxAutomaticTokenAssociations on ContractUpdate even if not set
IsZero()andEquals()inAccountIDGetSignedTransactionBodyBytes()inTransaction
SetDefaultMaxQueryPaymentandSetDefaultMaxTransactionFeeinClient
- Schedule network recursive call
- Wrongly deprecated
SpenderIDfield inTokenNFTInfo
CustomFee.AllCollectorsAreExempt
- Addressbook Query no logner panics
- Example for HIP-542
- Example for HIP-573
- 10 seconds blocking on creating a
Client
NewAccountBallanceQueryto correctly return account balance
- Update documentation for
ContractFunction[Parameters|Result]to show how to use large integer variants - Implement
TransactionResponse.ValidateStatus
*Transactionsnow don't sign twice
AccountCreateTransaction.[Set|Get]Alias[Key|EvmAddress]()ContractCreateFlow.[Set|Get]MaxChunks()- Support for automatically updating networks
Client.[Set|Get]NetworkUpdatePeriod()Clientconstructor supports_ScheduleNetworkUpdateto disable auto updatestask updatefor manual address book updating
- Removed deprecated flags for wrongfully deprecated
Client.[Set|Get]LedgerID - Added
SetGrpcDeadlinetoEthereumTransactionandTokenUpdateTransaction - Deprecated
LiveHash.DurationuseLiveHash.LiveHashDuration - Added missing
LiveHashQuery.[Set|Get]MaxRetry - Added missing
TopicInfoQuery.SetPaymentTransactionID
AccountBalance.[tokens|tokenDecimals]use a mirror node query insteadAccountInfo.tokenRelationshipsuse a mirror node query insteadContractInfo.tokenRelationshipsuse a mirror node query insteadTokenNftInfo.SpenderIDreplaced byTokenNftInfo.AllowanceSpenderAccountID
Token[Update|Create]Transaction.KycKeyTokenCreateTransaction.FreezeDefaulwasn't being set properly.- Requests should retry on
PLATFORM_NOT_ACTIVE
PrngThansactionTransactionRecord.PrngBytesTransactionRecord.PrngNumbertaskrunner support
ContractFunctionResult.ContractStateChangeswith no replacement.
PrngThansactionTransactionRecord.PrngBytesTransactionRecord.PrngNumber
ContractFunctionResult.ContractStateChangeswith no replacement.
StakingInfo.PendingHbarReward
StakingInfoAccountCreateTransaction.[Set|Get]StakedAccountIDAccountCreateTransaction.[Set|Get]StakedNodeIDAccountCreateTransaction.[Set|Get]DeclineStakingRewardAccountInfo.StakingInfoAccountUpdateTransaction.[Set|Get]StakedAccountIDAccountUpdateTransaction.[Set|Get]StakedNodeIDAccountUpdateTransaction.[Set|Get]DeclineStakingRewardAccountUpdateTransaction.ClearStaked[AccountID|NodeID]ContractCreateTransaction.[Set|Get]StakedNodeAccountIDContractCreateTransaction.[Set|Get]StakedNodeIDContractCreateTransaction.[Set|Get]DeclineStakingRewardContractInfo.StakingInfoContractUpdateTransaction.[Set|Get]StakedNodeAccountIDContractUpdateTransaction.[Set|Get]StakedNodeIDContractUpdateTransaction.[Set|Get]DeclineStakingRewardContractUpdateTransaction.ClearStaked[AccountID|NodeID]TransactionRecord.PaidStakingRewardsScheduleCreateTransaction.[Set|Get]ExpirationTimeScheduleCreateTransaction.[Set|Get]WaitForExpiry- Protobuf requests and responses will be logged, for
TRACE, in hex.
TopicMessageSubmitTransactionemptyChunkInfowould always cause an error
StakingInfoAccountCreateTransaction.[Set|Get]StakedNodeAccountIDAccountCreateTransaction.[Set|Get]StakedNodeIDAccountCreateTransaction.[Set|Get]DeclineStakingRewardAccountInfo.StakingInfoAccountUpdateTransaction.[Set|Get]StakedNodeAccountIDAccountUpdateTransaction.[Set|Get]StakedNodeIDAccountUpdateTransaction.[Set|Get]DeclineStakingRewardContractCreateTransaction.[Set|Get]StakedNodeAccountIDContractCreateTransaction.[Set|Get]StakedNodeIDContractCreateTransaction.[Set|Get]DeclineStakingRewardContractInfo.StakingInfoContractUpdateTransaction.[Set|Get]StakedNodeAccountIDContractUpdateTransaction.[Set|Get]StakedNodeIDContractUpdateTransaction.[Set|Get]DeclineStakingRewardTransactionRecord.PaidStakingRewardsScheduleCreateTransaction.[Set|Get]ExpirationTimeScheduleCreateTransaction.[Set|Get]WaitForExpiry
EthereumFlowEthereumTransactionData
Transaction.[From|To]Byteswould ignore some variables- Fixed naming for
Ethereum.SetCallDataFileID()andEthereum.SetMaxGasAllowanceHbar()to be consistent with other sdks.
ContractCreateTransaction.[Get|Set]MaxAutomaticTokenAssociations()ContractCreateTransaction.[Get|Set]AutoRenewAccountId()ContractCreateTransaction.[Get|Set]Bytecode()ContractUpdateTransaction.[Get|Set]MaxAutomaticTokenAssociations()ContractUpdateTransaction.[Get|Set|clear]AutoRenewAccountId()ContractCreateFlow.[Get|Set]MaxAutomaticTokenAssociations()ContractCreateFlow.[Get|Set]AutoRenewAccountId()ContractInfo.AutoRenewAccountIDContractDeleteTransaction.[Get|Set]PermanentRemovalContractCallQuery.[Get|Set]SenderIDScheduleCreateTransaction.[Get|Set]ExpirationTimeScheduleCreateTransaction.[Get|Set]WaitForExpiryScheduleInfo.WaitForExpiryEthereumTransactionTransactionRecord.EthereumHashAccountInfo.EthereumNonceAccountID.AliasEvmAddressAccountID.AccountIDFromEvmAddress()TransactionResponse.Get[Record|Receipt]Query
FileUpdateTransactionandTopicMessageSubmitTransactionduplicate transaction errors.*Transaction.ToBytes()now properly chunked transactions.
*Querypayment signatures weren't getting updated after updating body with new random node.
ContractCreateTransaction.[Get|Set]MaxAutomaticTokenAssociations()ContractCreateTransaction.[Get|Set]AutoRenewAccountId()ContractCreateTransaction.[Get|Set]Bytecode()ContractUpdateTransaction.[Get|Set]MaxAutomaticTokenAssociations()ContractUpdateTransaction.[Get|Set|clear]AutoRenewAccountId()ContractCreateFlow.[Get|Set]MaxAutomaticTokenAssociations()ContractCreateFlow.[Get|Set]AutoRenewAccountId()ContractInfo.AutoRenewAccountIDContractDeleteTransaction.[Get|Set]PermanentRemovalContractCallQuery.[Get|Set]SenderIDScheduleCreateTransaction.[Get|Set]ExpirationTimeScheduleCreateTransaction.[Get|Set]WaitForExpiryScheduleInfo.WaitForExpiryEthereumTransactionTransactionRecord.EthereumHashAccountInfo.EthereumNonceAccountID.AliasEvmAddressAccountID.AccountIDFromEvmAddress()
FileUpdateTransactionandTopicMessageSubmitTransactionduplicate transaction errors.*Transaction.ToBytes()now properly chunked transactions.
*Querypayment signatures weren't getting updated after updating body with new random node.
*Query.GetMaxQueryPayment()*Query.GetQueryPayment()
*Query.GetPaymentTransactionID()panic when not set.`- Removed unneeded parameter in
AccountDeleteTransaction.GetTransferAccountID(). FileUpdateTransaction.GeFileMemo()is nowFileUpdateTransaction.GetFileMemo()TopicMessageSubmitTransactionfailing to send all messages, instead was getting duplicated transaction error.TopicMessageSubmitTransactionwould panic if no message was set.
TokenNftAllowance.DelegatingSpenderAccountAllowanceApproveTransaction.AddAllTokenNftApprovalWithDelegatingSpender()AccountAllowanceApproveTransaction.ApproveTokenNftAllowanceAllSerialsWithDelegatingSpender()
AccountAllowanceAdjustTransactionwith no replacement.AccountAllowanceDeleteTransaction.DeleteAllTokenAllowances()with no replacement.AccountAllowanceDeleteTransaction.DeleteAllHbarAllowances()with no replacement.AccountInfo.[Hbar|Toke|Nft]Allowances, with no replacement.TransactionRecord.[Hbar|Toke|Nft]Allowances, with no replacement.
AccountAllowanceDeleteTransactionContractFunctionResult.[gas|hbarAmount|contractFunctionParametersBytes]AccountAllowanceExampleScheduleTransferExample
AccountAllowanceAdjustTransaction.revokeTokenNftAllowance()with no replacement.AccountAllowanceApproveTransaction.AddHbarApproval(), useApproveHbarAllowance()instead.AccountAllowanceApproveTransaction.ApproveTokenApproval(), useGrantTokenNftAllowance()instead.AccountAllowanceApproveTransaction.ApproveTokenNftApproval(), useApproveTokenNftAllowance()instead.
*Transaction.GetTransactionID()panic when not set.Transaction.Freeze()now properly sets NodeAccountIDs*Querypayment transaction now properly contains the right NodeAccountIDs.
AccountAllowanceDeleteTransactionContractFunctionResult.[gas|hbarAmount|contractFunctionParametersBytes]AccountAllowanceExampleScheduleTransferExample
AccountAllowanceAdjustTransaction.revokeTokenNftAllowance()with no replacement.AccountAllowanceApproveTransaction.AddHbarApproval(), useApproveHbarAllowance()instead.AccountAllowanceApproveTransaction.ApproveTokenApproval(), useGrantTokenNftAllowance()instead.AccountAllowanceApproveTransaction.ApproveTokenNftApproval(), useApproveTokenNftAllowance()instead.
AccountInfoFlowVerify[Signature|Transaction]()Client.[Set|Get]NodeMinReadmitPeriod()- Support for using any node from the entire network upon execution if node account IDs have no been locked for the request.
- Support for all integer widths for
ContractFunction[Result|Selector|Params]
- Ledger ID checksums
TransactionFromBytes()should validate all the transaction bodies are the same
- Network behavior to follow a more standard approach (remove the sorting we used to do).
AccountInfoFlowVerify[Signature|Transaction]()Client.[Set|Get]NodeMinReadmitPeriod()- Support for using any node from the entire network upon execution if node account IDs have no been locked for the request.
- Support for all integer widths for
ContractFunction[Result|Selector|Params]
- Ledger ID checksums
TransactionFromBytes()should validate all the transaction bodies are the same
- Network behavior to follow a more standard approach (remove the sorting we used to do).
ContractCreateFlowQuery.[Set|Get]PaymentTransactionID- Verbose logging using zerolog
*[Transaction|Query].[Set|Get]GrpcDeadline()TransactionRecord.[hbar|Token|TokenNft]AllowanceAdjustmentsTransferTransaction.AddApproved[Hbar|Token|Nft]Transfer()AccountAllowanceApproveTransaction.Approve[Hbar|Token|TokenNft]Allowance()AccountAllowanceAdjustTransaction.[Grant|Revoke][Hbar|Token|TokenNft]Allowance()AccountAllowanceAdjustTransaction.[Grant|Revoke]TokenNftAllowanceAllSerials()
HbarAllowance.OwnerAccountID, wasn't being set.- Min/max backoff for nodes should start at 8s to 60s
- The current backoff for nodes should be used when sorting inside of network meaning nodes with a smaller current backoff will be prioritized
TopicMessageQuerystart time should have a default
AccountUpdateTransaction.[Set|Get]AliasKey
Account[Approve|Adjust]AllowanceTransaction.Add[Hbar|Token|TokenNft]AllowanceWithOwner()
ContractCreateFlowAccount[Approve|Adjust]AllowanceTransaction.add[Hbar|Token|TokenNft]AllowanceWithOwner()Query.[Set|Get]PaymentTransactionID- Verbose logging using zerolog
*[Transaction|Query].[Set|Get]GrpcDeadline()
HbarAllowance.OwnerAccountID, wasn't being set.- Min/max backoff for nodes should start at 8s to 60s
- The current backoff for nodes should be used when sorting inside of network meaning nodes with a smaller current backoff will be prioritized
AccountUpdateTransaction.[Set|Get]AliasKey
ownerfield to*Allowance.- Added free
AddressBookQuery.
- Changed mirror node port to correct one, 443.
- Occasional ECDSA invalid length error.
- ContractIDFromString() now sets EvmAddress correctly to nil, when evm address is not detected
ownerfield to*Allowance.- Added free
AddressBookQuery.
- Changed mirror node port to correct one, 443.
- CREATE2 Solidity addresses can now be represented by a
ContractIdwithEvmAddressset. ContractId.FromEvmAddress()ContractFunctionResult.StateChangesContractFunctionResult.EvmAddressContractStateChangeStorageChange- New response codes.
ChunkedTransaction.[Set|Get]ChunkSize(), and changed default chunk size forFileAppendTransactionto 2048.AccountAllowance[Adjust|Approve]TransactionAccountInfo.[hbar|token|tokenNft]Allowances[Hbar|Token|TokenNft]Allowance[Hbar|Token|TokenNft]AllowanceTransferTransaction.set[Hbar|Token|TokenNft]TransferApproval()
- Requests not cycling though nodes.
- Free queries not attempting to retry on different nodes.
ContractId.FromSolidityAddress(), useContractId.FromEvmAddress()instead.ContractFunctionResult.CreatedContractIDs.
- CREATE2 Solidity addresses can now be represented by a
ContractIdwithEvmAddressset. ContractId.FromEvmAddress()ContractFunctionResult.StateChangesContractFunctionResult.EvmAddressContractStateChangeStorageChange- New response codes.
ChunkedTransaction.[Set|Get]ChunkSize(), and changed default chunk size forFileAppendTransactionto 2048.AccountAllowance[Adjust|Approve]TransactionAccountInfo.[hbar|token|tokenNft]Allowances[Hbar|Token|TokenNft]Allowance[Hbar|Token|TokenNft]AllowanceTransferTransaction.set[Hbar|Token|TokenNft]TransferApproval()
- Requests not cycling though nodes.
- Free queries not attempting to retry on different nodes.
ContractId.FromSolidityAddress(), useContractId.FromEvmAddress()instead.ContractFunctionResult.CreatedContractIDs.
- CREATE2 Solidity addresses can now be represented by a
ContractIdwithEvmAddressset. ContractId.FromEvmAddress()ContractFunctionResult.StateChangesContractFunctionResult.EvmAddressContractStateChangeStorageChange- New response codes.
ChunkedTransaction.[Set|Get]ChunkSize(), and changed default chunk size forFileAppendTransactionto 2048.AccountAllowance[Adjust|Approve]TransactionAccountInfo.[hbar|token|tokenNft]Allowances[Hbar|Token|TokenNft]Allowance[Hbar|Token|TokenNft]AllowanceTransferTransaction.set[Hbar|Token|TokenNft]TransferApproval()
- Requests not cycling though nodes.
- Free queries not attempting to retry on different nodes.
ContractId.FromSolidityAddress(), useContractId.FromEvmAddress()instead.ContractFunctionResult.CreatedContractIDs.
- Support for regenerating transaction IDs on demand if a request
responses with
TRANSACITON_EXPIRED
- Support for regenerating transaction IDs on demand if a request
responses with
TRANSACITON_EXPIRED
AccountId.AliasKey, includingAccountId.[From]String()support.[PublicKey|PrivateKey].ToAccountId().AliasKeyfields inTransactionRecordandAccountInfo.Noncefield inTransactionId, includingTransactionId.[set|get]Nonce()Childrenfields inTransactionRecordandTransactionReceiptDuplicatesfield inTransactionReceipt[TransactionReceiptQuery|TransactionRecordQuery].[Set|Get]IncludeChildren()TransactionReceiptQuery.[Set|Get]IncludeDuplicates()- New response codes.
- Support for ECDSA SecP256K1 keys.
PrivateKeyGenerate[ED25519|ECDSA]()[Private|Public]KeyFrom[Bytes|String][DER|ED25519|ECDSA]()[Private|Public]Key.[Bytes|String][Raw|DER]()DelegateContractId*Id.[from|to]SolidityAddress()
PrivateKeyGenerate(), usePrivateKeyGenerate[ED25519|ECDSA]()instead.
AccountId.AliasKey, includingAccountId.[From]String()support.[PublicKey|PrivateKey].ToAccountId().AliasKeyfields inTransactionRecordandAccountInfo.Noncefield inTransactionId, includingTransactionId.[set|get]Nonce()Childrenfields inTransactionRecordandTransactionReceiptDuplicatesfield inTransactionReceipt[TransactionReceiptQuery|TransactionRecordQuery].[Set|Get]IncludeChildren()TransactionReceiptQuery.[Set|Get]IncludeDuplicates()- New response codes.
- Support for ECDSA SecP256K1 keys.
PrivateKeyGenerate[ED25519|ECDSA]()[Private|Public]KeyFrom[Bytes|String][DER|ED25519|ECDSA]()[Private|Public]Key.[Bytes|String][Raw|DER]()
PrivateKeyGenerate(), usePrivateKeyGenerate[ED25519|ECDSA]()instead.
- New smart contract response codes
ContractCallQuery.[Set|Get]MaxResultSize()ContractUpdateTransaction.[Set|Get]ByteCodeFileID()
- New smart contract response codes
ContractCallQuery.[Set|Get]MaxResultSize()ContractUpdateTransaction.[Set|Get]ByteCodeFileID()
TransferTransaction.GetTokenTransfers()TransferTransaction.AddTokenTransfer()- Persistent error not being handled correctly
TransactionReceiptQueryshould return even on a bad status codes. Only *.GetReceipt()should error on nonSUCCESS` status codes
- Refactored and updated node account ID handling to err whenever a node account ID of 0.0.0 is being set
ContractCallQuery.[Set|Get]MaxResultSize()ContractUpdateTransaction.[Set|Get]ByteCodeFileID()
TransactionReceiptQueryshould fill outTransactionReceipteven when a badStatusis returned
TransferTransactionshould serialize the transfers list deterministically
- Support for toggling TLS for both mirror network and services network
FreezeTypeFreezeTransaction.[get|set]FreezeType()
- Support for HIP-24 (token pausing)
TokenInfo.PauseKeyTokenInfo.PauseStatusTokenCreateTransaction.PauseKeyTokenUpdateTransaction.PauseKeyTokenPauseTransactionTokenUnpauseTransaction
- Support for automatic token associations
TransactionRecord.AutomaticTokenAssociationsAccountInfo.MaxAutomaticTokenAssociationsAccountCreateTransaction.MaxAutomaticTokenAssociationsAccountUpdateTransaction.MaxAutomaticTokenAssociationsTokenRelationship.AutomaticAssociationTokenAssociation
Transaction*helper methods - should make it easier to use the result ofTransactionFromBytes()
- TLS now properly confirms certificate hashes
TokenUpdateTransaction.GetExpirationTime()returns the correct time- Several
*.Get*()methods required a parameter similiar to*.Set*()This has been changed completely instead of deprecated because we treated this as hard bug - Several
nildereference issues related to to/from protobuf conversions
- Support for automatic token associations
TransactionRecord.AutomaticTokenAssociationsAccountInfo.MaxAutomaticTokenAssociationsAccountCreateTransaction.MaxAutomaticTokenAssociationsAccountUpdateTransaction.MaxAutomaticTokenAssociationsTokenRelationship.AutomaticAssociationTokenAssociation
- Support for TLS
- Setters which follow the builder pattern to
Custom*Fee Client.[min|max]Backoff()support
TokenNftInfoQuery.ByNftID()- useTokenNftInfoQuery.SetNftID()insteadTokenNftInfoQuery.[By|Set|Get]AccountId()with no replacementTokenNftInfoQuery.[By|Set|Get]TokenId()with no replacementTokenNftInfoQuery.[Set|Get]Start()with no replacementTokenNftInfoQuery.[Set|Get]End()with no replacement
AssessedCustomFee.PayerAccountIDswas misspelled
- Support for
CustomRoyaltyFee - Support for
AssessedCustomFee.payerAccountIds
nildereference issues within*.validateNetworkIDs()
- Implement
Client.pingAll() - Implement
Client.SetAutoChecksumValidation()which validates all entity ID checksums on requests before executing
- nil dereference errors when decoding invalid PEM files
- Updated
Statuswith new response codes - Support for
Hbar.[from|to]String()to be reversible
*.AddCustomFee()use*.SetCustomFees()instead
- Update
Statuswith new codes
PrivateKey.LegacyDerive()should correctly handle indicies
- 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
- All requests should retry on gRPC error
INTERNALif the message containsRST_STREAM AccountBalance.Tokensas a replacement forAccountBalance.TokenAccountBalance.TokenDecimals- All transactions will now
sign-on-demandwhich should result in improved performance
TopicMessageQuerynot callingUnsubscribewhen a stream is cancelledTopicMessageQueryshould add 1 nanosecond to theStartTimeof the last received messageTopicMessageQueryallocate space for entire chunked message ahead of time for retriesTokenDeleteTransaction.SetTokenID()incorrectly settingtokenIDresulting inGetTokenID()always returning an emptyTokenIDTransferTransaction.GetTokenTransfers()incorrectly setting an empty value
AccountBalance.TokenuseAccountBalance.Tokensinstead
Client.SetMirroNetwork()producing a nil pointer exception on next use of a mirror network- Mirror node TLS no longer producing nil pointer exception
- Support TLS for mirror node connections.
- Support for entity ID checksums which are validated whenever a request begins execution. This includes the IDs within the request, the account ID within the transaction ID, and query responses will contain entity IDs with a checksum for the network the query was executed on.
TransactionTransaction.AddHbarTransfer()incorrectly determine total transfer per account ID
TopicMessageQuery.MaxBackoffwas not being used at allTopicMessageQuery.Limitwas being incorrectly update with fullTopicMessagesrather than per chunkTopicMessageQuery.StartTimewas not being updated each time a message was receivedTopicMessageQuery.CompletionHandlerwas be called at incorrect times- Removed the use of locks and
sync.MapwithinTopicMessageQueryas it is unncessary - Added default logging to
ErrorHandlerandCompletionHandler
- Support for
MaxBackoff,MaxAttempts,RetryHandler, andCompletionHandlerinTopicMessageQuery - Default logging behavior to
TopicMessageQueryif an error handler or completion handler was not set
- Renamed
ScheduleInfo.Signers->ScheduleInfo.Signatories TopicMessageQueryretry handling; this should retry on more gRPC errorsTopicMessageQuerymax retry timeout; before this would could wait up to 4m with no feedbackdurationFromProtobuf()incorrectly calculation duration*Token.GetAutoRenewPeriod()and*Token.GetExpirationTime()nil dereferenceHbar.As()using multiplication instead of division, and should return afloat64
- Exposed
Hbar.Negated()
- Scheduled transaction support:
ScheduleCreateTransaction,ScheduleDeleteTransaction, andScheduleSignTransaction - Non-Constant Time Comparison of HMACs [NCC-E001154-006]
- Decreased
CHUNK_SIZE4096->1024 and increased default max chunks 10->20
- Non-Constant Time Comparison of HMACs [NCC-E001154-006]
- Decreased
CHUNK_SIZE4096->1024 and increased default max chunks 10->20 - Renamed
ScheduleInfo.GetTransaction()->ScheduleInfo.getScheduledTransaction()
Transaction.Schedule()should error when scheduling un-scheduable tranasctions
noncefromTransactionIDScheduleTransactionBody- should not be part of the public API
Transaction[Receipt|Record]Queryshould not error for statusIDENTICAL_SCHEDULE_ALREADY_CREATEDbecause the other fields on the receipt are present with that status.ErrHederaReceiptStatusshould printexception receipt status ...instead ofexception precheck status ...
- Executiong should retry on status
PLATFORM_TRANSACTION_NOT_CREATED - Error handling throughout the SDK
- A precheck error shoudl be returned when the exceptional status is in the header
- A receipt error should be returned when the exceptional status is in the receipt
TransactionRecordQueryshould retry on node precheck codeOKonly if we're not getting cost of query.Transaction[Receipt|Record]Queryshould retry on bothRECEIPT_NOT_FOUNDandRECORD_NOT_FOUNDstatus codes when node precheck code isOK
- Updated scheduled transaction to use new HAPI porotubfs
ScheduleCreateTransaction.AddScheduledSignature()ScheduleCreateTransaction.GetScheduledSignatures()ScheduleSignTransaction.addScheduledSignature()ScheduleSignTransaction.GetScheduledSignatures()
- 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 includingbodyBytesof a scheduled transactionScheduleId
- Support for scheduled and nonce in
TransactionIdTransactionIdWithNonce()- Supports creating transaction ID with random bytes.TransactionId.[Set|Get]Scheduled()- Supports scheduled transaction IDs.
TransactionIdWithValidStart()
- Updated protobufs #120
NewTransactionId()- UseTransactionIdWithValidStart()instead.
- All requests support getter methods as well as setters.
- All requests support multiple node account IDs being set.
TransactionFromBytes()supports multiple node account IDs and existing signatures.- All requests support a max retry count using
SetMaxRetry()