← Home

Run an AUUM node

Two ways to run something: a full node that syncs and stores the whole chain, or the light client that verifies one balance at a time, right in your browser, nothing to install.
Open to anyone 50 AUUM minimum

Become a validator

AUUM's leader-rotation consensus is live and permissionless: stake 50+ AUUM on the Staking contract and your address becomes eligible to propose blocks, weighted by how much you've staked. No allowlist, no approval needed -- the contract itself decides.

1. Get MetaMask configured for AUUM Testnet -- Chain ID 787878, RPC https://wallet.auum.net/.

2. Get 50+ AUUM from the faucet (via the wallet page's Faucet tab, or POST /evm/faucet with your address -- rate-limited to keep it fair).

3. Stake it on the contract via the contracts page's Interact tab. Paste these in:

0x17Eb48d8E7900bEaA8EbF0c0AEDE965E0a8962dE

Contract address

[{"inputs": [], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "newEpoch", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "rewardDistributed", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "totalActiveStakeAtTick", "type": "uint256"}], "name": "EpochAdvanced", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "funder", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "RewardPoolFunded", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "validator", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "RewardsClaimed", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "validator", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "totalStake", "type": "uint256"}], "name": "Staked", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "validator", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "totalStake", "type": "uint256"}], "name": "Unstaked", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "validator", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "stake", "type": "uint256"}], "name": "ValidatorActivated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "validator", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "stake", "type": "uint256"}], "name": "ValidatorDeactivated", "type": "event"}, {"inputs": [], "name": "ACC_SCALE", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "MIN_STAKE", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "REWARD_PER_EPOCH", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "accRewardPerShare", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "claimRewards", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "currentEpoch", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "fundRewardPool", "outputs": [], "stateMutability": "payable", "type": "function"}, {"inputs": [], "name": "getValidators", "outputs": [{"internalType": "address[]", "name": "addrs", "type": "address[]"}, {"internalType": "uint256[]", "name": "stakes", "type": "uint256[]"}, {"internalType": "bool[]", "name": "active", "type": "bool[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "owner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "who", "type": "address"}], "name": "pendingRewardsOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "rewardPool", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "who", "type": "address"}], "name": "shareOf", "outputs": [{"internalType": "uint256", "name": "bpsShare", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "stake", "outputs": [], "stateMutability": "payable", "type": "function"}, {"inputs": [], "name": "tick", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "totalActiveStake", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "unstake", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "validatorCount", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "name": "validatorList", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "", "type": "address"}], "name": "validators", "outputs": [{"internalType": "uint256", "name": "stake", "type": "uint256"}, {"internalType": "uint256", "name": "rewardDebt", "type": "uint256"}, {"internalType": "uint256", "name": "pendingRewards", "type": "uint256"}, {"internalType": "bool", "name": "active", "type": "bool"}], "stateMutability": "view", "type": "function"}]

Contract ABI

Then call stake() with a value of 50 (or more) AUUM. You're now an active validator -- check with getValidators() or validators(yourAddress).

4. Run your own node as that validator, so it actually gets a turn to propose:

curl -fsSL https://wallet.auum.net/run-node.sh | bash -s -- --validator-address 0xYourStakedAddress

The native installers below ask for this too -- just enter your staked address when prompted instead of pressing Enter to skip. More stake means more of the rotation's slots, proportionally; this is a testnet, so treat the AUUM at stake accordingly.

Full node

Download and run

A prebuilt Linux x86_64 binary, dynamically linked against glibc -- runs on a standard glibc-based distro (Ubuntu, Debian, etc.), nothing to compile. Source isn't public yet -- this is a compiled release, and it's served live from whichever node you're on: literally the binary that node is running right now, not a stale build.

Download telecanor-chain (Linux x86_64)
chmod +x telecanor-chain
./telecanor-chain --p2p-port 7000 --rpc-port 8000 \
  --peers 122.175.43.90:7001,144.31.146.212:7010 \
  --data-dir ./data

That syncs and persists the full chain to ./data. The peer list is a starting point, not the whole mesh -- edit it freely, and add any other node addresses you're pointed at. No treasury key needed to just run and sync; that env var is only for a node hosting its own /aum/faucet.

Flags
FlagMeaning
--p2p-portPort other nodes connect to you on (gossip)
--rpc-portHTTP API/RPC port -- wallet, explorer, light-client proofs
--peersComma-separated host:port list to dial on startup, redialed automatically if a link drops
--data-dirWhere the chain persists to disk. Omit for in-memory only (resets on restart)
Alternative

Docker

Source isn't public yet, so there's nothing published to pull -- docker run telecanor-chain:minimal on its own fails with "pull access denied". This installer builds a small local image around the same binary above and runs it, detecting Apple Silicon vs Intel and macOS vs Linux itself.

curl -fsSL https://wallet.auum.net/run-node.sh | bash

That's the whole thing -- one command, checks Docker is running, builds the image, starts the node, and confirms RPC is answering. Prefer to read the script before running it? curl -fsSL -o run-node.sh https://wallet.auum.net/run-node.sh, open it in an editor, then bash run-node.sh.

Prefer a native installer, no terminal at all?

Download for Mac (.pkg) Download for Windows (.exe)

Same logic as the one-liner above, compiled to a double-clickable app. Docker Desktop must already be installed either way.

Or run it step by step manually

1. Make sure Docker is actually running first:

if [ "$(uname -s)" = "Linux" ]; then
  sudo systemctl is-active --quiet docker || sudo systemctl start docker
else
  open -a Docker 2>/dev/null
  until docker info >/dev/null 2>&1; do sleep 1; done
fi

2. Build the image (downloads the same binary served above, from this node):

PLATFORM_FLAGS=()
[ "$(uname -m)" = "arm64" ] && PLATFORM_FLAGS=(--platform linux/amd64)

cat > Dockerfile <<'EOF'
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl \
 && curl -fsSL -o /usr/local/bin/telecanor-chain https://wallet.auum.net/download/telecanor-chain-linux-x86_64 \
 && chmod +x /usr/local/bin/telecanor-chain \
 && apt-get purge -y curl && apt-get autoremove -y && rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["/usr/local/bin/telecanor-chain"]
EOF
docker build "${PLATFORM_FLAGS[@]}" -t telecanor-chain:minimal .

3. Run it -- same flags, same behavior as the existing nodes:

PLATFORM_FLAGS=()
NET_FLAGS=(--network host)
if [ "$(uname -s)" = "Darwin" ]; then
  # macOS reserves host port 7000 for its own AirPlay Receiver, so this remaps to 17000
  NET_FLAGS=(-p 17000:7000 -p 8000:8000)
  [ "$(uname -m)" = "arm64" ] && PLATFORM_FLAGS=(--platform linux/amd64)
fi

docker run -d --name auum-node "${NET_FLAGS[@]}" --restart unless-stopped "${PLATFORM_FLAGS[@]}" \
  -v $(pwd)/data:/data \
  telecanor-chain:minimal \
  --p2p-port 7000 --rpc-port 8000 \
  --peers 122.175.43.90:7001,144.31.146.212:7010 \
  --data-dir /data

On Linux this runs exactly like the existing nodes (--network host). On macOS, Docker Desktop's networking is a Linux VM under the hood, so --network host is silently a no-op there -- the commands above publish the two ports explicitly instead, which is why the flags differ by OS.

Prefer your own base image or a different build path? Nothing here is required -- ENTRYPOINT just needs to point at a copy of that same binary.

Already have a node running? Re-run the same one-liner or double-click the same installer again -- it detects the existing container and prints a status report instead (container up, RPC responding, in sync or not) rather than reinstalling.

Ultra-small alternative no install

Light client

Don't want to run anything persistent? The light client checks one account's balance against a cryptographic Merkle proof and a hash-verified header chain, entirely in a browser tab -- no download, no sync, no storage. It trusts the node you point it at for which chain is real, but not for the specific numbers it reports.

This is a testnet, not a production network -- single-operator mesh, unaudited, real integrity checks but no economic security model yet. See the whitepaper for the honest scope.