Back to all services Back to all services
Story logo

Story

Mainnet

chainID: story-1 MAINNET

Story Node CLI Command Reference

⚙️ systemd — Service Operations

Reload systemd units

sudo systemctl daemon-reload
          

Start services

sudo systemctl start story-geth
sudo systemctl start story
          

Stop services

sudo systemctl stop story
sudo systemctl stop story-geth
          

Restart services (recommended order)

sudo systemctl restart story-geth && sleep 5 && sudo systemctl restart story
          

Enable services at boot

sudo systemctl enable story story-geth
          

Disable services

sudo systemctl disable story
sudo systemctl disable story-geth
          

Check service status

sudo systemctl status story
sudo systemctl status story-geth
          

📜 Logs

Follow both services

sudo journalctl -u story -u story-geth -f
          

Follow individually (raw output)

sudo journalctl -u story -f -o cat
sudo journalctl -u story-geth -f -o cat
          

📡 Node Status & Sync

Latest block height

curl -s localhost:26657/status | jq .result.sync_info.latest_block_height
          

Syncing status

curl -s localhost:26657/status | jq .result.sync_info.catching_up
          

Generic node info (auto-detect RPC port)

curl localhost:$(sed -n '/\[rpc\]/,/laddr/ { /laddr/ {s/.*://; s/".*//; p} }' $HOME/.story/story/config/config.toml)/status | jq
          

🌐 Peers

Number of peers

curl -s http://localhost:26657/net_info | jq '.result.n_peers'
          

List connected peers

curl -s http://localhost:26657/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):26656"'
          

Your node peer string

node_id=$(curl -s http://localhost:26657/status | jq -r '.result.node_info.id')
public_ip=$(curl -s ifconfig.me)
echo "${node_id}@${public_ip}:26646"
          

🔑 Validator Keys & Export

Export validator keys

story validator export
          

Export derived EVM private key

story validator export --export-evm-key
          

Extract EVM public key only

story validator export | grep "EVM Public Key:" | awk '{print $NF}'
          

🧾 Validator Operations

Create validator

story validator create \
  --stake 1035000000000000000000 \
  --moniker (moniker) \
  --chain-id 1514 \
  --unlocked=true \
  --commission-rate 500 \
  --max-commission-rate 2000 \
  --max-commission-change-rate 100
          

💰 Staking Operations

Delegate to yourself

story validator stake \
  --chain-id 1514 \
  --validator-pubkey $(story validator export | grep "Compressed Public Key (hex)" | awk '{print $NF}') \
  --stake 1000000000000000000 \
  --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
          

Delegate

story validator stake \
  --chain-id 1514 \
  --validator-pubkey <VALIDATOR_PUB_KEY_IN_HEX> \
  --stake 1000000000000000000 \
  --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
          

Delegate on behalf of another delegator

story validator stake-on-behalf \
  --chain-id 1514 \
  --validator-pubkey <VALIDATOR_PUB_KEY_IN_HEX> \
  --delegator-pubkey <DELEGATOR_PUB_KEY_IN_HEX> \
  --stake 1000000000000000000 \
  --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
          

Add operator

story validator add-operator \
  --chain-id 1514 \
  --operator <OPERATOR_EVM_ADDRESS> \
  --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
          

Remove operator

story validator remove-operator \
  --operator <OPERATOR_EVM_ADDRESS> \
  --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
          

Set / change withdrawal address

story validator set-withdrawal-address \
  --withdrawal-address <YOUR_EVM_ADDRESS> \
  --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
          

🔄 Unstaking

Unstake (self)

story validator unstake \
  --chain-id 1514 \
  --validator-pubkey $(story validator export | grep "Compressed Public Key (hex)" | awk '{print $NF}') \
  --unstake 1000000000000000000 \
  --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
          

Unstake

story validator unstake \
  --chain-id 1514 \
  --validator-pubkey <VALIDATOR_PUB_KEY_IN_HEX> \
  --unstake 1000000000000000000 \
  --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
          

Unstake on behalf

story validator unstake-on-behalf \
  --chain-id 1514 \
  --validator-pubkey <VALIDATOR_PUB_KEY_IN_HEX> \
  --delegator-pubkey <DELEGATOR_PUB_KEY_IN_HEX> \
  --unstake 1000000000000000000 \
  --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
          

⛓️ story-geth (EVM) Commands

Check running version

story-geth version
          

Latest block

story-geth --exec "eth.blockNumber" attach ~/.story/geth/story/geth.ipc
          

Check sync status

story-geth --exec "eth.syncing" attach ~/.story/geth/story/geth.ipc
          

List peers

story-geth --exec "admin.peers" attach ~/.story/geth/story/geth.ipc
          

Your enode

story-geth --exec "admin.nodeInfo.enode" attach ~/.story/geth/story/geth.ipc
          

Gas price

story-geth --exec "eth.gasPrice" attach ~/.story/geth/story/geth.ipc
          

Account balance

story-geth --exec "eth.getBalance('<YOUR_EVM_ADDRESS>')" attach ~/.story/geth/story/geth.ipc
          

🧹 Cleanup (Destructive)

Stop services

sudo systemctl stop story story-geth
          

Remove services

sudo rm /etc/systemd/system/story.service
sudo rm /etc/systemd/system/story-geth.service
sudo systemctl daemon-reload
          

Remove node data

rm -rf $HOME/.story
rm -rf $HOME/story
          

✅ Notes

  • Always restart story-geth first, then story
  • Many commands assume default ports — adjust if you customized them
  • Keep this file as a runbook for day-to-day operations