ZIPsZoo Proposals
ZIP-0103

Green Staking Mechanism

Draft

Staking that rewards validators for verified conservation outcomes

Type
Standards Track
Category
DeFi
Author
Zoo Labs Foundation
Created
2025-01-15
stakingconservationproof-of-impactvalidatorsgreen

ZIP-103: Green Staking Mechanism

Abstract

This ZIP defines a Green Staking Mechanism for the Zoo L2 chain that extends traditional proof-of-stake economics with a Proof of Impact (PoI) layer. Stakers lock ZOO tokens and, in addition to standard staking rewards, receive bonus yield proportional to verified conservation outcomes they sponsor. Conservation outcomes are measured per ZIP-501 standards and attested on-chain by a decentralized network of impact verifiers. The mechanism creates a direct economic link between network security participation and real-world ecological benefit, transforming staking from a purely financial activity into a conservation funding instrument.

Motivation

Proof-of-stake networks secure billions in value but produce zero positive externalities beyond network security. The energy saved relative to proof-of-work is often cited as "green," but this framing conflates reduced harm with active benefit.

Zoo as an L2 on Lux inherits primary network security (ZIP-15). However, the Zoo chain operates its own staking layer for governance weight, liquidity provision, and conservation alignment. This staking layer is the target of this proposal.

Key motivations:

  1. Incentive alignment: Stakers who fund conservation earn more than passive stakers, directing capital toward ecological benefit.
  2. Measurable impact: Unlike carbon-offset schemes with questionable additionality, Zoo conservation outcomes are verified by independent field partners and attested on-chain.
  3. Competitive differentiation: Zoo becomes the first L2 where staking directly funds wildlife conservation.
  4. DAO treasury sustainability: Staking rewards partially fund the conservation treasury, reducing reliance on one-time donations.
  5. veZOO governance: Long-term stakers with impact commitments gain amplified governance weight, aligning decision-making with mission.

Specification

1. Staking Tiers

Green Staking operates in three tiers based on conservation commitment:

TierNameImpact CommitmentReward MultiplierLock Period
0StandardNone1.0x7 days minimum
1Green10% of rewards to conservation1.15x30 days minimum
2Deep Green25% of rewards to conservation1.40x90 days minimum
3Guardian50% of rewards to conservation1.75x180 days minimum

Reward multipliers are funded by a dedicated conservation staking rewards pool allocated from ZOO token inflation (see section 5).

2. Core Contracts

2.1 GreenStaking

// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.20;

contract GreenStaking {
    enum Tier { Standard, Green, DeepGreen, Guardian }

    struct Stake {
        uint256 amount;
        Tier    tier;
        uint256 stakedAt;
        uint256 lockUntil;
        address conservationProject;  // Chosen project for impact commitment
        uint256 impactScore;          // Cumulative verified impact
        uint256 rewardsClaimed;
        uint256 conservationContributed;
    }

    IERC20  public immutable zoo;          // ZOO token
    address public immutable rewardsPool;   // Conservation staking rewards
    address public governance;

    mapping(address => Stake) public stakes;
    uint256 public totalStaked;
    uint256 public totalConservationFunded;

    // Tier configuration
    mapping(Tier => uint16) public impactCommitmentBps;  // % to conservation
    mapping(Tier => uint16) public rewardMultiplierBps;   // Reward boost
    mapping(Tier => uint256) public lockDays;

    event Staked(address indexed user, uint256 amount, Tier tier, address project);
    event Unstaked(address indexed user, uint256 amount);
    event RewardsClaimed(address indexed user, uint256 userShare, uint256 conservationShare);
    event ImpactVerified(address indexed user, uint256 score, bytes32 attestationHash);

    constructor(address zoo_, address rewardsPool_, address governance_) {
        zoo = IERC20(zoo_);
        rewardsPool = rewardsPool_;
        governance = governance_;

        // Initialize tier parameters
        impactCommitmentBps[Tier.Standard]  = 0;
        impactCommitmentBps[Tier.Green]     = 1000;  // 10%
        impactCommitmentBps[Tier.DeepGreen] = 2500;  // 25%
        impactCommitmentBps[Tier.Guardian]  = 5000;  // 50%

        rewardMultiplierBps[Tier.Standard]  = 10000; // 1.0x
        rewardMultiplierBps[Tier.Green]     = 11500; // 1.15x
        rewardMultiplierBps[Tier.DeepGreen] = 14000; // 1.40x
        rewardMultiplierBps[Tier.Guardian]  = 17500; // 1.75x

        lockDays[Tier.Standard]  = 7;
        lockDays[Tier.Green]     = 30;
        lockDays[Tier.DeepGreen] = 90;
        lockDays[Tier.Guardian]  = 180;
    }

    function stake(uint256 amount, Tier tier, address project) external {
        require(amount > 0, "ZERO_AMOUNT");
        require(stakes[msg.sender].amount == 0, "ALREADY_STAKED");
        if (tier != Tier.Standard) {
            require(project != address(0), "PROJECT_REQUIRED");
        }

        zoo.transferFrom(msg.sender, address(this), amount);

        stakes[msg.sender] = Stake({
            amount: amount,
            tier: tier,
            stakedAt: block.timestamp,
            lockUntil: block.timestamp + (lockDays[tier] * 1 days),
            conservationProject: project,
            impactScore: 0,
            rewardsClaimed: 0,
            conservationContributed: 0
        });

        totalStaked += amount;
        emit Staked(msg.sender, amount, tier, project);
    }

    function claimRewards() external {
        Stake storage s = stakes[msg.sender];
        require(s.amount > 0, "NO_STAKE");

        uint256 baseReward = _calculateBaseReward(msg.sender);
        uint256 boostedReward = (baseReward * rewardMultiplierBps[s.tier]) / 10_000;

        uint256 conservationShare = (boostedReward * impactCommitmentBps[s.tier]) / 10_000;
        uint256 userShare = boostedReward - conservationShare;

        // Transfer rewards
        IERC20(zoo).transferFrom(rewardsPool, msg.sender, userShare);
        if (conservationShare > 0) {
            IERC20(zoo).transferFrom(rewardsPool, s.conservationProject, conservationShare);
            s.conservationContributed += conservationShare;
            totalConservationFunded += conservationShare;
        }

        s.rewardsClaimed += userShare;
        emit RewardsClaimed(msg.sender, userShare, conservationShare);
    }

    function unstake() external {
        Stake storage s = stakes[msg.sender];
        require(s.amount > 0, "NO_STAKE");
        require(block.timestamp >= s.lockUntil, "STILL_LOCKED");

        uint256 amount = s.amount;
        totalStaked -= amount;
        delete stakes[msg.sender];

        zoo.transfer(msg.sender, amount);
        emit Unstaked(msg.sender, amount);
    }

    function _calculateBaseReward(address user) internal view returns (uint256) {
        Stake storage s = stakes[user];
        uint256 elapsed = block.timestamp - s.stakedAt;
        // Annual rate: 8% base APR
        // reward = (amount * rate * elapsed) / (365 days * 10000)
        return (s.amount * 800 * elapsed) / (365 days * 10_000);
    }
}

2.2 ImpactVerifier

Decentralized verification of conservation outcomes.

contract ImpactVerifier {
    struct Verification {
        address staker;
        address project;
        uint256 impactScore;       // Normalized 0-10000
        bytes32 evidenceHash;      // IPFS CID of evidence
        uint256 timestamp;
        address[] verifiers;       // Addresses that attested
        bool     finalized;
    }

    uint256 public constant QUORUM = 3;          // Minimum verifiers
    uint256 public constant VERIFICATION_WINDOW = 7 days;

    mapping(uint256 => Verification) public verifications;
    mapping(address => bool) public registeredVerifiers;
    uint256 public nextVerificationId;

    event VerificationSubmitted(uint256 indexed id, address project, bytes32 evidenceHash);
    event VerificationAttested(uint256 indexed id, address verifier);
    event VerificationFinalized(uint256 indexed id, uint256 impactScore);

    function submitVerification(
        address staker,
        address project,
        uint256 impactScore,
        bytes32 evidenceHash
    ) external returns (uint256 id) {
        require(registeredVerifiers[msg.sender], "NOT_VERIFIER");
        require(impactScore <= 10000, "SCORE_OVERFLOW");

        id = nextVerificationId++;
        verifications[id] = Verification({
            staker: staker,
            project: project,
            impactScore: impactScore,
            evidenceHash: evidenceHash,
            timestamp: block.timestamp,
            verifiers: new address[](0),
            finalized: false
        });

        verifications[id].verifiers.push(msg.sender);
        emit VerificationSubmitted(id, project, evidenceHash);
    }

    function attest(uint256 id) external {
        require(registeredVerifiers[msg.sender], "NOT_VERIFIER");
        Verification storage v = verifications[id];
        require(!v.finalized, "ALREADY_FINAL");
        require(block.timestamp <= v.timestamp + VERIFICATION_WINDOW, "WINDOW_CLOSED");

        v.verifiers.push(msg.sender);
        emit VerificationAttested(id, msg.sender);

        if (v.verifiers.length >= QUORUM) {
            v.finalized = true;
            // Update staker impact score in GreenStaking
            emit VerificationFinalized(id, v.impactScore);
        }
    }
}

3. Proof of Impact (PoI) Model

The PoI model connects on-chain staking rewards to off-chain conservation outcomes:

Field Partner          Impact Verifier Network       GreenStaking Contract
──────────────        ─────────────────────         ─────────────────────
1. Execute project    2. Review evidence             5. Update impact score
   (anti-poaching,    3. Submit verification         6. Adjust reward tier
    habitat restore)   4. Reach quorum (3/5)         7. Emit attestation
         │                      │                            │
         └──── Evidence ────────┘                            │
              (photos, GPS,                                  │
               sensor data,                                  │
               satellite imagery)                            │
                                                             │
         ┌──── Impact Attestation (soulbound) ───────────────┘
         │
    Staker receives on-chain proof of conservation contribution

4. Verifier Network

Impact verifiers are conservation organizations, field researchers, and satellite data providers authorized by ZooGovernor:

Verifier TypeExamplesVerification Method
Field partnerWWF, WCS, local NGOsGround-truth photographic evidence
Remote sensingPlanet Labs, SentinelSatellite imagery analysis
Sensor networkSMART, AudioMothAcoustic/camera trap data
AcademicUniversity researchersPeer-reviewed methodology

Verifiers stake ZOO tokens as collateral. Fraudulent attestations result in slashing.

5. Token Economics

5.1 Rewards Pool Funding

The Green Staking rewards pool is funded by:

SourceAllocationNotes
ZOO inflation2% annualDedicated staking emission schedule
Protocol fees15% of Zoo DEX feesLP-9000 fee routing
Conservation bond yieldOverflowWhen ZIP-101 bonds exceed target

5.2 Reward Distribution

Annual Rewards Pool
       │
       ├── 60% → Standard staking rewards (all tiers)
       ├── 25% → Green bonus pool (multiplier funding)
       └── 15% → Verifier incentives

5.3 veZOO Integration

Long-term stakers at Green tier or above may lock their staked ZOO into veZOO (vote-escrowed ZOO) for amplified governance power:

Lock DurationveZOO MultiplierGovernance Weight
6 months1.0xBase
1 year1.5x1.5x voting power
2 years2.0x2.0x voting power
4 years4.0x4.0x voting power

veZOO follows the Curve ve-token model with linear decay.

6. Governance Parameters

ParameterDefaultRangeGovernor
Base APR800 bps (8%)200-2000 bpsZooGovernor
Tier multipliersSee section 110000-20000 bpsZooGovernor
Verifier quorum32-7ZooGovernor
Verifier stake minimum10,000 ZOO1,000-100,000ZooGovernor
Slashing rate10%5-50%ZooGovernor

Rationale

Why tiered staking? A single impact commitment level would either be too high (discouraging participation) or too low (negligible impact). Tiers let stakers self-select based on their conservation commitment and risk tolerance for longer lock periods.

Why reward multipliers instead of separate yield? Multipliers are simpler to reason about and avoid the complexity of dual-token reward streams. A 1.75x multiplier at Guardian tier means the total economic return can exceed Standard tier even after the 50% conservation split -- the conservation contribution is funded by the bonus pool, not by reducing the staker's effective yield.

Why decentralized verification? Centralized impact reporting creates a single point of failure and trust assumption. A quorum-based verifier network distributes trust across multiple independent parties, similar to oracle networks but specialized for conservation data.

Why not integrate with Lux primary network staking directly? Zoo is an L2 (ZIP-15) and does not control primary network validator economics. Green Staking operates at the application layer within Zoo's own contracts.

Security Considerations

Sybil Attacks on Verifiers

  • Verifiers must be governance-approved and stake ZOO collateral. Creating fake verifier identities requires real capital at risk.

Impact Score Manipulation

  • A colluding set of verifiers could attest false impact scores. Mitigation: quorum requirement, verifier diversity requirement (at least 2 distinct verifier types per verification), and slashing for provably false attestations.

Lock Period Bypass

  • Stakers cannot unstake before lock expiry. No emergency withdraw for staked principal. This is by design -- conservation commitment must be credible. Stakers should only commit capital they can lock.

Reward Pool Exhaustion

  • If staking demand exceeds reward pool capacity, APR decreases naturally. The governor can adjust emission rates. The pool is replenished from protocol fees and inflation.

Economic Attack

  • A whale could stake at Guardian tier to earn 1.75x rewards and immediately sell. Mitigation: 180-day lock at Guardian tier and vesting schedule on bonus rewards.

References

  1. ZIP-0: Zoo Ecosystem Architecture
  2. ZIP-15: Zoo L2 Chain Architecture
  3. ZIP-100: Zoo Contract Registry
  4. ZIP-101: Conservation Bond Protocol
  5. ZIP-500: ESG Principles
  6. ZIP-501: Conservation Impact Measurement
  7. LP-9000: DEX Specifications
  8. LP-9018: Liquidity Mining
  9. HIP-0008: Hamiltonian Market Maker
  10. Curve Finance, "Vote-Escrowed CRV," 2020

Copyright

Copyright and related rights waived via CC0.