Running the Price feeder

How to run your own Oracle and price feeder

The Price Feeder is an application used by validators to easily provide price feeds to the oracle module. The application abstracts away all the Oracle module requirements to the validators.

Price feeder details

The Price Feeder is an essential component for validators added to Kiichain since version v3.0.0 to provide accurate cryptocurrency price data to the Kiichain network using the Oracle module.

Prerequisites

  • A running Kiichain validator node

  • At least 1000000000000000000akii (1 Kii) in your validator account for feeder delegation

There are no fees to run the price feeder:

  • As long as it's voting once per voting period

  • And the voter is the expected address for each validator

Exchange Rates and Providers

These are the prices stored on the blockchain (represented in USD).

  • $BTC

  • $ETC

  • $SOL

  • $XRP

  • $BNB

  • $USDT

  • $USDC

  • $TRX

These are the providers by default on the price feeder:

Feeder account

One important concept about the Oracle module and price-feeder is the feeder account.

The feeder is an account that:

  • Separates your validator address from the account handling oracle feeds

    • This increases the security of your validator's main address

    • Keeps the validator’s signing key offline

Feeder account setup

To set up or update your feeder account, you can use the following TX:

# Set the variables for the transaction
FEEDER_ADDR=kii1... # Update with your feeder address
# The key name of the signer
# Should be the same as the one used to manage your validator
FROM_KEY_NAME=<key_name>

# Create the feeder
kiichaind tx oracle set-feeder $FEEDER_ADDR \
    --from $FROM_KEY_NAME --keyring-backend test \
    --gas auto --gas-adjustment 1.5 --gas-prices 100000000000akii \
    --node https://rpc.uno.sentry.testnet.v3.kiivalidator.com --chain-id oro_1336-1
    
# Fund feeder account
kiichaind tx bank send <validator-wallet> $FEEDER_ADDR 1000000000000000000akii \
    --from $FROM_KEY_NAME --keyring-backend test \
    --gas auto --gas-adjustment 1.5 --gas-prices 100000000000akii \
    --node https://rpc.uno.sentry.testnet.v3.kiivalidator.com --chain-id oro_1336-1

Upon TX success, the FEEDER_ADDR can then be used to provide price feeds for the Oracle module.

Installation Steps

The price feeder can be easily installed with our bootstrap script:

The script will automatically:

  • Build and install the price-feeder

  • Create a dedicated feeder account

  • Delegate price reporting rights

  • Fund the feeder account

  • Configure the systemd service

Manual installation

You can also install the price-feeder manually by following these steps:

  1. Build and install the price feeder

# Clone the price feeder
git clone [email protected]:KiiChain/price-feeder.git

# Install the application
cd price-feeder
make install

# Test if the binary was installed correctly
price-feeder version

2. Configure the price-feeder

Download our example config with:

wget https://raw.githubusercontent.com/KiiChain/price-feeder/refs/heads/main/config.example.toml
mv config.example.toml price-feeder.config

Now read the file and update all the main configurations based on our next section:

  1. Test your configuration

You can always test your configuration using:

# Export your feeder private key
export PRICE_FEEDER_PASS=<my_keyring_pass>

# Run the price feeder
# You may also provide the argument --skip-password if your keyring is test
# or has no password
price-feeder start price-feeder.config
  • Pay attention to the logs and errors

  • After running for a few seconds, all errors should clear out

  • If errors persist, your feeder address may be configured incorrectly

  1. Create the systemctl service

Upon confirmation that the price feeder is correctly configured, you can turn it into a service with this example systemd service file:

[Unit]
Description=Price Feeder
After=network-online.target
 
[Service]
User=root
Type=simple
Environment="PRICE_FEEDER_PASS=YOUR_KEYRING_PASSWORD"
ExecStart=/usr/bin/price-feeder start /price_feeder_config.toml
Restart=on-failure
RestartSec=3
LimitNOFILE=6553500
 
[Install]
WantedBy=multi-user.target

Don't forget to check:

  • Your user is not root

  • The path for the price-feeder and the path for the configuration file

  • Your keyring password

  1. Verify Operation

Check the service logs:

journalctl -fu price_feeder.service

Price feeder configuration

There are multiple configurations that are important when managing the price feeder:

Some important configurations are:

[account]
# The account name to use for signing transactions
# Can be the validator master account or a feeder account
address = "kii1..."
# The validator who is voting
validator = "kiivaloper1..."
# The prefix for the keys
prefix = "kii"
# The chain ID for signatures
chain_id = "oro_1336-1"

Here you should set up the details of your account:

  • address: This is the feeder address used on the price-feeder

  • validator: This is your validator address. This is important when sending the feeds to the Oracle module

[rpc]
# The RPC endpoint for the node that will send transactions
grpc_endpoint = "localhost:9090"
# The timeout for RPC calls
rpc_timeout = "500ms"
# The Tendermint RPC endpoint for querying the blockchain
tmrpc_endpoint = "http://localhost:26657"

The above defines your RPC configuration:

  • It's highly recommended to point the endpoints to local nodes, but pointing to remote nodes is also possible

[keyring]
# The keyring backend to use for storing keys
backend = "os"
# The keyring directory where keys are stored
dir = "~/.kiichain"

This defines your keyring configuration:

  • We highly recommend using OS as your keyring for the feeder key

  • The Keyring password should be provided with the environment key PRICE_FEEDER_PASS

Important Note: Oracle Voting Performance Requirements

Validators running the Price Feeder must maintain a high success rate when submitting price votes. The Oracle module enforces this through a slashing mechanism:

  • MinValidPerWindow Parameter: This governance-defined threshold (5%) sets the minimum percentage of successful votes a validator must submit per voting window (3600 blocks).

  • Penalty for Underperformance: If a validator’s ratio of successful votes / total votes falls below MinValidPerWindow:

    • The validator is automatically jailed

    • It cannot participate in consensus or earn staking rewards

    • Manual unjailing requires a governance proposal or fixed downtime duration

  • Recommendations for Validators:

    • Monitor your feeder’s logs (journalctl -fu price_feeder.service)

    • Ensure stable API connections to price providers

    • Maintain sufficient gas fees for timely transactions

References

Acknowledgment

This is the Kiichain version of the incredible work of SEI on the price feeder module. The original implementation is available at SEI's price-feeder.

Last updated

Was this helpful?