Oracle Network, live state

AereOracle V1 at 0xf0A1…F399, multi-reporter median price feed, 8-decimal precision. Every value below is a direct on-chain read of that contract.

This page reads the V1 oracle, and V1 is deprecated. Read this before you copy an address out of it. Our own registry marks 0xf0A1…F399 deprecated because of an audited defect: it could serve a median that a single fresh reporter controlled, with no freshness quorum underneath it. The corrected contract is AereOracleV2 0xca69AA96…490ACb1, measured live on 2026-08-01 with 3,631 bytes of runtime code, which reverts unless a quorum of authorised reporters are all fresh. New integrations should be written against V2. V1 is still shown here, and still read by the oracle adapter, because it is currently the live-read source and pretending otherwise would be the same mistake in the other direction. The repoint of the adapter onto V2 is pending on running enough independent reporters to satisfy V2's quorum.
Registered reporters
,
Active symbols
,
Max staleness
,
Decimals
,
Loading on-chain state…
Why isn't AERE/USD published? AERE has no CEX listing yet, and the only on-chain pool today is a 105-AERE demo seed, that is not a market price. We will only publish AERE/USD once there is real market liquidity (CEX order books, or a deep DEX pool whose price is set by arbitrage flow). The oracle is honest data only.
Loading symbols…
#
Address
Last submission
Submissions
Status
Loading reporters…

Connect a wallet to check if it's authorized as a reporter. Authorized reporters can submit price updates for any symbol. Prices are scaled to 8 decimal places (e.g. 1.00 USD = 100000000). Symbols are bytes32, short ASCII works directly (e.g. AERE/USD).

Wallet not connected.

Address change, 2026-08-01. These three snippets used to hardcode the V1 oracle 0xf0A1…F399, which our registry marks deprecated. They now point at AereOracleV2 0xca69AA961D836516010Ae669a223Ce249490ACb1, which has the same getPrice / submit / DECIMALS signatures, so this is a drop-in change for you. Know what you are getting, because we measured both on 2026-08-01 and neither one serves a price right now: getPrice("BTC/USD") reverts on V1 with "no fresh data" (V1 has 1 registered reporter) and reverts on V2 as well (V2 has 3 registered reporters and requires 3 to be simultaneously fresh). No price feed on this chain is currently live. The reason to write against V2 anyway is that when reporters do run, V2 refuses to serve a median that a single fresh reporter could set, and V1 does not.

Solidity (read in your contract)

interface IAereOracle {
  function getPrice(bytes32 symbol)
    external view returns (uint128 price, uint64 timestamp, uint256 contributors);
}

// 8-decimal price
contract MyDApp {
  IAereOracle constant ORACLE = IAereOracle(0xca69AA961D836516010Ae669a223Ce249490ACb1);
  function aereUsd() external view returns (uint128) {
    (uint128 p, uint64 t) = ORACLE.getPrice("AERE/USD");
    require(block.timestamp - t <= 5 minutes, "stale");
    return p; // scaled by 1e8
  }
}

JS / TypeScript (ethers v6)

import { JsonRpcProvider, Contract, encodeBytes32String } from "ethers";
const ro = new JsonRpcProvider("https://rpc.aere.network");
const oracle = new Contract(
  "0xca69AA961D836516010Ae669a223Ce249490ACb1",
  ["function getPrice(bytes32) view returns (uint128, uint64, uint256)"], ro);
const [price, ts, n] = await oracle.getPrice(encodeBytes32String("AERE/USD"));
console.log("AERE/USD =", Number(price) / 1e8, "from", n, "reporters");

Python (web3.py)

from web3 import Web3
w3 = Web3(Web3.HTTPProvider("https://rpc.aere.network"))
oracle = w3.eth.contract(
  address="0xca69AA961D836516010Ae669a223Ce249490ACb1",
  abi=[{"name":"getPrice","type":"function","stateMutability":"view",
        "inputs":[{"name":"s","type":"bytes32"}],
        "outputs":[{"type":"uint128"},{"type":"uint64"},{"type":"uint256"}]}])
sym = b"AERE/USD".ljust(32, b"\\0")
price, ts, n = oracle.functions.getPrice(sym).call()
print(price/1e8, n)

Reporter operator (write submissions)

import { JsonRpcProvider, Wallet, Contract, encodeBytes32String, parseUnits } from "ethers";
const w = new Wallet(process.env.REPORTER_KEY!, new JsonRpcProvider("https://rpc.aere.network"));
const oracle = new Contract("0xf0A1…F399",
  ["function submit(bytes32 symbol, uint128 price)"], w);
await oracle.submit(encodeBytes32String("AERE/USD"), parseUnits("1.234", 8));
// Run on a cron, e.g. every 60s, pulling from your data source.

Median consensus

Every authorized reporter can call submit(symbol, price) to record their latest reading. The oracle stores the most recent submission per (symbol, reporter) pair. When a consumer calls getPrice(symbol), the contract:

  1. Iterates every reporter's submission for that symbol
  2. Drops any submission older than maxStaleness (default 5 minutes)
  3. Sorts the remaining values and returns the median as the canonical price
  4. Returns the newest contributor timestamp + count

Median (rather than mean) makes the feed resistant to a single malicious or malfunctioning reporter publishing extreme values, they're outvoted by the rest. With n reporters, up to ⌊(n-1)/2⌋ can submit garbage without affecting the median, the same fault-tolerance bound as a Byzantine vote.

Staleness window

maxStaleness is owner-configurable between 30 seconds and 1 hour. Any consumer should also enforce its own freshness check after reading getPrice(), never trust a price whose timestamp is older than your application's tolerance.

Symbol naming

Symbols are bytes32 identifiers, conventionally short ASCII strings: AERE/USD, BTC/USD, ETH/USD, EUR/USD, etc. Use ethers.encodeBytes32String("AERE/USD") or web3.toBytes(text="AERE/USD").ljust(32, b"\\0") when calling.

Become a reporter

Reporter set is permissioned via onlyOwner addReporter(address). Open an issue at git.aere.network/aere-network/aere-contracts with operator profile, infra description, and price-source attribution. Reporters earn nothing on-chain currently, incentives will arrive via the DAO grant program once governance V2 has flowing budget.