Three interchangeable implementations of the same validator oracle duties — pick the language you're comfortable operating. They share one config file and are mutually exclusive: run exactly one at a time per validator (they'd race on the same signing key and scan cursor otherwise).
| Client | Directory | Status |
|---|---|---|
| Go | go/ |
Reference implementation |
| Python | python/ |
See python/README.md |
| JS / Node | js/ |
See js/README.md |
Each client performs the full validator oracle duty set:
- Bridge attestation — scans Steem for gateway transfers and payouts, submits
MsgAttestDeposit/MsgAttestWithdrawalPayout/MsgSubmitNameRegistrationto SteemVM. - Price feed — sources STEEM/USD_External + SBD/USD_External from CoinMarketCap or CoinGecko
(operator-selected via
ORACLE_PRICE_SOURCE) and STEEM/SBD_Internal + Price_Feed (Steem's own witness-median feed price) from the same Steem RPC node, and runs the commit-revealMsgAggregateExchangeRatePrevote/MsgAggregateExchangeRateVotecycle.
See Instructions/ORACLE_COMMANDS.md for the manual
steemvmd tx ... equivalents (useful for one-off attestation or debugging without running a
client), and PROTOCOL.md for the exact signing/hashing/formatting rules every
client implements — read that first if you're porting this to a fourth language.
cp oracle/.env.example oracle/.env # then edit oracle/.env
docker compose --profile go up -d # or: --profile python / --profile jsNever bring up more than one profile at once against the same validator key.