Skip to content

Proof run

Proof run

Every step of the last run, with its on-chain transactions and the recorded log.

In plain terms: The whole system run end to end on a public test blockchain. Every step links to its transaction, so anyone can check that it happened.

Runs start only on a local server.

Run 20261017T141639Z

This runPassedReal proofs
Network
80
114,132,609
Independent checks
15 passed
8 of 8
Duration
14 min 53 s

Started 17 Oct 2026, 14:16 UTC, finished 17 Oct 2026, 14:31 UTC.

Static snapshot of this verified run (re-verified on-chain: VERIFIED: run 20261017T141639Z on base-sepolia (80 transactions)). Every transaction links to its block explorer. The files that prove it are in the evidence bundle. To run the scenario yourself: make demo (local chain) or make demo-base (Base Sepolia).

This run

Every step

16 steps and 80 , in order. Open a step to see what it did and its transactions on the block explorer. The last step re-checks everything from the chain.

  1. Checks the chain and the proof tooling, and tops up the demo wallets with test ETH so each role can pay for its transactions.

    chain 84532; roles: admin=0x4a1740CE…, oracle=0xf0c8e24C…, issuer_ops=0x7660780D…, buyer=0x99EEAb0f…, ghost=0x64f777C7…, datahub=0x90a99B84…, investor=0x6B7B0636…, agent=0xE164CB21…

This run

Recorded log of run 20261017T141639Z

The run's console output, exactly as printed, from the command to its exit status. It was scanned for secrets before it was published.

evidence/base-sepolia-20261017T141639Z/console.txt
.venv/bin/python -m hourproof demo --network base-sepolia

▶ Preflight: chain, keys, ZK artifacts
  ✓ chain 84532; roles: admin=0x4a1740CE…, oracle=0xf0c8e24C…, issuer_ops=0x7660780D…, buyer=0x99EEAb0f…, ghost=0x64f777C7…, datahub=0x90a99B84…, investor=0x6B7B0636…, agent=0xE164CB21…

▶ Deploy contracts and wire roles
  ✓ 15 contracts

▶ AI agent commits its 7 day plans (certificate purchases, CO2 forecast, planned load shift) on-chain before each day starts
  ✓ 0/7 committed before their day started (chain clock) — on a public chain a past week is necessarily committed late; see `live` mode

▶ Oracle posts metered hourly production (Energinet, whole MWh)
  ✓ 372,477 MWh wind + 23,869 MWh other clean

▶ Oracle posts the week's hourly grid CO2 intensity (Energinet, whole g/kWh)
  ✓ 168 hours, 14-133 g/kWh (location-based average, 125 % method); write-once

▶ Issuer A issues hourly certificates, one ML-DSA-44-signed batch per day
  ✓ 168 certificates, 34,702 MWh, 7 post-quantum signatures checked on-chain

▶ Buyer opens a claim for the week and cancels its certificates into it
  ✓ claim #1: 34,702 MWh cancelled across 168 hours

▶ Attacks: ghost double claim, over-issuance, forged signature

⚔ Registry B re-sells 50 MWh of hour 57 that the buyer already claimed
  ✓ blocked by SliceAlreadyClaimed

⚔ Issuer certifies 1 MWh more than the metered production of that hour
  ✓ blocked by ExceedsProduction

⚔ Someone impersonates issuer A with a different ML-DSA key
  ✓ blocked by BadIssuerSignature
  ✓ all three blocked on-chain

▶ Metering data hub attests a commitment to the buyer's hourly load
  ✓ commitment 0x1c8ae5e1a7d1b06b…; the load itself never goes on-chain

▶ Buyer proves hourly coverage ≥ 75.00% in zero knowledge
  ✓ on-chain: coverage ≥ 75.00% (true value stays private); 4,541,012 gas

▶ Attacks: over-claim the coverage, replay the proof for more

⚔ Buyer tries to prove 77.48% (one basis point above the truth)
  ✓ blocked by ProverRefused

⚔ Buyer resubmits the valid proof claiming 5 points more
  ✓ blocked by ProofRejected
  ✓ blocked

▶ Buyer proves residual emissions ≤ 546.1 t AND coverage ≥ 75.00% in zero knowledge (same attestation)
  ✓ on-chain: residual ≤ 546.1 t CO2 and coverage ≥ 75.00%; hourly load stays private; 5,387,099 gas

▶ Attacks: under-state the residual, re-post a cleaner intensity, prove on a fake intensity vector

⚔ Buyer tries to prove residual ≤ 546.124 t (1 kg below the truth)
  ✓ blocked by ProverRefused

⚔ Oracle re-posts hour 104 (133 g/kWh) 100 g/kWh cleaner
  ✓ blocked by AlreadyPosted

⚔ Buyer proves residual ≤ 379.2 t on a fake intensity vector 30 % cleaner than the oracle's
  ✓ blocked by ProofRejected
  ✓ blocked (the contract rebuilds the intensity vector from the oracle)

▶ Sustainability-linked note settles on the proven KPI
  ✓ KPI residual <= 428.5 t (proven <= 546.1 t) missed → coupon 6.00% (60 tUSD on 1,000 notes)

▶ Agent reveals its plans; the chain checks them against the commitments
  ✓ 7/7 plans revealed and matched

▶ Independent check: receipts, contract code, wiring, and both proofs re-verified on-chain from the submitted transactions
  ✓ 15 checks passed against base-sepolia; 80 receipts confirmed

=== result ===
{
  "status": "done",
  "coverage_naive_bps": 7063,
  "coverage_agent_private_bps": 7747,
  "proven_bps": 7500,
  "attacks_blocked": 8,
  "attacks_total": 8,
  "mode": "carbon",
  "proven_residual_kg": 546125,
  "residual_private_kg": {
    "carbon_agent": 546125,
    "procurement_agent": 562238,
    "no_shift": 615809
  },
  "residual_target_kg": 428509,
  "coverage_procurement_load_bps": 7780,
  "co2_mae_week_g_per_kwh": {
    "model": 15.62674163170844,
    "lag168": 40.541777166128405
  },
  "verified_checks": 15,
  "transactions": 80,
  "gas_total": 114132609
}
DEMO_BASE_EXIT=0
The same file in the repository