BuildExchange Integration

Exchange Node Guide

Install and operate a non-validating exchange full node for Lithosphere.

Edit

Last reviewed: 2026-07-29

Audience: exchange wallet, custody, and infrastructure teams operating a non-validating lithosphere_9005-1 full node.

Status: technically complete except for the public signed binary-release URL and public snapshot URL. Do not substitute an older Lithosphere binary, genesis, or testnet snapshot.

1. Immutable network inputs

InputApproved value
Cosmos chain IDlithosphere_9005-1
EVM chain ID9005 (0x232d)
BinaryLinux x86_64 lithod, Evmos v20-derived fixed-supply build
Binary SHA-2560546677a9cf3a7f458797b65181a46f21c89185933e832d89ce728a144fd258c
Genesis URLhttps://rpc-mainnet.litho.ai/genesis.json
Genesis SHA-25613e4875b4a9dddc63bdfbd4968c7265f9bbc49218b59c5b49231a56fa313046f
Base denominationulitho (10^18 ulitho = 1 LITHO)
CometBFT version reported live0.38.12

The binary contains a consensus-critical fixed-supply patch. An exchange must verify the exact release artifact and checksum before synchronization. The public binary URL is currently TBD; obtain the artifact through the approved release channel, not chat or an unverified file share.

ResourcePruned exchange nodeArchive/historical node
CPU8 vCPU8–16 vCPU
RAM32 GiB32–64 GiB
Disk500 GB NVMe SSD1 TB NVMe SSD initially
NetworkStable 100 Mbps+Stable 100 Mbps+
OSUbuntu 24.04/26.04 LTS x86_64Ubuntu 24.04/26.04 LTS x86_64

Use a dedicated filesystem or volume for the node home. Monitor disk growth and keep at least 30% free. A separate database should hold the exchange's deposit index; node state is not an accounting database.

3. Port policy

Recommended local ports are standard and may be changed:

ServiceDefaultExposure
CometBFT P2PTCP 26656Public or outbound-only through NAT
CometBFT RPCTCP 26657Loopback/private only
REST/LCDTCP 1317Loopback/private only
gRPCTCP 9090Loopback/private only
EVM JSON-RPCTCP 8545Loopback/private only
EVM WebSocketTCP 8546Loopback/private only
PrometheusTCP 26660Monitoring network only

Do not expose custody RPCs directly to the Internet. Place authentication, rate limiting, request-size limits, and network ACLs in front of any shared internal RPC.

4. Install the approved binary

Create a dedicated user and home:

sudo useradd --system --home /var/lib/litho-mainnet-9005-exchange \
  --shell /usr/sbin/nologin litho
sudo install -d -o litho -g litho -m 0750 \
  /var/lib/litho-mainnet-9005-exchange

Install the artifact received from the approved release channel:

sudo install -o root -g root -m 0755 ./lithod-mainnet-9005 \
  /usr/local/bin/lithod-mainnet-9005

echo '0546677a9cf3a7f458797b65181a46f21c89185933e832d89ce728a144fd258c  /usr/local/bin/lithod-mainnet-9005' \
  | sha256sum --check

/usr/local/bin/lithod-mainnet-9005 version --long

Stop if the checksum differs.

Source-build fallback

The current source repository is https://github.com/BrewCodeDev/lithosphere-dev-infra. Its bin/build-lithod.sh checks out Evmos v20.0.0, applies the fixed-supply patch, rebrands the chain, runs focused tests, and builds Linux x86_64 lithod.

Use a signed release tag/commit supplied by the project. Locally built binaries may not be byte-for-byte identical because build metadata/toolchains can vary; record the build environment, source commit, test output, and resulting hash.

5. Initialize the node

export LITHO_HOME=/var/lib/litho-mainnet-9005-exchange

sudo -u litho /usr/local/bin/lithod-mainnet-9005 init exchange-node-01 \
  --chain-id lithosphere_9005-1 \
  --home "$LITHO_HOME"

sudo -u litho curl --fail --silent --show-error --location \
  https://rpc-mainnet.litho.ai/genesis.json \
  --output "$LITHO_HOME/config/genesis.json"

echo '13e4875b4a9dddc63bdfbd4968c7265f9bbc49218b59c5b49231a56fa313046f  /var/lib/litho-mainnet-9005-exchange/config/genesis.json' \
  | sha256sum --check

/usr/local/bin/lithod-mainnet-9005 validate-genesis \
  "$LITHO_HOME/config/genesis.json"

init creates local node identity files. Those are not the network validator's consensus key. Never copy a validator priv_validator_key.json or signing state onto an exchange node.

6. Configure P2P and RPC

Edit $LITHO_HOME/config/config.toml.

Required identity and peer settings:

moniker = "exchange-node-01"
db_backend = "goleveldb"
db_dir = "data"

[rpc]
laddr = "tcp://127.0.0.1:26657"
unsafe = false

[p2p]
laddr = "tcp://0.0.0.0:26656"
external_address = ""
seeds = ""
persistent_peers = "[email protected]:27056,[email protected]:27056"
pex = true

[tx_index]
indexer = "kv"

[instrumentation]
prometheus = true
prometheus_listen_addr = "127.0.0.1:26660"

If inbound P2P is enabled behind NAT, forward TCP 26656 and set external_address = "PUBLIC_IP:26656". Outbound-only P2P works without it.

Do not change consensus timeout settings on a non-validator unless directed by a coordinated network release. Do not enable state sync without a project- published trust height, trust hash, and compatible snapshot service.

7. Configure application APIs and storage

Edit $LITHO_HOME/config/app.toml:

minimum-gas-prices = "0.0001ulitho"
pruning = "default"
pruning-keep-recent = "0"
pruning-interval = "0"

[api]
enable = true
swagger = false
address = "tcp://127.0.0.1:1317"
enabled-unsafe-cors = false

[grpc]
enable = true
address = "127.0.0.1:9090"

[json-rpc]
enable = true
address = "127.0.0.1:8545"
ws-address = "127.0.0.1:8546"
api = "eth,net,web3"
allow-unprotected-txs = false
enable-indexer = false

[memiavl]
enable = true

For archive application state, use pruning = "nothing" and provision more disk. CometBFT block and transaction-index databases still grow separately. The exchange must maintain its own address/deposit index even on an archive node.

MemIAVL must remain enabled to match the live chain. Do not copy storage settings from an older Makalu/Kamet guide.

8. Install systemd service

Create /etc/systemd/system/lithod-mainnet-9005-exchange.service:

[Unit]
Description=Lithosphere Exchange Full Node
After=network-online.target
Wants=network-online.target

[Service]
User=litho
Group=litho
Type=simple
ExecStart=/usr/local/bin/lithod-mainnet-9005 start --home /var/lib/litho-mainnet-9005-exchange
Restart=on-failure
RestartSec=5
LimitNOFILE=1048576
TimeoutStopSec=90
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

Activate it:

sudo systemctl daemon-reload
sudo systemctl enable --now lithod-mainnet-9005-exchange
sudo journalctl -u lithod-mainnet-9005-exchange -f

9. Synchronization

No approved public snapshot is available. Genesis/block sync is the supported bootstrap path at this time.

curl -fsS http://127.0.0.1:26657/status | jq '{
  network: .result.node_info.network,
  height: .result.sync_info.latest_block_height,
  block_time: .result.sync_info.latest_block_time,
  catching_up: .result.sync_info.catching_up
}'

curl -fsS http://127.0.0.1:26657/net_info | jq '.result.n_peers'

Synchronization is complete only when:

  • network is lithosphere_9005-1;
  • height is close to two independent remote endpoints;
  • catching_up is false;
  • latest block time is current; and
  • the height advances across repeated samples.

10. Exchange acceptance checks

# EVM chain ID: expected 0x232d
curl -fsS http://127.0.0.1:8545 \
  -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'

# Latest height
curl -fsS http://127.0.0.1:8545 \
  -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

# Local genesis and binary integrity
sha256sum /var/lib/litho-mainnet-9005-exchange/config/genesis.json
sha256sum /usr/local/bin/lithod-mainnet-9005

# Public comparison
curl -fsS https://rpc-mainnet.litho.ai/status | jq '.result.sync_info'

Before opening deposits, also test account derivation, native deposits, LEP100 log detection, withdrawal signing, nonce recovery, service restart, database restore, alert routing, and idempotent replay from an earlier height.

11. Backup and recovery

Back up:

  • config/node_key.json if stable node identity matters;
  • configuration and service files;
  • the exchange deposit-index database;
  • wallet derivation metadata and custody policies through the HSM/MPC system;
  • exact binary, source release reference, genesis, and checksums.

Do not treat the node data/ directory as a wallet-key backup. A non-validator node may be rebuilt from an approved snapshot or genesis. Never use unsafe-reset-all without a reviewed rebuild plan and a verified accounting checkpoint.

12. Operational alerts

Page on:

  • no new block for more than two minutes;
  • catching_up=true after initial sync;
  • chain-ID or genesis mismatch;
  • local/public canonical block-hash mismatch;
  • zero peers or both official peers unavailable;
  • disk over 80%, file descriptors, memory pressure, or restart loop;
  • RPC latency/error-rate threshold breach;
  • pending withdrawal nonce gap; and
  • certificate expiry for any proxy operated by the exchange.

On this page