Skip to content

Kujira Oracle Guide


Validators are required to submit price feeds for the on-chain oracle. The price-feeder app can get price data from multiple providers and submit oracle votes to perform this duty.


  • This guide assumes you are running Ubuntu 22.04.
  • price-feeder needs access to a running node's RPC and gRPC ports. This guide assumes you have it on the same machine and uses localhost with default ports 26657 and 9090. Change these in config.toml as needed.

User setup

Best practice is to run node software on an isolated unprivileged user. We'll create the kujioracle user in this guide; if your username is different change it wherever it appears.

Create the kujioracle user

sudo useradd -m -s /bin/bash kujioracle

Build environment setup

If you've already followed the Node Guide, the only steps you need in this section are Install go toolchain #2 and #3. Repeating the others won't hurt if you want to be safe.

Install build packages

sudo apt install -y build-essential git unzip curl

Install go toolchain

  1. Download and extract go 1.18.5.
    curl -fsSL | sudo tar -xzC /usr/local
  2. Login as kujioracle.
    sudo su -l kujioracle
  3. Configure environment variables for kujioracle.
    cat <<EOF >> ~/.bashrc
    export GOROOT=/usr/local/go
    export GOPATH=\$HOME/go
    export GO111MODULE=on
    export PATH=\$PATH:/usr/local/go/bin:\$HOME/go/bin
    source ~/.bashrc
    go version  # should output "go version go1.18.5 linux/amd64"

Build price-feeder

  1. Login as kujioracle (skip if you're already logged in).
    sudo su -l kujioracle
  2. Build kujirad v0.5.0. We'll use the binary to create the keyring file.
    git clone
    cd core
    git checkout v0.5.0
    make install
    cd ..
    kujirad version  # should output "0.5.0"
  3. Build price-feeder.
    git clone
    cd oracle-price-feeder
    make install
    price-feeder version

Configure price-feeder

Create a wallet

This wallet will be relatively insecure, only store the funds you need to send votes.

  1. Login as kujioracle (skip if you're already logged in).
    sudo su -l kujioracle
  2. Create the wallet and a password for the keyring.
    kujirad keys add oracle
  3. Configure the keyring-file directory. This allows price-feeder to find the keyring.
    mkdir ~/.kujira/keyring-file
    mv ~/.kujira/*.info ~/.kujira/*.address ~/.kujira/keyring-file

Set the feeder delegation

This step will authorize your new wallet to send oracle votes on behalf of your validator. The transaction should be sent from the validator wallet so run on a node where it's available.

  • Replace <oracle_wallet> with your new wallet address.
  • Replace <validator_wallet> with you validator wallet name.
kujirad tx oracle set-feeder <oracle_wallet> --from <validator_wallet> --fees 250ukuji

Create the config

  1. Login as kujioracle (skip if you're already logged in).
    sudo su -l kujioracle
  2. Create the config file with your favorite text editor.

    • Replace <wallet_address> with your oracle wallet address (e.g. kujira16jchc8l8hfk98g4gnqk4pld29z385qyseeqqd0)
    • Replace <validator_address> with your validator address (e.g. kujiravaloper1e9rm4nszmfg3fdhrw6s9j69stqddk7ga2x84yf)
    gas_adjustment = 1.5
    gas_prices = "0.00125ukuji"
    enable_server = true
    enable_voter = true
    provider_timeout = "500ms"
    listen_addr = ""
    read_timeout = "20s"
    verbose_cors = true
    write_timeout = "20s"
    base = "USDT"
    threshold = "2"
    base = "ATOM"
    providers = [
    quote = "USD"
    address = "<wallet_address>"
    chain_id = "kaiyo-1"
    validator = "<validator_address>"
    prefix = "kujira"
    backend = "file"
    dir = "/home/kujioracle/.kujira"
    grpc_endpoint = "localhost:9090"
    rpc_timeout = "500ms"
    tmrpc_endpoint = "http://localhost:26657"
    enable_hostname = true
    enable_hostname_label = true
    enable_service_label = true
    enabled = true
    global_labels = [["chain_id", "kaiyo-1"]]
    service_name = "price-feeder"
    type = "prometheus"
    name = "binance"
    rest = ""
    websocket = ""

Configure the currency pairs

The [[currency_pairs]] provided in the config above is only an example, each validator should modify this to submit prices for the denoms whitelisted by the chain. Keep an eye out for governance proposals introducing new denoms and check the current ones here: kaiyo-1 oracle parameters.

Run price-feeder

  1. Login as kujioracle (skip if you're already logged in).
    sudo su -l kujioracle
  2. Run the app, providing the password on stdin.
    echo <keyring_password> | price-feeder ~/config.toml

Create a service

A systemd service will keep price-feeder running in the background and restart it if it stops.

  1. Create the service file with sudo using your favorite text editor. Replace <keyring_password> with the one you created.
    ExecStart=/home/kujioracle/go/bin/price-feeder /home/kujioracle/config.toml --log-level debug
  2. Reload systemd to pick up the new service.
    sudo systemctl daemon-reload
  3. Start the service.
    sudo systemctl start kujira-price-feeder
  4. Tail your service logs.
    sudo journalctl -fu kujira-price-feeder
  5. (Optional) Enable the service. This will set it to start on every boot.
    sudo systemctl enable kujira-price-feeder