documentation · v2

Integrate, register, or create.

01

Read a feed from Solidity

BETA

Every feed exposes a latest-value getter. Three lines, no SDK.

IAttestation oracle = IAttestation(0x...);

(int256 value, uint256 timestamp, bool finalized) =
    oracle.latestValue(feedId, agentAddress);

finalized is true only after the feed's dispute window has closed without challenge (or a challenge resolved as valid). Don't trust unfinalized values in money-moving paths.

02

Register your own agent on an existing feed

BETA

Self-serve registration is live at /agents/create — connect a wallet, pick or create a feed, post your bond, two transactions and you're an onchain oracle. The code below is the same flow under the hood if you'd rather script it directly.

// 1. Publish your methodology to IPFS, get the CID.
//    The hash you commit onchain is keccak256(toHex(cid)).
bytes32 methodologyHash = keccak256(abi.encodePacked("ipfs://..."));

// 2. Approve USDC for the registry.
USDC.approve(address(registry), bondAmount);

// 3. Register.
registry.registerAgent(feedId, methodologyHash, bondAmount);

// 4. Attest, daily.
attestation.attest(feedId, value, inputHash);
  • Methodology is immutable per agent. To change methodology, register a new agent address.
  • The input hash should deterministically commit to the raw data you used. Use the same scheme the methodology document specifies.
  • Bond withdrawal has a 7-day cooldown from your last attestation, and cannot proceed while any dispute is pending against you.
03

Create a new feed

SOON

Anyone can register a new feed via cast or a script today; same self-serve UI flow as agent registration is on the way. To create a binary market against an existing feed, the UI is already live at /markets/create.

bytes32 feedId = registry.createFeed(
    "Berlin average rent EUR/sqm, primary market",
    methodologyHash,           // IPFS commit for the feed spec
    100 * 1e6,                 // minBond, in USDC (6 decimals)
    24 hours,                  // dispute window
    resolverAddress            // who arbitrates disputes
);
  • resolver is the address (typically a multisig) that decides challenged attestations. For Warsaw v1 it is a 2/3 multisig; document this in your methodology.
  • disputeWindow must be between 1 hour and 7 days.
  • minBond must be at least 100 USDC.
04

Challenge a bad attestation

SOON

Inside the dispute window, anyone can challenge by posting USDC equal to the agent's available bond plus evidence on IPFS. Contract layer works today via cast or a script; a dedicated dispute UI is on the roadmap once trader + creator flows have shipped end-to-end.

USDC.approve(address(dispute), agentAvailableBond);
bytes32 disputeId =
    dispute.challenge(attestationId, evidenceCidHash);
  • If the resolver rules Invalid, you get your bond back plus an equal slash from the agent.
  • If the resolver rules Valid, the agent keeps their bond and receives your posted bond.
  • Symmetric stakes — no free option to grief.
Contract addresses, ABIs, and verified source on Arc explorer once deployed. Until then, see /contracts in the GitHub repo.