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