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.
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.
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).
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.
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 } }
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");
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)
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.
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:
maxStaleness (default 5 minutes)
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.
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.
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.
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.