Skip to main content
This guide covers running an Autheo node from scratch. Two deployment methods are provided: Method A — systemd (build from source) and Method B — Docker (official GHCR image).
Before you begin: This guide assumes you have already bridged your Sovereign license NFT from Arbitrum One to Autheo Mainnet. Complete that step first.Make sure you are bridging to the address you intend to use for creating the validator. That address must have enough THEO tokens for self-delegation and signing transactions. If you do not have a wallet yet, see Key management to create one and obtain its address before bridging.See: Bridging your Sovereign license NFT to Autheo Mainnet https://docs.autheo.com/web-apps/bridge/overview

1. Chain reference

Ports (single node defaults):

2. Infrastructure requirements

Size your server to meet the following minimums before proceeding. Under-provisioned nodes are more likely to miss blocks and get jailed.

3. Method A: systemd

3.1 Prerequisites

3.2 Build the binary

Install to PATH:

3.3 Join the network

All official configuration files are in the autheo-blockchain/networks repository.
Then choose a sync method from section 5.

3.4 Configure the node

RPC (26657), gRPC (9090), REST (1317), and EVM JSON-RPC/WS (8545/8546) should stay bound to 127.0.0.1 on a production validator — see the firewall table in Security hardening, which lists all of these as Closed. Only bind them to 0.0.0.0 below if you have your own firewall rules or a sentry architecture in front of this node restricting who can reach these ports. If you don’t, skip this section and leave the defaults in place.
$HOME/.autheo/config/config.toml
$HOME/.autheo/config/app.toml
$HOME/.autheo/config/client.toml

3.5 Start with systemd

Create a dedicated, unprivileged system user to run the node as — do not run it as your own login user or as root:
Create /etc/systemd/system/autheod.service, adjusting User, WorkingDirectory, and ExecStart for your system user:

4. Method B: Docker

The official image is published at ghcr.io/autheo-blockchain/autheod. Available tags:
For production validators, pin to a specific release tag rather than latest so that container restarts do not pull an unexpected upgrade. Find release tags on the GHCR package page.

4.1 Pull the image

4.2 Prepare the data directory

The node home inside the container is /root/.autheo. Mount a host directory to persist state across container restarts.
All autheod commands inside the container must use --home /root/.autheo. To run commands against a running container from the host, use docker exec autheo-node autheod <command> --home /root/.autheo.

4.3 Join the network

Then apply the sync method of your choice from section 5 using the host-side config files.

4.4 Configure the node

Apply config changes directly to the host-side directory. Use the same sed commands from section 3.4 — they operate on $HOME/.autheo/config/ which is mounted into the container.

4.5 Run the container

The -p flags below publish each port to all interfaces on the host, equivalent to the 0.0.0.0 binds in section 3.4. Per the firewall table in Security hardening, only 26656 (P2P) should be reachable from the internet on a validator. For the others, either drop the -p flag (keep the service container-internal only) or bind to localhost explicitly, e.g. -p 127.0.0.1:26657:26657.
View logs:
Stop and restart:

5. Sync methods

After completing the join and configure steps for your chosen method, select one of the following sync strategies. Downloads a recent snapshot from a live sentry and syncs only the remaining blocks.
State sync does not retain historical data before the snapshot height. If you need a full archive node, use genesis sync instead.

Option B: Genesis sync

Replays every block from block 1. Required only for a full archive node.
The chain has had no governance upgrades since genesis — no additional setup is needed for current genesis sync.
If governance upgrades occur in the future, genesis sync will require cosmovisor to manage binary swaps at each upgrade height. Historical upgrade plan names, heights, and binaries will be listed in mainnet/upgrades.json in the networks repo, following this structure:
plan_name is the exact string used in MsgSoftwareUpgrade. For each entry, create a matching cosmovisor directory with the corresponding binary.

6. Verify the node

Sync status — catching_up must be false when fully synced:
EVM and REST checks — run from the host for both methods:

7. Key management

This chain uses eth_secp256k1 keys. Create a new key:
After creating the key, get its hex address for bridging:
Use the Address (hex) value (prefixed with 0x) when bridging your Sovereign license NFT and transferring THEO tokens to this address. Complete both steps before proceeding. Keyring backends: Import an existing key: If you already have a wallet (MetaMask, Keplr, or any BIP-39 compatible wallet), import it using its mnemonic. The imported address must be the same one you bridged the Sovereign license NFT to and that holds enough THEO for self-delegation. Only do this if you understand the risk: entering a mnemonic on a server exposes it to that environment.
Show address:
List keys:
Show validator consensus public key:
Get your Autheo address from a hex address: Autheo Chain uses a Bech32 address format (autheo...). All on-chain transactions must use this address, not the 0x hex form. Convert your EVM hex address (without the 0x prefix) using:
Use the Bech32 Acc value from the output for all Autheo chain transactions.

8. Create a validator

Requirements:
  • Node is fully synced (catching_up: false)
  • Sufficient aauth balance for self-delegation and fees
  • A Sovereign license owned by this account and bound to this validator address in BOUND status
The x/licensedstaking module enforces at the MsgCreateValidator level that a Sovereign license in BOUND status exists on the validator address. The transaction is rejected if this condition is not met. Step 1 — Verify your Sovereign license is BOUND:
If your Sovereign license is in ISSUED status (not yet bound), bind it first:
Confirm the license is now BOUND before proceeding:
Step 2 — Create the validator:
Do not submit create-validator more than once with the same consensus key. Double-signing results in permanent tombstoning — the validator cannot be recovered. Verify you have only one running instance before submitting.
The self-delegation inside create-validator triggers the BOUND→ACTIVE license transition automatically. Step 3 — Verify the validator and license are active:

9. Troubleshooting

Cannot connect to EVM JSON-RPC

Confirm the JSON-RPC server is enabled and bound correctly in app.toml:

Node not producing blocks / stuck

systemd:
Docker:

10. Claiming rewards

Once your validator is ACTIVE, two independent reward streams accrue in parallel — neither one claims automatically, and neither expires. NFT emission rewards (from your Sovereign license, via x/licensedistribution):
Staking rewards (from delegations to your validator, via x/distribution — includes your commission):
Run the same two commands with docker exec autheo-node ... and --home /root/.autheo for Docker deployments. See Staking and rewards for the full breakdown of both reward streams, rates by license tier, and the global emissions cap.