Collateral (Energy/Carbon NFTs)
Scope & invariants:
This page specifies how PoV-backed tokens become collateral for credit on EDMA: We accept Energy (1 MWh) and Carbon (1 tCO₂e) tokens that passed PoV and One-Claim; we do not accept ETT (proof-only) or frozen/mirrored-invalid assets. Credit is extended in EDSD and repaid in EDSD. Nothing here weakens settlement law:
No EMT, no funds (Trade):
Must-fund before shipping (Top-up after Pre-Ship EMT):
One-Claim uniqueness:
Locked EDSD → Unlocked EDSD only on proof:
50% of every protocol fee burns in EDM (on settle/release/retire, not on lending):
Bridges: collateral must be canonical on EDMA (not a wrapped representation). EDSD is platform-bound (no retail bridge).
A) Eligibility (what can be pledged)
Must be true:
PoV-minted token with One-Claim FINAL: see proofs on listing page.
Not FROZEN: no active revocation/mirror freeze.
Registry Mirror ACTIVE where program requires (I-REC/GO/VCM):
Not retired, not exported, not already pledged (single-pledge rule):
Fungibility bucket recognized (see below) and priced by oracles:
Not eligible:
ETT (proof-only), EMTs, wrapped/bridged representations, or tokens under dispute/freeze:
Tokens with insufficient oracle quality (illiquid buckets) or expired vintage where program disallows forward use:
Buckets (for valuation & LTV):
Carbon: program, method, region, vintage (e.g., VERRA/ARR/AMR/2026)
Energy: region, standard (e.g., DE/GO) or programmatic hourly → 1 MWh aggregates
B) Custody & pledge (how it’s held)
Vault custody (non-custodial smart contract): token is transferred to CollateralVault; becomes non-transferable until released.
Vault mints a Pledge Receipt (PR) to the borrower (non-transferable soulbound): recording tokenId, bucket, last_mark, cap_LTV, expiry.
No rehypothecation: Only the borrower can instruct release/repay; liquidator paths are controlled (see Liquidations spec).
One-Pledge ledger ensures a token cannot be pledged twice:
APIs:
POST /v1/defi/pledge { token_id } → { pledge_id, bucket }:
POST /v1/defi/release { pledge_id } (only when debt=0):
Events:
defi.pledge.created(pledgeId, tokenId, bucket):
defi.pledge.released(pledgeId):
C) Valuation & oracles (what it’s worth, safely)
Price sources (hierarchy):
On-platform TWAP (Tokens book) per bucket: volume-weighted over N hours (governed, default 72h).
Cross-venue quotes (if mirrored program has a public reference): normalized to EDSD.
Admin mark-to-model fallback (governed; haircuts ↑; used only if TWAP < min samples):
Quality gates:
Min prints per window, turnover, depth at ±Δ%, dispersion (stability): drive a Liquidity Score (LS 1..5).
Staleness SLO: price window ≤ 24h p95; if stale → LTV hard-capped at 20% or bucket disabled.
Mark function: mark = min(TWAP, last_trade × (1 − guardrail_bps)) with governance guardrails (e.g., 5–10% below last trade).
D) LTV bands & risk parameters (by bucket)
Bucket example
LS
Base LTV
Max LTV
Liq threshold (HF)
Haircut notes
CARB VERRA ARR AMR 2026
5
55%
60%
1.05
High liquidity & standard quality
CARB VERRA REDD+ LATAM 2025
4
50%
55%
1.08
Policy/quality variance risk
ENER GO DE
4
50%
55%
1.08
GO/REC parity, stable demand
ENER GO SG
3
45%
50%
1.10
Smaller book depth
Hourly attributes (24/7)
2
35%
40%
1.12
Short-dated; roll/aggregate risk
Long-tail buckets
1
0–25%
25%
1.15
By exception only
Concentration controls:
Per borrower: ≤ 30% of debt in one bucket, ≤ 50% in one program/region.
Per bucket: global utilization caps (e.g., $X notional).
Aging / eligibility:
Carbon vintages older than policy threshold (e.g., >7 years): get −5..10% LTV or disabled.
Frozen/mirror-invalid → LTV=0 until cleared.
E) Loan model (what you borrow, how it accrues)
Currency: EDSD only (platform stable).
Facility types:
Term: fixed tenor, bullet/milestone amortization
Revolving: redraw up to limit while HF ≥ min
Accrual: simple APR (governed grid by bucket/LS), debited daily to principal; repay any time.
Fees: origination/roll fees (from treasury half only); no impact on burns.
Health Factor (HF): HF = sum_i (V_i × LTV^max_i) / Debt; Margin call at HF ≤ 1.10, liquidation at HF ≤ 1.00 (or per-bucket stricter threshold).
APIs:
POST /v1/defi/borrow { pledge_id, amount_edsd } → checks HF, caps, LS:
POST /v1/defi/repay { loan_id, amount_edsd } → partial/Full:
GET /v1/defi/health { loan_id } → HF, marks, margin requirements:
F) Marking, calls & cures
Mark frequency: hourly recompute, event-driven on price moves, mirror/freeze events.
Margin call: HF ≤ call_threshold → webhook defi.margin.call with cure deadline (e.g., 24–48h).
Cure by: repay, add collateral, or swap buckets (if policy allows).
No cure: position enters partial liquidation up to HF restore (see Liquidations spec).
G) Where burns appear (and where they don’t)
No burns at pledge/borrow/repay/release:
Burns happen when tokens trade or retire (Tokens 4% → burn 2%) and when Trade milestones release (0.5%/stage → burn 0.25% until caps):
Lending fees, staking rewards, and grants source from the treasury half only.
H) Security & compliance levers
Freeze propagation: if a pledged token becomes FROZEN (revocation/mirror revoke), borrowing is blocked and HF recomputed; margin call may trigger.
KYC/KYB / sanctions: borrower & pledge owners must be whitelisted; custody moves logged.
Auditability: pledge → price → HF → borrow/repay → release is fully evented; ledgers export CSVs.
I) KPIs & SLOs (what we publish)
Oracle freshness (p95): ≤ 24h; > 2 feeds for top buckets
Liquidation loss rate: 0 (target; measured net of recovery)
Margin call cure rate: ≥ 90% within SLA
Utilization per bucket: within governance caps
Borrow APR spread vs LS: within governed grid; no out-of-band loans
J) Worked examples
1) Carbon collateral (VERRA ARR 2026, LS=5):
Mark = $18/t, pledge 10,000 t → V = $180,000
Base LTV 55% → max debt $99,000 EDSD
Borrow $85,000 → HF = (180k×0.60)/85k ≈ 1.27 (safe)
Price drops to $15 → V=150k, HF=(150k×0.60)/85k ≈ 1.06 → margin call (cure: repay ~$5k or add ~1,900 t)
2) Energy collateral (GO DE, LS=4):
Mark $50/MWh, pledge 2,000 MWh → V=$100,000
Base LTV 50% → max $50,000; borrow $45,000 → HF=(100k×0.55)/45k=1.22
Mirror freeze hits (registry issue) → LTV=0 during freeze → HF=0 → immediate margin requirement or partial liquidation.
K) Governance knobs (bounded)
Enable/disable buckets; set LS thresholds, LTV grids, HF thresholds, utilization caps:
Configure price oracle windows, sources, and fallback policies:
Set margin call cure windows and liquidation penalties (page 3):
Cannot: accept frozen/bridged/ETT; bypass PoV/One-Claim; discount burns; pledge the same token twice.
Plain recap
Last updated