ADAMANT Forging Pool calculates delegate voter rewards, sends scheduled payouts, stores reward history in MongoDB, serves a public voter dashboard, and notifies operators about important pool events.
This repository is the maintained successor of the older adamant-pool implementation.

adm-pool control CLIGET /api/health endpoint for external monitoring (e.g. Zabbix)adamant-api22.13.0 or newer10 or newer6 or newerClone the repository and install dependencies:
git clone https://github.com/Adamant-im/pool.git
cd pool
npm run install:all
npm run install:all installs root, server, web, and migration-script dependencies with lifecycle scripts disabled. If you install packages manually, prefer:
npm install --ignore-scripts
npm --prefix server install --ignore-scripts
npm --prefix web install --ignore-scripts
Build the dashboard:
npm run build:web
Create a local config file:
cp config.default.jsonc config.jsonc
Edit config.jsonc and set at least:
passPhrase: secret phrase of the pool delegate accountnode_ADM: ADAMANT node URLs used for blockchain API accessmongodb.uri: MongoDB connection URImongodb.dbName: database name for pool storagereward_percentage, minpayout, and payoutperiodKeep config.jsonc, config.json, and config.test.jsonc local. They may contain pool credentials and notification tokens.
Start the pool directly:
npm start
For production, use a process manager such as pm2:
pm2 start ./scripts/start.sh --name adamantpool
The passPhrase accepts two forms:
The adm-pool control CLI manages encryption and the runtime lock state:
npm run adm-pool encrypt # prompts for the passphrase and an operator password, prints the encrypted value
npm run adm-pool unlock # prompts for the operator password and unlocks a running pool
npm run adm-pool lock # clears the decrypted passphrase from the running pool's memory
npm run adm-pool status # shows the running pool's status
Workflow:
npm run adm-pool encrypt and paste the resulting admpool-enc-v1.... string into config.jsonc as passPhrase.npm start), the pool prompts for the operator password on startup.npm run adm-pool unlock.The CLI talks to the running pool over a local Unix socket (owner-only 0600 permissions). Override its path with the controlSocket config value when running several pools on one host.
GET /api/health returns a secret-free JSON snapshot for external monitoring such as Zabbix:
{
"status": "ok", // ok | degraded (locked) | starting
"version": "3.1.0",
"uptime": 12345,
"address": "U1234...",
"payouts": "unlocked", // unlocked | locked
"passphrase": "encrypted",
"node": { "ready": true, "rank": 12, "productivity": 99.5 },
"nextPayoutTimestamp": 1750086400000
}
The endpoint always responds with HTTP 200 while the web server is up; a locked pool is intentional, not down, so it is reported as "status": "degraded" / "payouts": "locked" rather than a 5xx. Alert on .status != "ok" or .payouts == "locked".
To migrate an older v2 pool database, pass the old pool directory or database directory:
node scripts/migrate.mjs ~/adamant-pool
Restart the pool after migration.
Older v3 development builds stored data in LowDB JSON files. To migrate those files to MongoDB:
cd scripts/migrate-lowdb-mongodb
npm install --ignore-scripts
MONGODB_URI=mongodb://localhost:27017 MONGODB_DB=adamant-pool LOWDB_STORAGE_PATH=../../server/db node index.js
Then set MongoDB connection parameters in config.jsonc:
"mongodb": {
"uri": "mongodb://localhost:27017",
"dbName": "adamant-pool"
}
Restart the pool after migration.
Read CONTRIBUTING.md for development setup, validation commands, project structure, and pull request rules.