Verified carbon credits. Permanent retirement. Full provenance.
A decentralized carbon credit marketplace on Stellar where carbon projects mint tokenized RWAs, corporations buy and retire them on-chain, and every credit has an immutable audit trail from issuance to retirement.
- The Problem
- The Solution
- How It Works
- Architecture
- Smart Contracts
- Tech Stack
- Project Structure
- Getting Started
- Contract Deployment
- Oracle Setup
- Frontend Setup
- Running Tests
- User Roles
- Credit Lifecycle
- Roadmap
- Contributing
- License
The voluntary carbon credit market moves over $2 billion annually β yet it is riddled with:
- Fraud β projects claiming credits for sequestration that never happened
- Double-counting β the same tonne of CO2 sold to multiple buyers
- Opacity β corporations have no way to verify what they actually bought
- Greenwashing β retired credits with no on-chain proof of retirement
- Inaccessibility β small projects cannot afford traditional registry fees
The result is a market where companies pay real money for carbon credits that may not represent real impact β and have no way to prove otherwise to regulators or the public.
CarbonLedger puts the entire carbon credit lifecycle on Stellar:
- Every credit is minted with a unique serial number β double counting is mathematically impossible
- Every retirement is permanently irreversible on-chain β greenwashing is eliminated
- Every credit carries full provenance β from project registration to satellite monitoring to issuance to transfer to retirement
- Every retirement generates a beautiful verifiable certificate with a permanent public URL
- The entire audit trail is publicly accessible without a wallet β regulators, journalists, and the public can verify everything
PROJECT DEVELOPER CARBONLEDGER CORPORATION
β β β
βββ Submit project ββββββΊβ β
β (methodology + β β
β coordinates) β β
β ββββ Oracle monitoring ββββββ
ββββ Project verified ββββ (satellite data) β
β β β
βββ Request issuance ββββΊβ β
β (verified tonnes) β β
ββββ Credits minted ββββββ β
β (serial numbers β β
β assigned) β β
β ββββ Browse marketplace βββββ
β ββββ Purchase credits βββββββ
ββββ USDC payment ββββββββ β
β ββββ Retire credits βββββββββ
β β (beneficiary + reason) β
β ββββΊ Certificate issued βββββΊβ
β β (permanent on-chain) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NEXT.JS 14 FRONTEND β
β Public Audit β Marketplace β Buy β Retire β Dashboard β
βββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β @stellar/stellar-sdk
β @stellar/freighter-api
βββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββ
β SOROBAN CONTRACTS (Rust) β
β carbon_registry β carbon_credit β carbon_marketplace β
β carbon_oracle β
βββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β py-stellar-base
βββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββ
β ORACLE / VERIFICATION BRIDGE (Python) β
β verification_listener β price_oracle β satellite_monitor β
βββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββ
β OFF-CHAIN LAYER (PostgreSQL + IPFS) β
β Project docs β Credit batches β Retirements β Certificates β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CarbonLedger deploys 4 Soroban contracts written in Rust:
Manages carbon project registration, verification, and lifecycle status.
| Function | Description |
|---|---|
register_project() |
Submit a new carbon project for verification |
verify_project() |
Accredited verifier approves a project |
reject_project() |
Permanently reject a fraudulent project |
suspend_project() |
Halt new issuance from project under investigation |
update_project_status() |
Oracle pushes monitoring data on-chain |
get_project() |
Query full project details |
Mints, transfers, and permanently retires tokenized carbon credits.
| Function | Description |
|---|---|
mint_credits() |
Mint credits for verified projects with unique serial numbers |
retire_credits() |
Permanently and irreversibly retire credits on-chain |
transfer_credits() |
Transfer credits between accounts |
verify_serial_range() |
Detect double issuance before minting |
get_credit_batch() |
Query a credit batch by ID |
get_retirement_certificate() |
Retrieve a permanent retirement certificate |
Handles credit listings, purchases, and bulk corporate buying.
| Function | Description |
|---|---|
list_credits() |
List credits for sale with price per tonne |
delist_credits() |
Remove an active listing |
purchase_credits() |
Buy credits β USDC to seller, credits to buyer |
bulk_purchase() |
Corporations buy from multiple projects in one tx |
get_active_listings() |
Browse all available credits |
get_listings_by_vintage() |
Filter credits by vintage year |
Receives and validates off-chain monitoring and price data.
| Function | Description |
|---|---|
submit_monitoring_data() |
Verifier pushes satellite monitoring data |
update_credit_price() |
Push benchmark price per methodology and vintage |
flag_project() |
Flag a project for investigation |
is_monitoring_current() |
Returns false if no data in last 365 days |
get_benchmark_price() |
Get current market price per methodology |
pub enum CarbonError {
ProjectNotFound = 1,
ProjectNotVerified = 2,
ProjectSuspended = 3,
InsufficientCredits = 4,
AlreadyRetired = 5,
SerialNumberConflict = 6,
UnauthorizedVerifier = 7,
UnauthorizedOracle = 8,
InvalidVintageYear = 9,
ListingNotFound = 10,
InsufficientLiquidity = 11,
PriceNotSet = 12,
MonitoringDataStale = 13,
DoubleCountingDetected = 14,
RetirementIrreversible = 15,
ZeroAmountNotAllowed = 16,
ProjectAlreadyExists = 17,
InvalidSerialRange = 18,
}| Layer | Technology |
|---|---|
| Smart Contracts | Rust + Soroban SDK |
| Blockchain | Stellar Mainnet / Testnet |
| Frontend | Next.js 14 (App Router) + TypeScript |
| Wallet | Freighter (@stellar/freighter-api) |
| Stellar SDK | @stellar/stellar-sdk, soroban-client |
| Payment Token | USDC on Stellar |
| Trading | Stellar DEX (SDEX) |
| Oracle Bridge | Python + py-stellar-base |
| Satellite Data | Google Earth Engine / Planet Labs |
| Price Feeds | Xpansiv CBL + Toucan Protocol |
| Database | PostgreSQL + Prisma ORM |
| File Storage | IPFS via Pinata |
| Auth | JWT + Stellar keypair + SEP-0030 |
| Backend API | NestJS |
| Testing | Rust unit tests + Stellar Testnet |
carbonledger/
βββ contracts/
β βββ carbon_registry/
β β βββ src/lib.rs
β β βββ Cargo.toml
β βββ carbon_credit/
β β βββ src/lib.rs
β β βββ Cargo.toml
β βββ carbon_marketplace/
β β βββ src/lib.rs
β β βββ Cargo.toml
β βββ carbon_oracle/
β βββ src/lib.rs
β βββ Cargo.toml
βββ oracle/
β βββ verification_listener.py
β βββ price_oracle.py
β βββ satellite_monitor.py
β βββ requirements.txt
βββ frontend/
β βββ app/
β β βββ page.tsx
β β βββ projects/
β β βββ marketplace/
β β βββ buy/
β β βββ retire/
β β βββ dashboard/
β β βββ verify/
β β βββ audit/
β βββ components/
β β βββ CreditCard.tsx
β β βββ RetirementCertificate.tsx
β β βββ ProvenanceTrail.tsx
β β βββ MarketplaceFilter.tsx
β β βββ BulkPurchaseCart.tsx
β β βββ AuditExplorer.tsx
β β βββ SerialNumberLookup.tsx
β β βββ OracleStatus.tsx
β β βββ Toast.tsx
β β βββ LoadingSkeleton.tsx
β β βββ ErrorBoundary.tsx
β β βββ TransactionStatus.tsx
β βββ lib/
β β βββ stellar.ts
β β βββ soroban.ts
β β βββ freighter.ts
β β βββ carbon-utils.ts
β β βββ sdex.ts
β β βββ api.ts
β β βββ wallet-errors.ts
β βββ styles/
β βββ design-system.ts
βββ backend/
β βββ src/
β β βββ auth/
β β βββ projects/
β β βββ credits/
β β βββ retirements/
β β βββ marketplace/
β β βββ oracle/
β βββ prisma/schema.prisma
βββ .github/
β βββ workflows/ci.yml
βββ .env.example
βββ docker-compose.yml
βββ Stellar.toml
βββ README.md
# Rust + Soroban
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add wasm32-unknown-unknown
cargo install --locked soroban-cli
# Stellar CLI
cargo install stellar-cli
# Node.js 18+
node --version
# Python 3.10+
python3 --version
# PostgreSQL
psql --versiongit clone https://github.com/YOUR_USERNAME/carbonledger.git
cd carbonledgercp .env.example .env# Stellar
STELLAR_NETWORK=testnet
STELLAR_RPC_URL=https://soroban-testnet.stellar.org
STELLAR_HORIZON_URL=https://horizon-testnet.stellar.org
NETWORK_PASSPHRASE="Test SDF Network ; September 2015"
# Contract Addresses (after deployment)
CARBON_REGISTRY_CONTRACT_ID=
CARBON_CREDIT_CONTRACT_ID=
CARBON_MARKETPLACE_CONTRACT_ID=
CARBON_ORACLE_CONTRACT_ID=
# Oracle Keypair
ORACLE_SECRET_KEY=
ORACLE_PUBLIC_KEY=
# Admin Keypair
ADMIN_SECRET_KEY=
ADMIN_PUBLIC_KEY=
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/carbonledger
# IPFS
IPFS_API_URL=https://api.pinata.cloud
IPFS_API_KEY=
IPFS_SECRET_KEY=
# Satellite Data
GOOGLE_EARTH_ENGINE_KEY=
PLANET_LABS_API_KEY=
# Price Feeds
XPANSIV_API_KEY=
TOUCAN_API_KEY=
# JWT
JWT_SECRET=
JWT_EXPIRY=7dcd contracts
# Build all contracts
cargo build --target wasm32-unknown-unknown --release
# Deploy carbon_registry
stellar contract deploy \
--wasm target/wasm32-unknown-unknown/release/carbon_registry.wasm \
--source ADMIN_SECRET_KEY \
--network testnet
# Deploy carbon_credit
stellar contract deploy \
--wasm target/wasm32-unknown-unknown/release/carbon_credit.wasm \
--source ADMIN_SECRET_KEY \
--network testnet
# Deploy carbon_marketplace
stellar contract deploy \
--wasm target/wasm32-unknown-unknown/release/carbon_marketplace.wasm \
--source ADMIN_SECRET_KEY \
--network testnet
# Deploy carbon_oracle
stellar contract deploy \
--wasm target/wasm32-unknown-unknown/release/carbon_oracle.wasm \
--source ADMIN_SECRET_KEY \
--network testnetSave all returned contract IDs to your .env file.
cd oracle
pip install -r requirements.txt
# Start verification listener (polls every 6 hours)
python3 verification_listener.py
# Start price oracle (runs every 12 hours)
python3 price_oracle.py
# Start satellite monitor (webhook receiver)
python3 satellite_monitor.pycd frontend
npm install
npm run devInstall Freighter wallet and switch to Testnet.
docker-compose up --buildcd contracts
# Run all tests
cargo test
# Run per contract
cargo test -p carbon_registry
cargo test -p carbon_credit
cargo test -p carbon_marketplace
cargo test -p carbon_oracle
# With output
cargo test -- --nocapture| Contract | Tests |
|---|---|
| carbon_registry | 7 tests |
| carbon_credit | 10 tests |
| carbon_marketplace | 7 tests |
| carbon_oracle | 6 tests |
- Register carbon offset project with methodology and coordinates
- Submit monitoring data for credit issuance
- Track issued vs retired credits and receive USDC payments
- Browse credits by methodology, vintage year, country, and price
- Purchase single or bulk credits from multiple projects
- Retire credits and download permanent certificates for ESG reporting
- Accredited verifiers approve projects for credit issuance
- Submit on-chain attestations for monitoring periods
- Earn attestation fees per verified project
- Browse full audit trail without wallet connection
- Look up any serial number and see complete history
- Verify retirement certificates via permanent public URL
Project Registered β Verifier Approved β Oracle Monitoring β
Credits Minted (serial numbers assigned) β Listed on Marketplace β
Purchased by Corporation β Retired On-Chain (irreversible) β
Certificate Issued (permanent public URL) β
ESG Report Filed
| Parameter | Value |
|---|---|
| Serial number uniqueness | Globally enforced across all batches |
| Retirement | Permanently irreversible on-chain |
| Oracle freshness | 365 days maximum for monitoring data |
| Price cache TTL | 24 hours temporary storage |
| Methodology score minimum | 70 out of 100 |
| Price deviation alert | 15% single update threshold |
| Protocol fee | 1% of each transaction |
-
carbon_registryβ project registration and verification -
carbon_creditβ mint, retire, transfer with serial numbers -
carbon_marketplaceβ list, buy, bulk purchase -
carbon_oracleβ monitoring data and price feeds - 30 Rust unit tests
- Stellar Testnet deployment
- Verification listener service
- Xpansiv CBL price feed integration
- Google Earth Engine satellite webhook
- End-to-end oracle β Soroban test
- Freighter wallet integration
- Public audit explorer (no wallet required)
- Corporate bulk purchase flow
- Retirement certificate PDF generator
- Serial number lookup tool
- Smart contract security audit
- Gold Standard and Verra VCS methodology validation
- Mainnet deployment
- Regulatory compliance review
- Third party registry API integrations
git checkout -b feat/your-feature-name
git commit -m "feat: add your feature"
git push origin feat/your-feature-namePlease follow:
- Conventional Commits
CarbonErrorenum for all contract errors- Checks-effects-interactions in all Soroban contracts
- Retirement must always be irreversible β never add logic that undoes it
- No crypto jargon on buyer-facing pages
MIT License β see LICENSE for details.
- Stellar Development Foundation β Soroban and RWA infrastructure
- Verra VCS β carbon methodology standards
- Gold Standard β verification framework
- Xpansiv CBL β carbon market price data
- Google Earth Engine β satellite monitoring
Built on Stellar. Built for the planet.
β Star this repo if CarbonLedger matters to you
Website Β· Audit Explorer Β· Twitter Β· Discord