The Hedera Transaction Tool application is a demo application that allows a user to generate keys, create, sign, and submit transactions to a Hedera network. This software is designed for use solely by the Hedera Council and staff. The software is being released as open source as example code only, and is not intended or suitable for use in its current form by anyone other than members of the Hedera Council and Hedera personnel. If you are not a Hedera Council member or staff member, use of this application or of the code in its current form is not recommended and is at your own risk.
-
-
Required version:
>= 24.20.0 <25 -
Verify installation:
node -v
-
-
-
Required version:
>= 9.13.1 -
Installation of
pnpm(if not already installed):npm install -g pnpm@latest
-
Verify installation:
pnpm --version
-
-
-
Required version:
>= 75.6.0 -
Installation of
python-setuptoolswithbrew:brew install python-setuptools
-
Verify installation:
python -m setuptools --version
-
git clone https://github.com/hashgraph/hedera-transaction-tool.git
cd hedera-transaction-toolThe repository is a single pnpm workspace; install once from the root for all modules (back-end, front-end, automation):
pnpm installFront-end-specific scripts can then be run via the workspace filter (from any directory):
pnpm -F hedera-transaction-tool <script> # e.g. pnpm -F hedera-transaction-tool devOr by cd front-end and running the script as before — both work.
Do not rename this workspace package. The
namefield infront-end/package.jsonishedera-transaction-toolbecause Electron reads it asapp.getName(), which determines:
- the
userDatadirectory (~/Library/Application Support/hedera-transaction-tool/on macOS,~/.config/hedera-transaction-tool/on Linux,%APPDATA%\hedera-transaction-tool\on Windows) — where the local SQLite database, logs, and Prisma data live;- the macOS Keychain entry name (
hedera-transaction-tool Safe Storage) — which holds the symmetric key Electron'ssafeStorageuses to encrypt private keys, mnemonics, and other sensitive blobs.Renaming the package would silently relocate every existing user's database to a fresh empty path and decouple their encrypted blobs from the keychain entry that can decrypt them. Effectively a mass invisible data loss on every install.
pnpm -F hedera-transaction-tool generate:databasepnpm -F hedera-transaction-tool devpnpm build:macpnpm test:main # run tests for the main process
pnpm test:renderer # run tests for the renderer process
pnpm test:shared # run tests for the shared utilsRun the tests with coverage
pnpm test:main:coverage # run tests for the main process
pnpm test:renderer:coverage # run tests for the renderer process
pnpm test:shared:coverage # run tests for the shared utils-
Prisma issues
-
If you encounter problems with
@prisma/client:npx prisma generate
-
Alternatively, reinstall
node_modulesand run:npx prisma generate
-
-
ENOENT errors
-
If errors persist after reinstalling
node_modulesand runningprisma_generate, it may be caused by a missing Electron distribution. -
To fix this, manually rebuild Electron from the
front-enddirectory:pnpm rebuild electron
-
Both main and renderer processes write structured logs to a single local file via electron-log.
Logs are written to app.getPath('userData')/logs/app.log. Log rotation keeps one active 5 MB log file plus 5 archives (~30 MB maximum).
Each line is a JSON object:
{"timestamp":"2026-03-13T10:00:00.000Z","level":"info","component":"renderer.websocket","message":"Socket connected","metadata":{"url":"wss://..."}}Fields: timestamp (ISO 8601), level (error | warn | info | debug), component, message, and optional metadata.
Components follow the convention <process>.<module>.<submodule>:
main.*— main process loggers (e.g.,main.console,main.database,main.localUser.accounts)renderer.*— renderer process loggers (e.g.,renderer.console,renderer.store.user,renderer.page.createTransactionGroup)
Create a logger with createLogger('renderer.myComponent') in the renderer or createLogger('main.myModule') in the main process.
The default log level is info. Override it by setting the HTT_LOG_LEVEL environment variable before launching the app:
HTT_LOG_LEVEL=debug pnpm devAvailable levels: error, warn, info, debug.
Logs are automatically sanitized before being written to disk:
- Key-based redaction: Values under keys containing
password,accesstoken,refreshtoken,jwt,authorization,cookie,secret,privatekey,mnemonic,recoveryphrase,seed,signaturebytes,signatureraw,signedtransaction,signaturemap,transactionbytes,requestbody,responsebody,pem,encrypted, orsecrethashare replaced with[redacted]. - Pattern scrubbing: JWT tokens (
eyJ...), Bearer tokens, and PEM blocks are stripped from message text. - Payload omission: Long hex or base64 strings (>128 chars) are summarized as
payload omittedinstead of being logged verbatim.