OracleReports verifies that signature against
its configured validator keys and returns the report’s items. The consuming
contract defines which items it accepts and its limits for age, confidence,
flags, and repeated use. Use oracle data
describes the value acceptance checks.
Deployment configuration
The network operator supplies theOracleReports deployment address and
configuration for each validator set. The constructor permanently fixes that
set and the network identity. A changed validator set requires a new
deployment and retirement of the old verifier.
A proof of possession demonstrates that the validator holds the private key
for its public key. Its signature uses the domain separation tag
BLS_POP_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_. The constructor checks the key
encodings and possession proofs.
A verifier accepts reports only through retireHeight. When the validator set
changes, retire the old verifier so its keys cannot certify later reports. The
configured retirer can call retire(newRetireHeight) to lower the bound. The
new height must be strictly lower; it can never be extended. A successful call
emits RetireHeightLowered(uint64 retireHeight).
Report numbering
MetalOracle at 0x00000000000000000000000000000000000000fd exposes the read
function reportBaseMs() → uint64. It returns the starting Unix timestamp in
milliseconds for certified report numbering. Report sequence numbers count
one-second intervals from this timestamp. A return value of zero means certified
report publication is disabled.
Report RPC
metal_getOracleReport returns the latest retained certified report when
called with an empty parameter array. A single JSON integer parameter selects
a report by its sequence number, named height. The result is null when no
matching report is retained. Each node retains up to 64 certified reports.
verifyReport takes a signer bitmap and an EIP-2537 signature. The RPC exposes
signers and signature separately for that conversion. The certificate
field contains the encoded certificate for clients that use its native format.
Report format
The report bytes are ABI-encoded as(uint64 round, ReportItem[] items).
round is the report sequence number returned as height by the RPC.
Each ReportItem has these fields in order:
Item names, units, quote directions, and acceptance limits come from the feed
configuration and oracle catalog. Report items use the same status flag masks
as stored oracle observations:
Verifier interface
All functions except
retire are reads. verifyReport checks the retirement
bound, report number, signer bitmap, quorum, and signature. It returns the decoded items even when ok is
false. A consuming contract must require ok before using them. Item
selection, age, confidence, flags, and replay checks belong to that contract.
Signature encoding
The signer bitmap is exactlyceil(memberCount / 8) bytes. Validator index
i is bit i % 8 of byte floor(i / 8), counting from the least significant
bit. Unused bits in the last byte are zero.
The verifier’s signature argument is a 256-byte EIP-2537 G2 point. Its four
coordinates are x.c0 ∥ x.c1 ∥ y.c0 ∥ y.c1, each encoded as a 64-byte unsigned
big-endian integer. The RPC uses the 96-byte compressed form of the same point.
The signed message is
varint(len(ns)) ∥ ns ∥ varint(height) ∥ keccak256(report), where ns is
ackNamespace() and each varint is an unsigned LEB128 integer. The aggregate
signature uses the domain separation tag
BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_. In these encodings, ∥ means byte
concatenation.