Everything you need to walk through PPA Protocol - whether you're a hackathon judge evaluating the full stack or a user exploring solar RWA yield for the first time.
The demo uses time-warp: the oracle pushes a new simulated day every 60 seconds, and the agent evaluates every 10 seconds. Every transaction is real and verifiable on Mantlescan.
PlantRegistry on-chain.
Funded event with your address,
watt amount, and PPAT tokens minted.
AgentDecision events
from the AgentRegistry contract in real time. Every decision - including HOLD - is a transaction.
AgentDecision(agentId, funder, action, amount, daysToBill, reasonCode).
Click any event row to open the Mantlescan transaction - the raw log data is verifiable.
The agent has no LLM in the transaction path; all decisions are deterministic threshold logic.
BillPay.settle()
- the card flips to Settled with a Mantlescan link, no user action needed.
AGENT_ROLE on BillPay and
CreditVault, scoped only to those two contracts - no other permissions.
make test.Contracts are already deployed - you don't need to redeploy. Just clone, fill in keys, and run the demo stack.
AGENT_ROLE on AgentRegistry. All addresses are in frontend/public/deployed.json.
All on Mantle Sepolia (chain ID 5003). Click any address to open Mantlescan.
| Contract | Role in demo | Address | |
|---|---|---|---|
| PlantRegistry | Plant metadata, oracle signer, PPA data read by S1 | 0x7d15…653B6 | View ↗ |
| PPAToken | ERC-20 PPAT - minted in S2, balance shown in S3 | 0x50Fe…1644 | View ↗ |
| PlantEscrow | Receives USDT in S2, triggers PPAToken mint | 0x483A…A471 | View ↗ |
| CreditOracle | ECDSA-signed daily kWh; oracle timestamp shown in S3 | 0x7740…4D429 | View ↗ |
| RevenueSplitter | kWh → USDT conversion, Merkle-batched pro-rata distribution | 0x58D8…fE14 | View ↗ |
| CreditVault | Per-funder claimable USDT balance; balance shown in S3 | 0x59d5…3d14 | View ↗ |
| YieldRouter | Agent-only path to USDY pool; used in DEPLOY / RETRIEVE | 0xEB78…41Ca7 | View ↗ |
| BillPay | Bill registration; agent calls settle() in S5 | 0xE7e2…2211 | View ↗ |
| AgentRegistry | ERC-8004 identity NFT; emits AgentDecision events shown in S4 | 0x6f89…4350 | View ↗ |
Fund a real solar plant from $10, earn daily revenue, and let an AI agent handle the rest. No active management required.
AgentDecision events with direct links to each transaction.
For both judges and users.
keeper/.env and
frontend/.env, switch VITE_NETWORK=mainnet
and update the RPC to https://rpc.mantle.xyz. Run
make deploy RPC=$(MAINNET_RPC) to redeploy.
DEMO_MODE=false in keeper/.env
to switch to production cadence (oracle daily, agent every 6 hours).