← Demo agents

Adjudication

Aave Oracle

Replaces a Chainlink-shaped feed in a forked Aave V3. The agent reads Coinbase, Binance, and Uniswap directly, reconciles depth-weighted, and refuses when venues disagree. Aave halts every operation that touches that asset's price.

Replaces a Chainlink-shaped feed in a forked Aave V3. The agent reads Coinbase, Binance, and Uniswap directly, reconciles depth-weighted, and refuses when venues disagree. Aave halts every operation that touches that asset's price.

Failure shape

Mango Markets, October 2022, $116M. Aave-shaped lending logic accepted a price its users had manipulated via a thinly-traded pool. The fix the industry chose was bigger oracles (more nodes, longer TWAPs). None of that addresses the structural issue: the contract has no way to decide whether the price it received corresponds to anything real.

What the agent reads

  • Coinbase L2 order book (Coinbase Pro endpoint, depth-walked for slippage)
  • Binance spot ticker (/api/v3/ticker/bookTicker)
  • Uniswap V3 ETH/USDC pool TWAP (on-chain)

Decision

Reconcile depth-weighted. If the three venues disagree by more than a configurable bps, OR if depth doesn't support the level, OR if an off-chain context event makes a venue stale (exchange halt, infura outage), return decision = REFUSED. The contract's latestRoundData() then reverts with PriceRefused, which Aave treats as a halt.

Code map

  • Agent: agents/price_oracle.ship, agents/PRICE_ORACLE_SOUL.md, agents/RECONCILIATION_POLICY.md
  • Tools: tools/src/{coinbase_orderbook,binance_ticker,uniswap_twap}.rs
  • Contract: contracts/src/AgentPriceFeed.sol (Chainlink V2 + V3 interfaces)
  • Aave (vendored, unmodified): contracts/lib/aave-v3-core/
  • Deploy: contracts/script/{DeployAave,DeployFeed,ConfigureMarket}.s.sol
  • UI: ui/src/app/aave/page.tsx

Try it

./scripts/setup_demo.sh           # local Theseus node + Aave deploy + agent registration
op deposit 1 && op borrow 1500    # both succeed at ~$3500/ETH
op tamper uniswap --price 100000  # override the Uniswap reading
# wait one tick (~60s)
op status                         # AgentPriceFeed.decision == REFUSED
op borrow 100                     # reverts: PriceRefused
op liquidate <user> USDC 100      # reverts: PriceRefused

Status

This is the only demo that requires running a local Theseus node — the other twelve run against Base Sepolia. See STATUS.md for the SHIP/runtime integration sketch.


Last updated: June 17, 2026.

Try it yourself

This agent runs live in your browser. Watch it read the inputs, reason, and sign its decision.

Run Aave Oracle