A fast & nimble SPV server for Palladium (PLM) — a decentralized cryptocurrency built on Bitcoin's proven codebase, enhanced with modern features including Taproot support.
This is a fork of Fulcrum, adapted to speak the Electrum protocol against palladiumd instead of bitcoind/BCHN. For more on Palladium itself, see palladiumblockchain.net / palladium-coin.com.
(C) 2019-2026 Calin A. Culianu <calin.culianu@gmail.com> (original Fulcrum) (C) 2025-2026 Davide Grilli <davide.grilli@outlook.com> (Palladium support)
See AUTHORS for details on who did what.
GPLv3, inherited unchanged from upstream Fulcrum. See the included LICENSE.txt file or visit gnu.org and read the license.
- Fast: Written in 100% modern
C++20using multi-threaded and asynchronous programming techniques (inherited from upstream Fulcrum). - A drop-in replacement for ElectrumX, now for PLM: Speaks the Electrum Cash protocol against a
palladiumdnode. - Palladium-aware: native
PLMcoin detection, address codec (P.../3...mainnet, Bech32plm1...), and SegWit-correct serialization from height 29000 onward. - Dockerized: a ready-to-run
docker-compose.ymlbrings uppalladiumd+fulcrum-plmtogether with TLS auto-provisioned.
Coin::PLMadded to the coin enum, with name mapping and RPC-based auto-detection inBitcoinD.- PLM address codec: P2PKH (
0x37,P...), P2SH (0x05,3...), WIF (0x80), Bech32 HRPsplm/tplm/rplm. - SegWit serialization enabled for PLM in
Controller. - BCH-only features (DSProof, RPA, CashTokens) are not exposed for PLM.
- Unit tests for coin name mapping and PLM address encoding (
./Fulcrum --test).
See the file headers in src/ for exactly which files carry PLM modifications, and git log for the full history. The PLM consensus parameters this server needs to be aware of (coinbase maturity, fork heights, difficulty schedule) are documented in coin_spec.md.
- For running:
- A
palladiumdnode with its JSON-RPC service enabled, preferably on the same machine, withtxindex=1and not pruning. - Optional: ZMQ notifications (
zmqpubrawblock/zmqpubrawtx/zmqpubhashblock) — auto-discovered via thegetzmqnotificationsRPC if configured inpalladium.conf. - Recommended hardware: similar to Bitcoin Core — an SSD is strongly recommended.
- A
- For compiling:
Qt Core&Qt Networkinglibraries5.15.2or above.- Optional but recommended:
libzmq3-devandlibminiupnpc-dev. - A modern, 64-bit
C++20compiler.clang-17org++-13are recommended.
The included docker-compose.yml runs palladiumd and fulcrum-plm together on a shared Docker network, with TLS auto-provisioned for the Electrum SSL listener.
cp .env.example .env # set RPC_USER / RPC_PASSWORD
docker compose up -d
docker compose logs -f fulcrum-plmpalladiumddata persists inpalladium-node/.palladium/(bind-mounted).fulcrum-plmdata persists infulcrum-db/(bind-mounted).- A self-signed TLS certificate is generated on first run into
ssl/. - Ports exposed on the host:
2333(PLM P2P),50001/50002(Electrum TCP/SSL),127.0.0.1:8000(admin, host-only). - If any of those host ports are already in use, remap only the host side of the binding in
docker-compose.yml(theports:section of the relevant service), leaving the container-side port unchanged, e.g."60001:50001". No changes are needed todoc/fulcrum-plm-docker.conf.templateor.env.
By default, multiple fulcrum-plm instances do not discover each other — only the underlying palladiumd nodes find each other via Bitcoin-style P2P. Setting up Fulcrum-to-Fulcrum peering across N servers requires touching one file once (shared by all servers) and one setting per-server. Do it in this order:
-
Collect the public IP of every machine that will run this stack, and decide which Electrum TCP/SSL ports each one will expose (the
50001/50002defaults, unless you remapped them per-host as described above). -
Edit
resources/plm/servers.json(same JSON schema asresources/btc/servers.json) and list every machine, keyed by its public IP, e.g.:{ "203.0.113.10": { "pruning": "-", "t": "50001", "s": "50002", "version": "1.4.2" }, "203.0.113.11": { "pruning": "-", "t": "50001", "s": "50002", "version": "1.4.2" } }This list only needs the other servers for the initial bootstrap — each instance is free to include itself too, since Fulcrum filters its own address out automatically. This file is compiled into the binary as a Qt resource (declared in
resources.qrc), so it is not read at runtime: any edit requires a rebuild (step 3). -
Rebuild before deploying to each machine:
- Docker:
docker compose build fulcrum-plm(theDockerfilebuilds Fulcrum from source, so the updatedservers.jsongets baked in). - Native build:
qmake && make -j$(nproc).
- Docker:
-
On each machine, set its own
PUBLIC_HOSTin.envto that server's public IP (not a shared value — see the comment in.env.example). Also setPUBLIC_TCP_PORT/PUBLIC_SSL_PORTto match whatever you used in step 1/2 for that host, and leaveANNOUNCE=trueso the server advertises itself (set it tofalseinstead if you only want this server to discover peers without being listed by them). -
Start (or restart) the stack on each machine:
docker compose up -d(ordocker compose up -d --force-recreate fulcrum-plmif it was already running with the old image). -
Verify discovery once all servers are up:
./FulcrumAdmin -p 8000 peers(admin RPC, host-bound on127.0.0.1:8000) should list the other VPS after a short propagation delay — Fulcrum's peering protocol exchanges peer lists automatically from that point on, soresources/plm/servers.jsononly needs to bootstrap the very first connections.
If you'd rather not use Docker, you can get palladiumd/palladium-cli directly:
./palladium-node/daemon/download-binaries.sh --outdir /usr/local/binThis downloads the latest prebuilt release from palladium-coin/palladiumcore for your platform/architecture (--platform/--arch/--repo let you override the defaults; see --help). To build palladiumd from source instead, follow the instructions in that repository.
Minimal ~/.palladium/palladium.conf to pair with fulcrum-plm:
txindex=1
server=1
rpcuser=palladiumrpc
rpcpassword=<strong-password>
rpcport=2332
rpcbind=127.0.0.1
rpcallowip=127.0.0.1
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333
zmqpubhashblock=tcp://127.0.0.1:28334
listen=1
port=2333palladiumd -conf=$HOME/.palladium/palladium.conf -daemonOnce it's running and synced, point fulcrum-plm at it as described below.
To compile without Docker, you'll need a palladiumd node running separately. To compile Fulcrum itself:
- Make sure you have
qmakein your path and all the requisite Qt5/Qt6 dev libs installed. qmake(to generate the Makefile)make -j$(nproc)
A note for Linux users: you also need libbz2-dev, otherwise compilation will fail.
qmake LIBS+=-lrocksdb && make clean && make -j$(nproc)Execute the binary with -h to see the built-in help, e.g. ./Fulcrum -h. You can set most options from the CLI, but you can also specify a config file as an argument:
./Fulcrum doc/fulcrum-plm-config.confSee:
doc/fulcrum-plm-config.conf— standalone (no Docker) setup against a localpalladiumd.doc/fulcrum-plm-docker.conf.template— the template rendered automatically by the Docker setup.
As long as the server is still synchronizing, public-facing ports will not yet be bound. Once it finishes syncing, it behaves like an ElectrumX server and can receive requests from any Electrum-protocol-compatible PLM wallet.
Fulcrum ships with an admin script (Python 3.6+ required). It requires an admin port (config var admin=, CLI arg -a). Run ./FulcrumAdmin -h for the full list of subcommands (getinfo, stop, peers, query, etc.), e.g.:
./FulcrumAdmin -p 8000 getinfoThis server speaks the Electrum Cash protocol, inherited unchanged from upstream Fulcrum. BCH-only extensions (DSProof, RPA, CashTokens) are not active for PLM.
Inherited from upstream Fulcrum: Linux needs a C++20-capable gcc/clang (gcc-13+ recommended); Windows requires MinGW G++ (MSVC unsupported); macOS should work out of the box. This fork has been developed and tested on Linux.
Q: Why does this fork exist instead of using upstream Fulcrum directly?
A: Upstream Fulcrum supports BCH, BTC and LTC, but has no notion of Palladium's coin-specific rules (address prefixes, SegWit activation height, coinbase maturity, difficulty schedule). This fork teaches it about PLM while reusing all of Fulcrum's existing Electrum-protocol and storage machinery.
Q: Is this affiliated with the Palladium Core project?
A: No. This is an independent fork that adds client-side (SPV server) support for PLM; it does not modify or redistribute palladiumd itself, which is built from its own upstream releases in the Docker setup.
This project is a fork of Fulcrum by Calin A. Culianu (cculianu/Fulcrum) — all of the core Electrum-protocol server, RocksDB storage engine, and BCH/BTC/LTC support is his work. PLM support and the Docker deployment setup were added on top of it by Davide Grilli. See AUTHORS for the full breakdown.
If you are looking for the original multi-coin (BCH/BTC/LTC) server, use the upstream project linked above. For the Palladium daemon (palladiumd) itself, see palladium-coin/palladiumcore.

