hedera_flutter_sdk 0.2.2-dev
hedera_flutter_sdk: ^0.2.2-dev copied to clipboard
The first native Flutter/Dart SDK for the Hedera network. Pure Dart, no platform channels. Supports HBAR, HTS, HCS, and Mirror Node. Built for mobile and desktop.
Changelog #
All notable changes to hedera_flutter_sdk will be documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.2.2-dev #
Phase 3 continues: fungible token transfers.
Added #
CryptoTransferTransaction.addTokenTransfer(TokenId, AccountId, int, {int? expectedDecimals}): transfers fungible tokens between accounts, in the same transaction as HBAR transfers if desiredexpectedDecimalsis OPTIONAL; when set, the network verifies the token's actual decimals match before applying the transfer, guarding against decimals changing between building and executing the transaction
example/phase3/token_transfer_example.dart: end-to-end example transferring a token between a treasury and a second account, including a correctexpectedDecimalsusage and a local error case- 18 new unit tests in
crypto_transfer_transaction_test.dart(setters, per-token sum-to-zero validation,expectedDecimalsconflict detection, serialization,buildBody()integration)
Notes #
- Hedera has no separate token transfer transaction type; all
transfers (HBAR, fungible tokens, NFTs) use the same
CryptoTransferTransaction/TransferTransaction. This version extends the SDK's existing class rather than introducing a new one. expectedDecimalsis tied to the whole set of transfers for a given token, not to each individual transfer entry. IfaddTokenTransfer()is called multiple times for the same token with conflicting non-nullexpectedDecimalsvalues, the SDK throwsArgumentErrorlocally rather than silently picking one. No official guidance was found for this specific edge case; this is a deliberately conservative choice.- NFT transfers (
addNftTransfer()) are deferred to v0.2.4-dev. - While building the live example, found that
AccountBalanceQuery(from Phase 2) only exposes HBAR balance, not per-token balances. Extending it is planned for v0.2.6-dev (token queries).
Official References #
Verified #
Live on Hedera testnet: created a treasury account and a fungible
token, created and associated a second account (Bob), transferred
25.00 DEMO treasury -> Bob (SUCCESS), 10.00 DEMO Bob -> treasury
(SUCCESS), and a further 1.00 DEMO with expectedDecimals set
(SUCCESS). Confirmed the conflicting-expectedDecimals case is
caught locally, before any network call.
Status #
Phase 3 in progress: fungible token transfers implemented and
verified live on testnet.
Not ready for production use.
Next: mint / burn (v0.2.3-dev).
0.2.1-dev #
Phase 3 continues: account-to-token association.
Added #
TokenAssociateTransaction: associates an account with one or more HTS tokens, required before that account can send or receive themsetAccountId()(required),addTokenId()(required, at least one; can be called multiple times)
TokenDissociateTransaction: dissociates an account from one or more HTS tokens; the account MUST have a zero balance of each token or the transaction resolves toTRANSACTION_REQUIRES_ZERO_TOKEN_BALANCESsetAccountId()(required),addTokenId()(required, at least one; can be called multiple times)
example/phase3/token_associate_example.dart: end-to-end example creating a token, creating an unassociated account, associating it, then dissociating it- 34 new unit tests:
token_associate_transaction_test.dartandtoken_dissociate_transaction_test.dart(defaults, setters,toBytes()serialization,buildBody()integration confirmingtokenAssociate/tokenDissociateoneof routing) - 600 total unit tests passing
Notes #
- Official docs list a
setHighVolume()property (HIP-1313) forTokenAssociateTransaction. Regenerating the SDK's Protobuf definitions did not surface a corresponding field onTokenAssociateTransactionBody, and the actively maintainedhiero-ledger/hiero-sdk-javareference implementation does not reference one either. This is left out of the SDK for now and will be revisited once confirmed on the Protobuf side.
Official References #
- https://docs.hedera.com/hedera/sdks-and-apis/sdks/token-service/associate-tokens-to-an-account
- https://docs.hedera.com/hedera/sdks-and-apis/sdks/token-service/dissociate-tokens-from-an-account
Verified #
Live on Hedera testnet: created a treasury account and a fungible
token, created a second unassociated account, associated it with the
token (SUCCESS), then dissociated it with a zero balance
(SUCCESS). No maxTransactionFee override was needed, unlike
TokenCreateTransaction.
Status #
Phase 3 in progress: account-to-token association implemented and
verified live on testnet.
Not ready for production use.
Next: token transfers (v0.2.2-dev).
0.2.0-dev #
Phase 3 begins: Hedera Token Service (HTS), fungible token creation.
Added #
TokenCreateTransaction: creates a new fungible or non-fungible token, with all 22 fields from the official token creation reference- Required:
tokenName,tokenSymbol,treasuryAccountId - Optional:
decimals,initialSupply,adminKey,kycKey,freezeKey,wipeKey,supplyKey,pauseKey,feeScheduleKey,metadataKey,freezeDefault,expirationTime,autoRenewAccountId,autoRenewPeriod,tokenMemo,tokenType,supplyType,maxSupply,metadata - Token keys accept any
HederaKey(a singlePublicKey,HederaKeyList, orHederaThresholdKey), enabling multi-sig control over token administration
- Required:
TokenId.toProto(): converts to the ProtobufTokenIDrepresentation, following the same pattern asAccountId.toProto()example/phase3/token_create_example.dart: end-to-end example creating a treasury account and a fungible token ("USD Bar" / USDB) with a supply key- 66 new unit tests:
token_create_transaction_test.dart, covering defaults, setters,toBytes()serialization for all 22 fields (including aHederaThresholdKeyas a token key), andbuildBody()integration - 566 total unit tests passing
Changed #
- BREAKING:
Transaction.executeGrpc()now receives a rawClientChannelinstead of a pre-builtCryptoServiceClient; each subclass constructs the specific gRPC service client it needs (CryptoServiceClientfor account/HBAR transactions,TokenServiceClientfor token transactions). UpdatedAccountCreateTransaction,AccountUpdateTransaction,AccountDeleteTransaction, andCryptoTransferTransactionaccordingly. This unblocks token transactions now and Hedera Consensus Service (HCS) transactions in a future phase.
Fixed #
PublicKey.toProtoKey()(viaHederaKey) now correctly encodes ECDSA keys with theeCDSASecp256k1Protobuf field; previously affected token admin/supply/etc. keys the same way it had previously affected account keys before the v0.1.4-dev fix
Verified #
- Live on Hedera testnet: created a treasury account, generated a
supply key, and created a fungible token ("USD Bar" / USDB, 2
decimals, 100 initial supply) — confirmed
SUCCESSstatus and correct token ID via HashScan (seeexample/phase3/token_create_example.dart) - Confirmed token creation requires a higher
maxTransactionFeethan account creation (the inherited 2 HBAR default triggersINSUFFICIENT_TX_FEE), since it includes aCryptoTransferto move the initial supply to the treasury per official docs
Status #
Phase 3 started: fungible token creation implemented and verified
live on testnet.
Not ready for production use.
Next: account-to-token association (v0.2.1-dev).
0.1.4-dev #
Phase 2 extension: multi-signature accounts, plus a critical node-routing fix carried over from v0.1.3-dev.
Added #
HederaKey: interface for anything that can serve as a Hedera account's authorization key (lib/src/crypto/hedera_key.dart)toProtoKey(): converts to the ProtobufKeyrepresentation
PublicKeynow implementsHederaKeyHederaKeyList: N-of-N key list, requiring all keys to sign (lib/src/crypto/hedera_key_list.dart); supports nestedHederaKeyList/HederaThresholdKeyentriesHederaThresholdKey: M-of-N threshold key, requiring at leastthresholdofkeysto sign; validatesthresholdis between 1 andkeys.lengthat construction; supports nestingAccountCreateTransaction.setKey()andAccountUpdateTransaction.setKey()now accept anyHederaKey(a singlePublicKey,HederaKeyList, orHederaThresholdKey), not only a singlePublicKeyHederaClient.channelFor(HederaNode): creates a gRPC channel connected to a specific node's endpointHederaClient.resolveNode(): resolves the node for a transaction, either an explicitnodeAccountId(looked up in the live node list) or viaselectNode()round-robinexample/phase2/multi_sig_example.dart: end-to-end 2-of-3 multi-signature example (create account, sign with 2 of 3 keys, execute a transfer)- 26 new unit tests:
hedera_key_test.dart(25 tests) plus updates toAccountCreateTransaction/AccountUpdateTransactioncoverage - 502 total unit tests passing
Fixed #
- Critical: fixed
INVALID_NODE_ACCOUNTerrors introduced in v0.1.3-dev.HederaClient.selectNode()'s round-robin wrote a dynamicnodeAccountIDinto eachTransactionBody, but the gRPC connection used to submit it (HederaClient.channel) always connected to a single static generic hostname, regardless of which node was selected. When the selected node didn't match whichever node the static connection actually reached, the network rejected the transaction. This affectedTransaction.execute()calls intermittently, not only multi-signature transactions. Fixed by connecting viaHederaClient.channelFor()to the specific node resolved for each transaction attempt, including on retry/failover. PublicKey.toProtoKey()(via the newHederaKeyinterface) now correctly uses theeCDSASecp256k1Protobuf field for ECDSA keys; previously,AccountCreateTransaction/AccountUpdateTransactionalways hardcoded theed25519field, silently mis-encoding ECDSA account keys
Verified #
- 2-of-3 multi-signature account created and used end-to-end on
Hedera testnet: account creation, signing a transfer with exactly
2 of 3 keys, and successful execution, all confirmed live (see
example/phase2/multi_sig_example.dart) INVALID_NODE_ACCOUNTfix confirmed by the same live run
Status #
Phase 2 extension complete: multi-signature account support
(HederaKeyList/HederaThresholdKey) implemented and verified live
on testnet; the v0.1.3-dev node-routing bug is resolved.
Not ready for production use.
Next: Phase 3 - Hedera Token Service (HTS) (v0.2.0-dev).
0.1.3-dev #
Phase 2 extension: multi-node load balancing with retry/failover.
Added #
HederaNode: model representing a single consensus node (account ID + gRPC endpoint)HederaClient.selectNode(): round-robin node selection over a dynamically fetched node listHederaClient._getNodeList(): fetches the live node list from the Mirror Node REST API (/api/v1/network/nodes), cached for 24 hours; filters each node'sservice_endpointsby the port matching the active network (50211 insecure, 50212 TLS for mainnet); falls back to the static0.0.3node if the Mirror Node is unreachableRetryPolicy: configurable retry policy for transient node/network failures (lib/src/client/retry_policy.dart)isRetryable(Object error): retriesGrpcErrorcodesunavailable,deadlineExceeded,internal; never retries business errors likeHederaStatusException(e.g.INVALID_SIGNATURE), since those fail identically on any nodebackoffFor(int attempt): exponential backoff, capped atmaxBackoffHederaClient.setRetryPolicy()/retryPolicy: configure per client
HederaConstants.defaultMaxRetryAttempts: defaults to 5Transaction.execute(): now retries transient failures per the activeRetryPolicy, rotating to a new node between attempts when the SDK still holds the signing key (operator auto-sign path); for pre-signed transactions (sign()/signWith()called beforeexecute()), retries against the same node instead, since the SDK no longer holds the private key needed to re-sign for a new nodeexample/phase2/node_selection_check.dart: manual verification script for node selection behaviorexample/phase2/retry_behavior_check_example.dart: manual verification script covering 4 retry/failover scenarios (transient recovery, exhausted attempts, non-retryable business errors, pre-signed same-node retry)- 43 new unit tests:
retry_policy_test.dart(18 tests),transaction_retry_test.dart(7 tests), plus updates to existingbuildBody/buildSignedTransactioncoverage - 475 total unit tests passing
Changed #
- BREAKING:
Transaction.buildBody()andTransaction.buildSignedTransaction()are nowasync(returnFuture), since they may callHederaClient.selectNode() Transaction.buildBody(): usesclient.selectNode()instead of the hardcodedAccountId.fromString('0.0.3')default when nonodeAccountIdis explicitly set
Verified #
- Real Mirror Node fetch and round-robin confirmed manually against Hedera testnet: rotates through real nodes 0.0.3–0.0.9 with matching real IPs, wraps around correctly, caching confirmed (only first call hits the network)
- Retry/failover behavior confirmed manually across all 4 scenarios
(see
retry_behavior_check_example.dart), including that business errors are never retried and pre-signed transactions correctly skip re-signing
Status #
Phase 2 extension complete: multi-node load balancing (fetch +
round-robin) and retry/failover both implemented and verified.
Not ready for production use.
Next: multi-signature support - KeyList with M-of-N threshold
(v0.1.4-dev), before starting Phase 3 (HTS).
0.1.2-dev #
Phase 2 complete: ECDSA(secp256k1) signing support, for EVM-compatible accounts.
Added #
PrivateKey.derivePublicKey(): ECDSA(secp256k1) public key derivation using pointycastle'sECDomainParameters('secp256k1'); returns the compressed 33-byte form (0x02/0x03prefix)PrivateKey.sign(): ECDSA(secp256k1) signing viaECDSASignerwith RFC 6979 deterministic k generation and low-S normalization (s <= n/2), as required by Hedera; returns the raw 64-byte (r + s) signaturePublicKey.fromBytes(): accepts 33-byte compressed ECDSA public keysPublicKey.toDerString(): DER encoding for ECDSA public keysPublicKey.verify(): ECDSA(secp256k1) signature verificationPublicKey.fromString(): recognizes DER-encoded and raw hex ECDSA public keys, alongside the existing ED25519 formatsHederaConstants.ecdsaPublicKeyPrefix: DER prefix for ECDSA public keys- ECDSA examples in
public_key_example.dartandprivate_key_example.dart - 32 new unit tests in
private_key_test.dartandpublic_key_test.dartcovering ECDSA sign, derivePublicKey, and verify (mirroring existing ED25519 coverage, plus low-S normalization and compression prefix checks) - 5 new unit tests in
transaction_test.dartverifyingSignaturePairroutes to the correct field by key type, including a mixed-signer transaction with both ED25519 and ECDSA signatures - 450 total unit tests passing
Fixed #
- ECDSA
sign()/verify()were hashing the message with SHA-256 instead of the Keccak-256 required by HIP-222 for EVM compatibility; now use pointycastle'sKeccakDigest(256) Transaction.buildSignedTransaction()andTransaction.execute()always builtSignaturePairwith theed25519field regardless of key type, silently misrouting ECDSA signatures into the wrong protobuf oneof field;_signaturesnow tracksPublicKeyTypeper entry and branches toeCDSASecp256k1accordingly
Status #
Phase 2 complete: ECDSA(secp256k1) signing implemented and verified
via unit tests, alongside the existing ED25519 support.
Live testnet integration verification for ECDSA (account creation,
signing, receipt confirmation) deferred to next session.
Not ready for production use.
Next: multi-node load balancing (v0.1.3-dev).
0.1.1-dev #
Transaction query completeness: public receipt and record query classes.
Added #
TransactionReceiptQuery: public query class to poll the receipt of any Hedera transaction by ID, including transactions not executed by the callersetTransactionId(TransactionId): sets the transaction ID to querytoBytes(): serializes toTransactionGetReceiptQueryProtobufexecute(HederaClient): polls every 2 seconds until SUCCESS or timeout (30 seconds); returnsTransactionReceiptwithstatus,accountId, andtokenId
TransactionRecordQuery: public query class to retrieve the full record of a completed Hedera transactionsetTransactionId(TransactionId): sets the transaction ID to querytoBytes(): serializes toTransactionGetRecordQueryProtobufexecute(HederaClient): pollsgetTxRecordByTxID()every 2 seconds until the record is available or timeout (30 seconds); returnsTransactionRecordwith fee, consensus timestamp, status, accountId, tokenId, and full HBAR transfer list
TransactionResponse.getRecord(HederaClient): polls the network for the full transaction record; replacesUnimplementedErrorTransactionRecord: expanded model with new fields:consensusTimestamp: exact consensus time asDateTimein UTCstatus: final transaction status (e.g.SUCCESS)accountId: new account ID forAccountCreateTransactiontokenId: new token ID forTokenCreateTransactiontransfers: list of HBAR transfers withaccountIdandamount
- 24 new unit tests (409/409 -> 433/433 total passing)
Changed #
TransactionReceiptQueryandTransactionRecordQueryrenamed fromTransactionGetReceiptQueryandTransactionGetRecordQueryto avoid naming collision with Protobuf-generated classes on Ubuntu CItransaction_receipt_query.dartandtransaction_record_query.dartrenamed accordingly
Status #
Phase 2 complete: full transaction query pipeline implemented.
TransactionReceiptQuery, TransactionRecordQuery, and getRecord()
all available and verified.
Not ready for production use.
Next: ECDSA signing (v0.1.2-dev).
0.1.0-dev #
Phase 2 complete: gRPC transaction execution, account management, and HBAR transfers verified on Hedera testnet.
Added #
Transaction.buildBody(HederaClient): builds a completeTransactionBodyProtobuf withtransactionID(operator account + nanosecond timestamp),nodeAccountID(default0.0.3),transactionFee,transactionValidDuration, andmemo; callsapplyToBody()for the transaction-specific fieldsTransaction.applyToBody(TransactionBody): abstract method implemented by each subclass to set its specific field on theTransactionBodyProtobuf (cryptoCreateAccount,cryptoTransfer, etc.)Transaction.buildSignedTransaction(HederaClient): serializesTransactionBodytobodyBytes, wraps withSignatureMapinto aSignedTransactionProtobufTransaction.execute(HederaClient): full gRPC execution pipeline: builds and cachesbodyBytes, signs with operator or custom key, constructsSignedTransactionandTransactionenvelope, submits via gRPC, verifiesnodeTransactionPrecheckCode, returnsTransactionResponseTransaction.signWith(PrivateKey, HederaClient): signs the transaction with a non-operator private key using the correct cachedbodyBytes; use when a non-operator account needs to authorize a transactionTransaction.setPayerAccountId(AccountId): sets the account that pays transaction fees; if not set, the operator account is used by defaultTransaction._buildBodyBytes(HederaClient): internal cache for serializedTransactionBodybytes; guarantees byte consistency acrosssignWith()andexecute()callsTransactionResponse.getReceipt(HederaClient): pollsCryptoService.getTransactionReceipts()every 2 seconds (up to 15 attempts / 30 seconds) until consensus is reached; returnsTransactionReceiptwithstatus,accountId, andtokenId; throwsHederaStatusExceptionon non-SUCCESS status; throwsTimeoutExceptionafter 30 secondsAccountCreateTransaction.applyToBody(): setscryptoCreateAccountwithautoRenewPeriod = 7,776,000s(90 days, required by Hedera)AccountUpdateTransaction.applyToBody(): setscryptoUpdateAccountAccountDeleteTransaction.applyToBody(): setscryptoDeleteCryptoTransferTransaction.applyToBody(): setscryptoTransfer; validates that transfer amounts sum to zeroTransaction.executeGrpc(CryptoServiceClient, Transaction): abstract method returningTransactionResponseProtobuf; each subclass routes to the correctCryptoServiceClientmethodHederaClient.channel: lazy-initializedClientChannel; insecure on port 50211 for testnet/previewnet, TLS on port 50212 for mainnetHederaClient.cryptoClient: returnsCryptoServiceClientconnected to the active network nodeHederaClient.close(): shuts down the gRPC channel and releases resources- Integration test infrastructure:
test/integration/integration_test_helper.dart: reads operator credentials fromHEDERA_OPERATOR_IDandHEDERA_OPERATOR_KEYtest/integration/transactions/account_create_transaction_test.dart: 2 tests verified on Hedera testnet (account0.0.9358959created)test/integration/transactions/account_setup_test.dart: utility test to create funded testnet accounts and print credentialstest/integration/transactions/crypto_transfer_transaction_test.dart: operator-signed HBAR transfers withgetReceipt()SUCCESStest/integration/transactions/crypto_transfer_sign_test.dart: non-operator signing viasignWith()andsetPayerAccountId(); reads Alice credentials fromHEDERA_ALICE_IDandHEDERA_ALICE_KEY
- New examples:
example/phase2/quick_start_example.dart: simplest flow with bilingual comments (EN/ES)example/phase2/account_lifecycle_example.dart: complete end-to-end flow - create Alice, create Bob, Alice transfers HBAR to Bob using her own key and paying her own fees; bilingual comments (EN/ES)example/phase2/hedera_service_example.dart:HederaServicepattern for Flutter apps withinit()anddispose()lifecycle; bilingual comments (EN/ES)
- 45 new unit tests (363/363 -> 407/407 total passing)
Changed #
Transaction.execute(): refactored to signbodyBytes(completeTransactionBody) instead oftoBytes()(specific body only); fixesINVALID_SIGNATUREon Hedera nodesHederaClient.channel: switched from TLS to insecure for testnet and previewnet to avoid certificate verification issues in developmentexample/hedera_flutter_sdk_example.dart: updated with GETTING STARTED, QUICK START, and PHASE OVERVIEW sections; documents Windows/macOS/Linux environment variable setup
Fixed #
INVALID_RENEWAL_PERIOD: addedautoRenewPeriodtoAccountCreateTransaction.applyToBody()INVALID_SIGNATURE: signing now uses cachedbodyBytesfrom_buildBodyBytes()ensuring the signed bytes match exactly what the node receives inSignedTransactionTransactionIdinTransactionResponse: now extracted from the builtTransactionBodyinstead ofDateTime.now(), ensuring correct timestamp forgetReceipt()polling
Verified on Hedera Testnet #
- Operator account:
0.0.9186292(ED25519, testnet) - Accounts created:
0.0.9358959,0.0.9365895,0.0.9367078,0.0.9367079(visible on HashScan) - HBAR transfers: operator to receiver and Alice to Bob (non-operator signing with custom fee payer)
- All transactions visible at:
https://hashscan.io/testnet/account/0.0.9186292/operations
Status #
Phase 2 complete: full gRPC execution pipeline working end-to-end on
Hedera testnet. Account creation, HBAR transfers, receipt polling,
non-operator signing, and custom fee payers all verified.
Not ready for production use.
Next: Hedera Token Service (HTS) - Phase 3.
0.0.9-dev #
Phase 2 in progress: HBAR transfers and EVM address compatibility.
Added #
CryptoTransferTransaction: transfers HBAR between Hedera accountsaddHbarTransfer(AccountId, Hbar), callable multiple timestransferCountgettertoBytes()validates that transfer amounts sum to zero before serializing viaCryptoTransferTransactionBodyProtobuf- throws
ArgumentErrorif no transfers added or sum is not zero
AccountId.evm()andAccountId.fromEvmAddress(): EVM-compatible address alias support (20-byte addresses, e.g. for MetaMask)isEvmAddressgettertoString()handles both native (shard.realm.num) and EVM (0x...) formats
AccountId.toProto(): centralizesAccountIDProtobuf construction, correctly using thealiasfield for EVM accounts (oneofwithaccountNum)example/phase2/transaction_example.dart: expanded withAccountUpdateTransaction,AccountDeleteTransaction, andCryptoTransferTransactionexamplesexample/phase2/query_example.dart: expanded withAccountInfoQueryexample and updated full workflow preview- 42 new unit tests (321/321 -> 363/363 total passing)
Changed #
AccountBalanceQuery,AccountInfoQuery,AccountUpdateTransaction,AccountDeleteTransaction,CryptoTransferTransaction: refactored to useAccountId.toProto()instead of manually constructingAccountID, reducing duplication and enabling transparent EVM alias support- README.md: Current Features and Planned Features updated to reflect Phase 2 progress
- pubspec.yaml: version bumped to 0.0.9-dev
Status #
Phase 2 in progress: Account Management CRUD cycle complete, HBAR
transfers and EVM address alias support added.
Not ready for production use.
Next: gRPC execution (execute() via HederaClient).
0.0.8-dev #
Phase 2 in progress: Account Management CRUD cycle completed.
Added #
AccountInfo: model representing full Hedera account information- accountId, key, balance, deleted, memo, receiverSignatureRequired, maxAutomaticTokenAssociations, ownedNfts
AccountInfoQuery: queries full account informationsetAccountId()(required)toBytes()serializes viaCryptoGetInfoQueryProtobuf
AccountUpdateTransaction: updates an existing Hedera accountsetAccountIdToUpdate()(required); all other fields optionalsetKey(),setNewMemo(),setReceiverSignatureRequired(),setMaxAutomaticTokenAssociations()- Optional fields use Google Protobuf wrapper types (
StringValue,BoolValue,Int32Value) to distinguish "not set" from falsy values toBytes()serializes viaCryptoUpdateTransactionBodyProtobuf
AccountDeleteTransaction: deletes an existing Hedera accountsetAccountId()(required) - account to deletesetTransferAccountId()(required) - receives remaining HBAR balancetoBytes()serializes viaCryptoDeleteTransactionBodyProtobuf
- 61 new unit tests (321/321 total passing)
Changed #
- pubspec.yaml: version bumped to 0.0.8-dev
Status #
Phase 2 in progress: Account Management CRUD cycle completed
(Create, Read, Update, Delete).
Not ready for production use.
Next: CryptoTransferTransaction.
0.0.7-dev #
Phase 2 in progress: Cryptography and Account Management.
Added #
Transaction<T>: abstract base class for all Hedera transactions using Generic Self-Type pattern for fluent API chaining in any ordersetNodeAccountId(),setMaxTransactionFee(),setMemo(),setValidDuration(),setTransactionId()sign(),addSignature(),signWithOperator()execute()stub (gRPC pending)TransactionResponse,TransactionReceipt,TransactionRecord
AccountCreateTransaction: creates a new Hedera accountsetKey()(required),setInitialBalance(),setMaxAutomaticTokenAssociations(),setReceiverSignatureRequired()toBytes()serializes viaCryptoCreateTransactionBodyProtobuf
Query<R, T>: abstract base class for all Hedera queries using Generic Self-Type pattern; payment support pending (requiresCryptoTransferTransaction)AccountBalanceQuery: queries HBAR balance of a Hedera accountsetAccountId()(required)toBytes()serializes viaCryptoGetAccountBalanceQueryProtobuf
example/: restructured into phase-based subfolders
Changed #
example/hedera_flutter_sdk_example.dart: refactored as entry point; imports phase2 examples- pubspec.yaml: version bumped to 0.0.7-dev
- README.md: Phase 2 checklist updated with completed items
Status #
Phase 2 in progress: Cryptography and Account Management.
Not ready for production use.
Next: CryptoTransferTransaction and AccountInfoQuery.
0.0.6-dev #
Phase 2 in progress: Cryptography and Account Management.
Added #
HederaClientwithforTestnet(),forMainnet(),forPreviewnet()Mnemonic.toPrivateKey(): HD key derivation from mnemonic via BIP-39 standard; supports optional passphrase; 12 and 24-word mnemonicsMnemonic.toLegacyPrivateKey(): legacy key derivation for 12 and 24-word mnemonics; 22-word legacy pending (UnsupportedError with reference to github.com/hashgraph/hedera-sdk-go)- Official BIP-39 wordlists (2048 words each; English and Spanish)
Mnemonic.fromString(): create Mnemonic from space-separated phraseMnemonic.validate(): BIP-39 checksum validation for English and SpanishPrivateKey.derivePublicKey(): async ED25519 public key derivationHederaConstants: ASN.1/DER prefix constantsed25519PrivateKeyPrefix(OID 1.3.101.112 - RFC 8410)ecdsaPrivateKeyPrefix(OID 1.3.132.0.10)ed25519PublicKeyPrefix
- README.md: Quick Guide expanded with PrivateKey and PublicKey sections
Changed #
- README.md: Current Features updated with toPrivateKey and toLegacyPrivateKey
- README.md: Planned Features updated; 22-word legacy mnemonic marked pending
Status #
Phase 2 in progress: Cryptography and Account Management.
Not ready for production use.
Next: Transaction base class and Account Management.
0.0.5-dev #
Phase 2 in progress: Cryptography and Account Management.
Added #
PrivateKey: ED25519 and ECDSA key generation, import, and signinggenerateED25519()using cryptography packagegenerateECDSA()using Random.secure()fromBytes()with type parameterfromString()supporting DER and raw hexsign()for ED25519 via cryptography packagetoDerString()andtoHex()using ASN.1/DER prefix constantstoString()does not expose key bytes (security)
PublicKey: derivation, import, and ED25519 signature verificationderivePublicKey()async derivation from PrivateKeyfromBytes()andfromString()supporting DER and raw hexverify()for ED25519 signature verificationtoDerString(),toHex(),toString()(safe to expose)
HederaConstants: ASN.1/DER prefix constants for ED25519 and ECDSAed25519PrivateKeyPrefix(OID 1.3.101.112 - RFC 8410)ecdsaPrivateKeyPrefix(OID 1.3.132.0.10)ed25519PublicKeyPrefix
cryptography ^2.9.0: added for ED25519 key generation and signingexample/: Quick Start examples for Mnemonic, PrivateKey and PublicKey- README.md: Quick Guide expanded with PrivateKey and PublicKey examples
- 54 new unit tests (155/155 total passing)
Changed #
- README.md: Current Features updated with PrivateKey and PublicKey
- README.md: Planned Features updated; removed implemented items
- README.md: encoding issues fixed
Status #
Phase 2 in progress: Cryptography and Account Management. Not ready for production use. Next: Mnemonic.toPrivateKey() HD key derivation and Account Management.
0.0.4-dev #
Phase 2 started: Cryptography and Account Management.
Added #
Mnemonic: BIP-39 mnemonic generation and validation withgenerate24()andgenerate12()in English and SpanishMnemonic.fromString(): create Mnemonic from space-separated phraseMnemonicLanguage: enum withenglishandspanishoptions- Official BIP-39 English wordlist (2048 words)
- Official BIP-39 Spanish wordlist (2048 words); first Hedera SDK with native Spanish mnemonic support for LATAM users
toSeed(): derives 64-byte seed via PBKDF2 with optional passphrasevalidate(): full BIP-39 checksum validation for English and Spanish- 41 unit tests for Mnemonic (101/101 total passing)
Status #
Phase 2 in progress: Cryptography and Account Management. Not ready for production use. Next: ED25519 and ECDSA key generation with pointycastle.
0.0.3-dev #
Fix pana static analysis score from 50/160 to 130/160.
Fixed #
- generate_proto.ps1: include auxiliary/ and state/ subdirectories to resolve missing URI imports in transaction.pb.dart
- pubspec.yaml: add explicit platform declarations (Android, iOS, macOS, Windows, Linux) excluding Web due to gRPC dart:io dependency
- analysis_options.yaml: exclude lib/src/proto/** from analyzer to suppress warnings in auto-generated Protobuf files
Changed #
- pubspec.yaml: version bumped to 0.0.3-dev
Status #
Phase 1 completed. Not ready for production use. pana score: 130/160. Phase 2 starting: Cryptography and Account Management.
0.0.2-dev #
Phase 1 completed - SDK foundation and architecture.
Added #
HederaStatusException: typed exception for Hedera network errorsHederaStatusCode: typed status codes from response_code.proto with common codes (SUCCESS, INSUFFICIENT_ACCOUNT_BALANCE, INVALID_SIGNATURE, TOKEN_NOT_ASSOCIATED, KYC_NOT_GRANTED, etc.)HederaConstants: protocol-level constants for ports, HBAR units, transaction limits, default fees, and network endpoints- Unit tests for all core classes (60/60 passing)
- Protobuf code generation script (generate_proto.ps1)
- 335 Dart classes generated from 104 Hedera HAPI .proto files
Changed #
HederaClient: updated to use HederaConstants for endpoints, ports, and default fees instead of hardcoded valuespubspec.yaml: shortened description for pub.dev compliance- Flutter upgraded to 3.44.0
Status #
Phase 1 completed. Not ready for production use. Phase 2 starting: Cryptography and Account Management.
0.0.1-dev #
Initial SDK scaffold - Phase 1 in progress.
Added #
- Flutter package structure with very_good_analysis linter
- Base model classes: AccountId, TokenId, TransactionId, Hbar
- HederaClient with forTestnet(), forMainnet(), forPreviewnet()
- HederaNetwork enum
- Crypto stubs: PrivateKey, PublicKey, Mnemonic (Phase 2)
- Unit tests: 20/20 passing
- GitHub Actions CI/CD pipeline
- pre_commit.ps1 for local verification
Status #
Phase 1 in progress. Not ready for production use. Full feature set coming in v1.0.0.