Evidence Pipeline (PoV)

Purpose. Show, step-by-step, how raw meter data becomes on-chain proofs and energy assets under Proof of Verification—with gas-only proof mints on Base (L2) and EDM-settled actions (fees/burn) anchored to Ethereum (L1).

1

Capture & Canonicalize (off-chain)

  • Source: AMI/SCADA smart meters (or operator exports) produce a strict JSON describing a batch: device, window, quantity, method.

  • Canonical form: sorted keys, minified, fixed units (Wh).

  • Hash: evidenceHash = SHA-256(utf8(canonical_json)).

  • Signatures: device/operator signs the payload (or the file that produced it).

Why: canonicalization blocks “pretty-print” hash tricks; the same reality always hashes to the same bytes.

2

Attest (on-chain attestations)

Independent roles attest to the same evidenceHash via EAS-style records:

  • MeterReadingBatch.v1 — (batchId, deviceId, startTs, endTs, quantityWh, evidenceHash,…).

  • Verification.v1 — role-tagged PASS/FAIL over that identical evidenceHash (e.g., AUDITOR required).

  • (Optional) validUntil TTL for time-boxed verifications.

Quorum (v0.1 default): ≥2 verifications, ≥1 AUDITOR, ≥2 distinct roles.

3

Gate & Exclusivity (assertVerified)

The asset contract calls PoV Gate with the batch params and verification UIDs. The Gate:

  1. Computes route-agnostic

    claimId = keccak256(deviceId,startTs,endTs,quantityWh,evidenceHash).

  2. Reserves the claim in the One-Claim Ledger (atomic lock).

  3. Validates schema/equality (all attestations reference the same evidenceHash & window).

  4. Checks quorum (roles enabled, counts unrevoked, TTL valid; AUDITOR present).

  5. Emits PoVPassed and finalizes the claim in One-Claim (uniqueness guaranteed).

Fail-safe: any mismatch ⇒ revert (QUORUM_NOT_MET, EVIDENCE_HASH_MISMATCH, ALREADY_CLAIMED, etc.). No gate pass, no mint/settle.

4

Mint Proofs (Base, gas-only)

On PoV pass, proofs mint on Base at gas cost only:

  • ETT (proof, non-transferable): 1 ETT = 10 kWh verified. Stores claimId + attestation refs.

  • Energy NFT (1 MWh): when an account holds 100 ETT (policy-valid grouping), mint a 1 MWh certificate.

  • Carbon Credit NFTs: carbon projects mint directly per verified tCO₂ (with project/method metadata).

  • EMT (milestone proof): non-transferable proofs for on board / cleared / delivered / assay.

CLE is minted separately per verified MWh as a supplier reward; it is not converted from ETT.

5

Settle & Anchor (EDM, fees, burn)

When value moves, it settles in $EDM; proof creation remains free (gas-only).

  • Energy & Carbon trades/retirements: 4% total (2% buyer + 2% seller).

  • Commodity payout releases: 0.5% per milestone (caps: $5k ≤$1M, $12.5k $1–5M, $25k >$5M).

  • Split: 50% of every fee is burned on-chain; 50% goes to treasury (rebates may reduce treasury half only).

  • Anchoring: final lineage (evidence → attestations → proof → settlement/retirement) is anchored to Ethereum (L1) for auditability.

No auto-swap: if the payer lacks EDM, settlement reverts. Proofs remain unaffected.

6

Monitoring, Revocation & Rectification

  • PoV Feed watches EAS revocations/expiry/role changes and flags dependent assets on-chain within SLA (<24h).

  • Asset state: flagged/frozen (or burned, per policy) until quorum is restored; append-only rectification emits PoVRectified. History is never rewritten.

7

Privacy & Storage

  • On-chain: only hashes, identifiers, and links—no PII.

  • Off-chain: evidence blobs in S3/IPFS/partner vaults with signed URLs and access control.

  • Selective disclosure / ZK (optional): prove eligibility without revealing full payloads where required.

Developer notes (quick glue)

  • Call the Gate in the same tx that mints/settles.

  • Use the route-agnostic claimId above; do not embed route codes.

  • Proof mints/conversions: call after PoVPassed (gas-only on Base).

  • Settlement: invoke Fee Router; it enforces route fees and 50% burn.

TypeScript (claimId helper):

import { solidityPackedKeccak256 } from "ethers";
const claimId = solidityPackedKeccak256(
  ["bytes32","uint64","uint64","uint128","bytes32"],
  [deviceId, startTs, endTs, quantityWh, evidenceHash]
);

Last updated