0.2.0 — 2026-07-01
Smart Contract Service
Hedera.Client.create_contract/2andcall_contract/3(Hedera.Transaction.contract_create/1/contract_call/1), withHedera.ContractIdandcontract_idon the receipt.contract_createaccepts inline:bytecode(EVM init) or a bytecode:file, plus:gas,:admin_key,:constructor_parameters,:initial_balance. Validated live: deploy inline bytecode →SUCCESS+ contract id → call the contract →SUCCESS(contractCreateInstance = 8,contractCall = 7; return values live in the record, not the receipt — reading them is a follow-up).
protoc-generated wire layer (migration complete)
- Vendored the subset of the HAPI protobufs
hedera_exuses (priv/protos/hedera_min.proto, canonical field numbers) and generate Elixir modules underHedera.Pb.*viaprotoc+protoc-gen-elixir(priv/protos/generate.sh). Adds theprotobufdependency. Hedera.Transactionnow builds and encodes every transaction from generated structs, andHedera.Receiptdecodes via the generatedTransactionReceipt— hand-rolled field-by-field encoding is gone from the transaction/receipt layer. (The generated encoder is proto3-canonical: it omits zero-valued fields and packs repeated scalars, e.g. NFTserialNumbers.)- An equivalence test pins the generated modules as wire-compatible with the
original hand-rolled encoder in both directions (submit-message bytes,
generated↔
Hedera.Protodecode, ZigZagsint64, receipts). The full transaction suite — HCS / Crypto / HTS / NFT / File / Schedule — was re-validated live on testnet after the migration (allSUCCESS). (Hedera.Protoremains for the small gRPC query/response framing.)
File Service
Hedera.Client.create_file/2,append_file/4,update_file/3,delete_file/2(Hedera.Transaction.file_create/1etc.), withHedera.FileIdandfile_idon the receipt. Files carry aKeyList(defaults to the operator's key → mutable). Validated live: create → append → update → delete, allSUCCESS.
Schedule Service
Hedera.Client.create_schedule/2(a scheduled HBAR/token transfer) andsign_schedule/3(Hedera.Transaction.schedule_create/1/schedule_sign/1), withHedera.ScheduleIdandschedule_idon the receipt. The scheduled transaction is aSchedulableTransactionBody— note its data-oneof numbering differs fromTransactionBody(cryptoTransfer = 9). Validated live: create a transfer pending on a second signer →sign_schedule→ it executes.
Token Service — NFTs & token management
- NFTs —
token_createwithtoken_type: :nft(NON_FUNGIBLE_UNIQUE);token_mintwith:metadata(a list of binaries); mint receipts now exposeserial_numbers(packed or unpacked). NFT transfers viaHedera.Client.transfer_nft/4(CryptoTransfernftTransfers). - Management —
freeze_token/unfreeze_token,grant_kyc/revoke_kyc,wipe_token(fungible amount or NFT serials),pause_token/unpause_token.token_createnow accepts:kyc_key,:freeze_key,:wipe_key,:pause_key. - Validated live (testnet): create NFT → mint (serials
[1,2]) → pause/unpause; then associate → grantKyc → NFT transfer → freeze/unfreeze → wipe — every step aSUCCESSreceipt, confirming thetokenFreeze(31)/tokenUnfreeze(32)/grantKyc(33)/revokeKyc(34)/tokenWipe(39)/tokenPause(46)/tokenUnpause(47) field numbers and thenftTransfersencoding.
0.1.0 — 2026-07-01 — foundation (alpha)
The cryptographic and encoding foundation, fully unit-tested offline:
- Keccak-256 — pure Elixir (Hedera/Ethereum padding), verified against known vectors.
- Keys —
Hedera.PrivateKey/Hedera.PublicKeyfor Ed25519 and ECDSA secp256k1, with Hedera's signing conventions (Keccak-256 prehash + canonical low-Sr‖sfor ECDSA), 33-byte compressed public keys, sign/verify, hex round-trip. - Identifiers —
AccountId,TopicId,Timestamp(parse / format / protobuf). - Protobuf — minimal proto3 wire encoder (
Hedera.Proto).
Consensus Service (transactions + gRPC)
- Transactions —
Hedera.Transactionencodes and signsTransactionBody→SignedTransaction→TransactionforconsensusSubmitMessageandconsensusCreateTopic. - gRPC —
Hedera.Grpc(unary over HTTP/2 h2c via Mint),Hedera.Network(testnet/mainnet nodes),Hedera.Client(submit_message/3,create_topic/2). - Validated live: a natively-built, natively-signed HCS message submit is accepted by a
Hedera testnet node (pre-check
OK), confirming protobuf field numbers and signing end-to-end. (mix test --include network.)
Receipts & mirror node
- Receipts —
Hedera.Client.transaction_receipt/3polls the free gRPCgetTransactionReceipts;Hedera.Receiptparses status, topic sequence number and running hash. Verified live (submit → SUCCESS receipt with a sequence number). - Mirror node —
Hedera.MirrorNodeREST reads (topic messages, transactions); addsjason.
Reliability
- Address book + retry —
Hedera.Network.testnet_nodes/0lists multiple consensus nodes;Hedera.Clientrebuilds + re-signs per target node and retries the next node on transient (BUSY) pre-checks or transport errors.
Crypto Service (HBAR transfers)
- Transfers —
Hedera.Transaction.crypto_transfer/1andHedera.Client.transfer_hbar/3build and sign acryptoTransferof HBAR between accounts. Amounts are encoded as protobufsint64(ZigZag, viaHedera.Proto.sint64_field/2); debits are negative, credits positive, and must net to zero. - Validated live: a natively-built transfer is accepted by a testnet node (pre-check
OK) and reaches aSUCCESSreceipt, confirming thecryptoTransferfield numbers and theTransferList/AccountAmount(sint64) encoding end-to-end.
Token Service (HTS)
- Tokens —
Hedera.Transactiongainstoken_create/1,token_mint/1,token_burn/1andtoken_associate/1;crypto_transfer/1now also carries:token_transfers.Hedera.Clientgainscreate_token/2,mint_token/4,burn_token/4,associate_token/4,transfer_token/4. NewHedera.TokenId;Hedera.PublicKey.to_key_proto/1encodes aKeymessage (Ed25519 in field 2, ECDSA secp256k1 in field 7);Hedera.Receiptnow parsestoken_idandnew_total_supply. - Multi-signature — transaction building accepts
:signers(extra keys beyond the operator); the signature map carries oneSignaturePairper distinct key, so e.g. a token association can be signed by both the fee-paying operator and the account being associated. - Validated live (full lifecycle on testnet): create a fungible token → mint supply (receipt
token_id+new_total_supply) → associate a second account (multi-sig: operator ECDSA + account Ed25519) → transfer tokens to it — every step reaches aSUCCESSreceipt. This confirms thetokenCreation(29) /tokenMint(37) /tokenAssociate(40) field numbers, theKeyencoding, andTokenTransferListend-to-end.
Next: NFT mint/metadata, token freeze/kyc/wipe, protoc-generated messages, hex.pm release.