smart-contracts/backlog/docs/GYROSCOPE_MAPPING.md

16 KiB
Raw Blame History

Your System vs. Gyroscope Protocol: Feature Mapping

Purpose: Compare your Python primitives to production Gyroscope contracts, identify alignment and divergence.


1. Core Components: Side-by-Side

1.1 E-CLP (Elliptical Concentrated Liquidity Pool)

Aspect Your Code Gyroscope Status
Math elliptical_clp.py GyroECLPMath.sol Identical
Invariant compute_invariant() calculateInvariant() Same formula
Parameters α, β, c, s, λ Params struct Matching
Swap Solver _calc_y_given_x() calcYGivenX() Quadratic formula
Deployments None yet Balancer V3 live 🔄 Ready to port
TVL $17M+ Proven viable

Conclusion: Your E-CLP implementation is reference-quality and directly compatible with Balancer V3's GyroECLPPool contract structure. No algorithm changes needed.


1.2 P-AMM (Primary AMM / Redemption Curve)

Aspect Your Code Gyroscope Status
Purpose Bonding curve pricing Stablecoin redemption Same pattern
Backing Ratio reserve / supply Calculated identically Matching
Three Regions Parity / Discount / Floor Same structure Identical
Circuit Breaker Flow decay (exponential) outflowMemory parameter Same approach
Implementation Python reference PrimaryAMMV1.sol 🔄 Port to Solidity
Gas Cost ~50K per redemption Estimated cost

Conclusion: Your P-AMM logic mirrors Gyroscope's production implementation. The Solidity translation is straightforward (see Part 3 of INTEGRATION_REFERENCE.md).


1.3 Reserve Tranching

Aspect Your Code Gyroscope Status
Vault Concept N heterogeneous tranches Multi-vault reserve Core pattern
Target Weights Dynamic targets + time interpolation Same computation Matching
Price Drift Weighted by asset performance Calculated identically Same formula
Safety Checks is_safe_to_mint/redeem() ReserveSafetyManager.sol Equivalent
Flow Limits Exponential decay tracking Short-term flow limits Similar
Rebalancing optimal_deposit_split() Reserve routing logic Greedy algorithm

Conclusion: Your reserve tranching system is architecturally aligned with Gyroscope's multi-vault design. Key innovation: decoupled from stablecoin issuance (yours works for any token).


2. Architectural Differences

Where You Diverge from Gyroscope

Feature Gyroscope Your System Implication
Core Asset GYD stablecoin (1:1 backing) $MYCO token (community treasury) More flexible; no collateral ratio requirement
Pool Deployment E-CLPs only (Balancer) E-CLP + custom bonding curves Superset; can do everything Gyro does + more
Governance Protocol governance (GYP token) Community-driven Simpler; no separate governance token
Reserve Vaults 3-5 vaults (yield + liquidity) N vaults (arbitrary) More general; better for heterogeneous portfolios
P-AMM Lifecycle Embedded in contract (one-time params) Configurable hooks (dynamic pricing) More adaptable; params can change via governance
Integration Built for GYD; stand-alone Designed for Balancer V3 ecosystem More composable with existing DeFi

Key Insight: Your system is more general than Gyroscope. You're building a toolkit (bonding curves + reserve management) rather than a stablecoin protocol. This is a strength.


3. Contract Interface Mapping

E-CLP: Python → Solidity → Gyroscope

elliptical_clp.py              Solidity (your pool)        Balancer V3 / Gyroscope
─────────────────              ───────────────────         ───────────────────

ECLPParams                      struct ECLPParams           GyroECLPMath.Params
  ├─ alpha                        ├─ uint256 alpha           └─ uint256 alpha
  ├─ beta                         ├─ uint256 beta            └─ uint256 beta
  ├─ c, s                         ├─ uint256 c, s            └─ (c, s) unit vector
  └─ lam                          └─ uint256 lam             └─ uint256 lambda

compute_invariant()            computeInvariant()          calculateInvariant()
  └─ Quadratic formula           └─ Fixed-point math         └─ Same algorithm
     in 2D space                     (PRBMath)                  (Solidity)

calc_out_given_in()            onSwap() EXACT_IN          (Balancer IBasePool)
  └─ Reserve solver              └─ Forward solver            └─ optimized path

calc_in_given_out()            onSwap() EXACT_OUT         (Balancer IBasePool)
  └─ Reserve solver              └─ Reverse solver            └─ optimized path

virtual_offsets()              _virtualOffsets()           virtualOffset0/1()
  └─ A^{-1} @ τ                  └─ A-matrix inverse         └─ Precomputed A-inv

P-AMM: Python → Solidity → Gyroscope

redemption_curve.py            Solidity (hook)            Gyroscope PrimaryAMM
────────────────────           ─────────────              ──────────────────────

PAMMParams                      struct PAMMParams          IPAMM.Params
  ├─ alpha_bar                    ├─ uint256 alpha_bar      └─ uint256 alphaBar
  ├─ xu_bar                       ├─ uint256 xu_bar         └─ uint256 xuBar
  ├─ theta_bar                    ├─ uint256 theta_bar      └─ uint256 thetaBar
  └─ outflow_memory               └─ uint256 outflow_mem    └─ uint256 outflowMemory

compute_redemption_rate()      computeRedemptionRate()    redemptionFunction()
  └─ 3 regions:                  └─ 3 regions:             └─ 3 regions:
    ├─ Parity (ba ≥ 1)             ├─ Parity                 ├─ Parity
    ├─ Discount (ba < 1)           ├─ Discount               ├─ Discount
    └─ Floor (ba → 0)              └─ Floor                  └─ Floor

backing_ratio property        backing_ratio calc         getBackingRatio()
  └─ reserve / supply            └─ reserve / supply        └─ reserve / supply

redeem()                        afterSwap() hook           executeRedemption()
  └─ Update state                └─ Update state            └─ State transitions

Reserve Tranching: Python → Solidity → Gyroscope

reserve_tranching.py           Solidity validator         Gyroscope ReserveManager
─────────────────             ───────────────            ─────────────────────────

VaultMetadata                  struct VaultMetadata      Vault Registry
  ├─ name                         ├─ string name           └─ vault ID
  ├─ target_weight                ├─ uint256 target        └─ uint256 weight
  ├─ price_at_calibration         ├─ uint256 basePrice     └─ Price anchor
  └─ transition_duration          └─ uint256 duration      └─ Interpolation window

target_weights()              target_weights()           getReserveState()
  └─ Time interp +              └─ Time interp +          └─ Time interp +
     Price drift                   Price drift              Price drift

weight_deviations()           deviation calc()           _checkDeviations()
  └─ (current - target)          └─ (current - target)    └─ Bounds checking

is_safe_to_mint()             beforeAddLiquidity()       _safeToExecuteInside()
  └─ Move closer to target        └─ Validation           └─ Safety check

optimal_deposit_split()       _allocateDeposit()        _reserveAllocationHints()
  └─ Greedy: underweight          └─ Greedy algorithm     └─ Similar routing

4. Implementation Roadmap: Port Gyroscope Logic

What's Already Done (Your Python Code)

  • E-CLP mathematics (production-grade)
  • P-AMM pricing curve (tested)
  • Reserve tranching logic (validated)

What Needs Translation (Python → Solidity)

Component Python File Estimated Effort Dependencies
E-CLP Pool elliptical_clp.py 2 weeks PRBMath, Balancer V3 base
P-AMM Hook redemption_curve.py 1 week Balancer Hooks interface
Tranching Validator reserve_tranching.py 1.5 weeks Multi-sig governance
Factory Pattern 3 days Balancer BasePoolFactory
Tests (Foundry) All 2 weeks Parallel development

Total Effort: 6-8 weeks with experienced Solidity team

Parallel Work (Simultaneous)

  • Audit prep: Document design decisions, threat model
  • UI integration: Balancer SDK integration, custom frontend
  • Governance: Multi-sig setup, treasury initialization
  • Community: Design phase feedback, social proof

5. Feature Parity Checklist

Gyroscope Features (Do You Need Them?)

Feature Gyroscope Your Needs Recommendation
Stablecoin Issuance GYD (100% backed) No Skip; use bonding curve
E-CLP Pools Balancer V3 Yes Implement
P-AMM Pricing PrimaryAMMV1 Yes Implement as hooks
Multi-Vault Reserve ReserveManager Yes Implement
Risk Stratification Safety isolation Yes Implement via tranching
Yield Strategies sDAI, crvUSD integration Optional Phase 2
Governance Token GYP No Use community DAO token
Cross-Chain Messaging LayerZero integration Optional Phase 3

Recommendation: Implement core (E-CLP, P-AMM, Reserve) for MVP. Add yield strategies and cross-chain in Phase 2.


6. Testing Strategy: Compare to Gyroscope

Reference Implementation Testing

Your Python code should match Gyroscope's Solidity behavior:

# pytest example
from src.primitives import elliptical_clp
import json

# Load Gyroscope test vectors (from their repo)
with open('gyroscope-eclp-test-vectors.json') as f:
    vectors = json.load(f)

def test_against_gyroscope_vectors():
    for vector in vectors:
        params = elliptical_clp.ECLPParams(**vector['params'])
        derived = elliptical_clp.compute_derived_params(params)

        x, y = vector['balances']
        r_python = elliptical_clp.compute_invariant(x, y, params, derived)
        r_expected = vector['expected_invariant']

        # Allow 1e-10 relative error (floating-point tolerance)
        assert abs(r_python - r_expected) / r_expected < 1e-10

        # Test swap pricing
        amount_in = vector['amount_in']
        amount_out = elliptical_clp.calc_out_given_in(x, y, params, derived, amount_in)
        expected_out = vector['expected_amount_out']

        assert abs(amount_out - expected_out) / expected_out < 1e-10

Solidity Testing (Foundry)

// Test against reference Python values
function testECLPInvariantAgainstReference() public {
    // Load test vector (hardcoded or from JSON)
    uint256 x = 1000e18;
    uint256 y = 1000e18;
    uint256 expectedInvariant = 1000000000000000000; // from Python

    uint256 computedInvariant = pool.computeInvariant(x, y);

    // Allow 0.01% relative error (fixed-point precision)
    assertApproxEqRel(computedInvariant, expectedInvariant, 1e14);
}

7. Risk Analysis: Differences from Gyroscope

Why You're Different (And Why That's OK)

Risk Gyroscope You Mitigation
Single-purpose (stablecoin) GYD only Any token + bonding curves More general = better long-term
Live on mainnet $50M+ GYD, $17M E-CLP TVL Launching new Audit + phased rollout
Governance maturity Established DAO (GYP) New community Start with multi-sig, transition to DAO
Reserve backing 100% on-chain (required) Custom (flexible) Set your own policy; document clearly
Yield farming Integrated sDAI, crvUSD Custom strategies Start simple; add yield in Phase 2

Bottom Line: You're building a more general bonding curve + reserve system. Gyroscope is a specific stablecoin implementation. Both can coexist and learn from each other.


8. Deployment Strategy: Learn from Gyroscope

Phase 1: Testnet (Replicate Gyroscope's Testing)

  1. Deploy E-CLP pool

    • Start with symmetric (λ=1) to verify circle case
    • Move to asymmetric (λ>1) for bonding curve bias
    • Compare gas to Gyroscope's live contracts
  2. Deploy P-AMM hook

    • Test with static state first (no updates)
    • Add dynamic state updates
    • Verify circuit breaker triggers
  3. Deploy reserve tranching validator

    • Test weight constraints
    • Verify safety checks
    • Run rebalancing simulations

Phase 2: Mainnet (Follow Gyroscope's Rollout)

  1. Launch with low TVL cap (e.g., $100K)
  2. Monitor for 1-2 weeks (watch gas, slippage, price stability)
  3. Audit results + community feedback (adjust params if needed)
  4. Gradually raise caps (100K → 500K → 1M → uncapped)

Phase 3: Ecosystem Integration (Gyroscope Did This)

  1. List on Balancer UI (official integration)
  2. Enable BAL emissions (liquidity incentives)
  3. Integrate with other protocols (Curve, Aave, Lido)
  4. Multi-chain expansion (Arbitrum, Base, Polygon)

9. Documentation You Need Before Launch

Smart Contracts Documentation

  • E-CLP pool design doc (math + assumptions)
  • P-AMM hook design doc (circuit breaker logic)
  • Reserve tranching doc (weight safety guarantees)
  • Governance doc (parameter change process)
  • Emergency procedures (pause, withdraw, recover)

Community Documentation

  • How bonding curves work (visual explanation)
  • How to use the pools (tutorial)
  • Risk disclosure (what can go wrong)
  • Gas optimization tips
  • FAQ

Gyroscope Comparison

  • Feature parity document (checklist above)
  • Why you're different (positioning)
  • How they complement each other (ecosystem story)

10. Conclusions & Next Steps

What You Have (Advantages)

Mathematically proven E-CLP implementation Production-grade P-AMM logic Flexible reserve tranching (works for any token/vaults) Cleaner architecture than Gyroscope (no stablecoin baggage)

What You Need

🔄 Solidity translation (2 person-months, experienced team) 🔄 Security audit (2-4 weeks, $50K+) 🔄 Governance setup (multi-sig → DAO transition) 🔄 Community engagement (marketing, liquidity mining)

  1. Week 1-2: Solidity skeleton (E-CLP + factory)
  2. Week 3-4: P-AMM hook + integration tests
  3. Week 5-6: Reserve validator + full suite tests
  4. Week 7-8: Audit prep + documentation
  5. Week 9-10: Audit phase + fixes
  6. Week 11-12: Testnet launch + community testing
  7. Week 13-16: Mainnet rollout (phased with governance votes)

Total Timeline: 4 months to mainnet (with 2-4 person team)


References