Skip to main content

Node — HCS‑16Client

This page walks through real HCS‑16 flows using the Node client. Each section explains the intent first, then shows a compact code snippet.

1) Bootstrap a Flora’s TopicsDirect link to 1) Bootstrap a Flora’s Topics

Goal: create the three topics and share them via flora_created on the Communication Topic.

import { HCS16Client, FloraTopicType, buildHcs16FloraCreatedTx } from '@hashgraphonline/standards-sdk';

const hcs16 = new HCS16Client({ network: 'testnet', operatorId, operatorKey });

// Choose which topic to create first; creation can be parallelized in your app
const cTopic = await hcs16.createFloraTopic({ floraAccountId, topicType: FloraTopicType.COMMUNICATION });
const tTopic = await hcs16.createFloraTopic({ floraAccountId, topicType: FloraTopicType.TRANSACTION });
const sTopic = await hcs16.createFloraTopic({ floraAccountId, topicType: FloraTopicType.STATE });

// Announce to members on the CTopic
await (await buildHcs16FloraCreatedTx({ topicId: cTopic.topicId, floraAccountId })).execute(hcs16['client']);

Notes:

  • Topic memos follow the HCS‑16 spec (numeric enum encoding). Indexers can discover them reliably.
  • You can store the topic triplet in your app state, registry, or an HCS‑2 registry for lookup.

2) Propose a TransactionDirect link to 2) Propose a Transaction

Goal: publish a proposal on the Transaction Topic for members to review/sign.

import { buildHcs16TxProposalTx } from '@hashgraphonline/standards-sdk';

await (await buildHcs16TxProposalTx({
topicId: tTopic.topicId,
scheduledTxId: '0.0.1234@1726357200.000000000',
memo: 'release funds for invoice #42',
})).execute(hcs16['client']);

Notes:

  • The proposal references a scheduled transaction (or your own identifier) that your members will co‑sign.
  • Keep the memo meaningful for auditors and bots consuming the topic.

3) Publish a State UpdateDirect link to 3) Publish a State Update

Goal: emit a compact snapshot to the State Topic after meaningful changes.

import { buildHcs16StateUpdateTx } from '@hashgraphonline/standards-sdk';

await (await buildHcs16StateUpdateTx({
topicId: sTopic.topicId,
stateHash: '0x…', // often the HCS‑17 account/composite hash
epoch: 7,
memo: 'post‑proposal state',
})).execute(hcs16['client']);

Notes:

  • Pairing with HCS‑17 hashes makes verification straightforward for indexers.
  • Epoch is an application counter to help readers process causality.

4) Onboarding a New MemberDirect link to 4) Onboarding a New Member

Goal: run the join handshake on the Communication Topic.

import { buildHcs16FloraJoinRequestTx, buildHcs16FloraJoinVoteTx, buildHcs16FloraJoinAcceptedTx } from '@hashgraphonline/standards-sdk';

await (await buildHcs16FloraJoinRequestTx({ topicId: cTopic.topicId, candidateAccountId: '0.0.2468' })).execute(hcs16['client']);
await (await buildHcs16FloraJoinVoteTx({ topicId: cTopic.topicId, candidateAccountId: '0.0.2468', approve: true })).execute(hcs16['client']);
await (await buildHcs16FloraJoinAcceptedTx({ topicId: cTopic.topicId, members: ['0.0.111','0.0.222','0.0.2468'], epoch: 8 })).execute(hcs16['client']);

Notes:

  • Your policy decides who can request, how many votes are required, and how acceptance is signaled.
  • Keep membership lists sorted to avoid accidental hash divergence downstream.

Reading MessagesDirect link to Reading Messages

The client exposes helpers to read and filter messages by operation when processing topics.

const recent = await hcs16.getRecentMessages(cTopic.topicId, { limit: 25, order: 'desc', opFilter: 'flora_created' });
const latest = await hcs16.getLatestMessage(cTopic.topicId, 'flora_created');

That’s all you need on Node: build with tx.ts, execute with the SDK client, and keep your flows auditable and minimal.