# Cork Phoenix Cork is a programmable risk layer for on-chain assets such as vault tokens, yield-bearing stablecoins, and liquid (re)staking tokens. ## Table of Contents - [Glossary](#glossary) - [Architecture](#architecture) - [Smart Contracts](#smart-contracts) - [Deployment Addresses](#deployment-addresses) - [Setup](#setup) - [Testing](#testing) - [Standards & Frameworks](#standards--frameworks) - [Audits](#audits) - [Security](#security) - [License](#license) - [Resources](#resources) - [Inspirations & Sources](#inspirations--sources) - [Useful Links](#useful-links) ## Glossary - CA = Collateral Asset, - REF = Reference Asset, - cPT = Cork Principal Token, - cST = Cork Swap Token ## Architecture Cork Phoenix uses a singleton-style architecture where all pool states are managed by [`CorkPoolManager.sol`](./contracts/core/CorkPoolManager.sol). This design enables efficient and secure state management of the system and providing a single source of truth for all Cork Phoenix markets. ### Core Operations Cork Phoenix provides a comprehensive set of operations for managing positions throughout their lifecycle. All operations are available in [`CorkPoolManager.sol`](./contracts/core/CorkPoolManager.sol). #### Before Expiry | Operation | Description | Input Tokens | Output Tokens | Pool Assets | |-----------|-------------|--------------|---------------|-------------| | **Deposit / Mint** | Enter a liquidity position to the protocol to receive a swap token. | CA | cPT + cST | CA ↑ | | **UnwindDeposit / UnwindMint** | Exit a liquidity position, before expiry, to recoup the deposited collateral. | cPT + cST | CA | CA ↓ | | **Swap / Exercise** | Exercise your coverage to get collateral. | REF + cST | CA - Fee | CA ↓ REF ↑ cST ↑ | | **UnwindSwap / UnwindExercise** | Purchase previously exercised swap tokens back from the protocol by providing collateral asset. | CA + Fee | REF + cST | CA ↑ REF ↓ cST ↓ | #### After Expiry | Operation | Description | Input Tokens | Output Tokens | Pool Assets | |-----------|-------------|--------------|---------------|-------------| | **Withdraw / Redeem** | Exit a liquidity position, after expiry, to recoup the deposited collateral. | cPT | CA + REF | CA ↓, REF ↓ | ### Dual Share System Each pool issues _two_ shares upon deposit: **cPT (Cork Principal Token) and cST (Cork Swap Token)**. This enables users to hold or trade principal and swap exposures separately. ### System Components ```mermaid --- config: layout: fixed --- flowchart TB %% ===================== %% Governance Layer %% ===================== subgraph GOV["Governance Layer"] DCC["DefaultCorkController"] end %% ===================== %% Access / Policy Layer %% ===================== subgraph ACCESS["Access Control Layer"] WM["WhitelistManager"] end %% ===================== %% Core Layer %% ===================== subgraph CORE["Core Layer"] CPM["CorkPoolManager
(singleton)"] SF["SharesFactory"] CRA["ConstraintRateAdapter"] PST["PoolShare Tokens
(cPT, cST)"] ORA["Oracle"] end %% ===================== %% Periphery Layer %% ===================== subgraph PERI["Periphery Layer"] CA["CorkAdapter"] end %% ===================== %% User (explicitly last) %% ===================== USER(["User"]) %% ===================== %% Governance Relations %% ===================== DCC -- "controls" --> CPM DCC -- "controls" --> WM %% ===================== %% Whitelisting Relations %% ===================== WM -- "provides whitelisting to" --> CPM WM -- "provides whitelisting to" --> CA %% ===================== %% Core Relations %% ===================== CPM -- "uses" --> SF CPM -- "uses" --> CRA SF -- "deploys" --> PST CRA -- "fetches rates from" --> ORA %% ===================== %% Periphery Relations %% ===================== CPM -- "exposes pools to" --> CA USER -- "interacts with" --> CA %% ===================== %% Styling %% ===================== classDef critical fill:#ffeebb,stroke:#e29100,color:#000,stroke-width:2px classDef normal fill:#eef,stroke:#999,color:#000 class DCC,CPM,CA critical class WM,SF,CRA,PST,ORA normal ``` ### Periphery It's important to note that while you can interact with `CorkPoolManager` directly, it does not provide slippage and deadline protection out of the box. If slippage is a concern, consider using our periphery adapter ([`CorkAdapter.sol`](./contracts/periphery/CorkAdapter.sol)). This contract is inspired by the Morpho [`GeneralAdapter1`](https://github.com/morpho-org/bundler3/blob/main/src/adapters/GeneralAdapter1.sol) contract. You can use the adapter with the [`bundler3`](https://github.com/morpho-org/bundler3/blob/main/README.md) contract similar to how you would normally use the Morpho adapter with multicall, but tailored specifically to Cork's adapter. ## Smart Contracts ### Core Contracts | Contract | Role | Key Responsibilities | |----------|------|---------------------| | **CorkPoolManager** | Singleton pool management | Pool creation, deposits/mints, withdrawals/redemptions, swaps/exercise, and their unwind operations | | **DefaultCorkController** | Protocol governance & administration | Pool authorization, fee management, pause controls, whitelist access management, treasury operations | | **WhitelistManager** | Access control management | Global and market-specific whitelisting mechanism | | **ConstraintRateAdapter** | Rate protection & oracle safety | Rate clamping with configurable constraints, protection against oracle manipulation and extreme volatility | | **PoolShare** | Token implementation | ERC20 tokens (cPT & cST) with EIP-2612 permit support, burnable functionality, and ERC4626 compatibility | | **SharesFactory** | Token deployment | Deploys cPT and cST token pairs per market with consistent configuration | | **CorkPoolManagerStorage** | State management | Defines protocol state structures and storage layout | ### Periphery Contracts | Contract | Role | Key Features | |----------|------|--------------| | **CorkAdapter** | Bundler3 integration with user protection | Safe operations with slippage protection, deadline checks, minimum output enforcement, and whitelist validation. Provides protected versions of all core operations (mint, deposit, withdraw, swap, exercise, redeem, and unwinds). | | **WrapperRateConsumer** | Rate oracle wrapper | Wraps MorphoChainlinkOracleV2 to provide normalized exchange rates between base and quote tokens with decimal adjustment | ### Interfaces All interfaces are located in [this folder](contracts/interfaces/) ## Deployment Addresses Cork Protocol uses the [Safe CREATE2 Deployer](https://github.com/safe-global/safe-singleton-factory) to ensure consistent contract addresses across all chains. ### Deployed on following networks - Ethereum Mainnet (chain ID: 1) ### Protocol Contracts All core Cork contracts share the same addresses across all deployed chains: | Contract | Address | |----------|---------| | CorkPoolManager | [`0xccCCcCcCCccCfAE2Ee43F0E727A8c2969d74B9eC`](https://www.blockscout.com/search?q=0xccCCcCcCCccCfAE2Ee43F0E727A8c2969d74B9eC&tab=addresses) | | CorkAdapter | [`0xCCcCcCCCcccCBaD6F772a511B337d9CCc9570407`](https://www.blockscout.com/search?q=0xCCcCcCCCcccCBaD6F772a511B337d9CCc9570407&tab=addresses) | | DefaultCorkController | [`0xcCcCcCccCccbC06627F8aad7aAF13fe3a457f779`](https://www.blockscout.com/search?q=0xcCcCcCccCccbC06627F8aad7aAF13fe3a457f779&tab=addresses) | | WhitelistManager | [`0xcCccCcCccCC6e38a2772Eb42D2f408eeB89cb0eE`](https://www.blockscout.com/search?q=0xcCccCcCccCC6e38a2772Eb42D2f408eeB89cb0eE&tab=addresses) | | ConstraintRateAdapter | [`0xCCcCcCcccCccEF378949D1a61ED2283C831AF03A`](https://www.blockscout.com/search?q=0xCCcCcCcccCccEF378949D1a61ED2283C831AF03A&tab=addresses) | | SharesFactory | [`0xcCCCccCCCcCc1782617fe14A386AC910a20D4324`](https://www.blockscout.com/search?q=0xcCCCccCCCcCc1782617fe14A386AC910a20D4324&tab=addresses) | | CorkPoolManager implementation | [`0x1cCccCccCcCf9A60Fe57cd7CEf504d1DaaA78244`](https://www.blockscout.com/search?q=0x1cCccCccCcCf9A60Fe57cd7CEf504d1DaaA78244&tab=addresses) | | ConstraintRateAdapter implementation | [`0x1CcCCccCCcca9Cc3446B235af1C4cb8E2B01236E`](https://www.blockscout.com/search?q=0x1CcCCccCCcca9Cc3446B235af1C4cb8E2B01236E&tab=addresses) | | WhitelistManager implementation | [`0x1CcCccccCcCbf45E2516caeE86cef63da120CDAD`](https://www.blockscout.com/search?q=0x1CcCccccCcCbf45E2516caeE86cef63da120CDAD&tab=addresses) | | Timelock Upgrade | [`0x7CcCCCccCcc0b4c00d01f321035b8e4523eF8448`](https://www.blockscout.com/search?q=0x7CcCCCccCcc0b4c00d01f321035b8e4523eF8448&tab=addresses) | | Timelock Admin | [`0x7CccCCccccCCe566CdAFFA9EF2CB245Ad5575c3b`](https://www.blockscout.com/search?q=0x7CccCCccccCCe566CdAFFA9EF2CB245Ad5575c3b&tab=addresses) | | Timelock Operational | [`0x7CcCcCCcCccCC1d856F2994A66fAa7011F1A89D9`](https://www.blockscout.com/search?q=0x7CcCcCCcCccCC1d856F2994A66fAa7011F1A89D9&tab=addresses) | ### External Dependencies | Contract | Address | |----------|:-------:| | Permit2 | [`0x000000000022D473030F116dDEE9F6B43aC78BA3`](https://www.blockscout.com/search?q=0x000000000022D473030F116dDEE9F6B43aC78BA3) | | Morpho Bundler3 | See [Morpho Addresses](https://docs.morpho.org/get-started/resources/addresses/#bundlers) | > **Note**: For Sepolia testnet, Bundler3 is deployed at `0xd43EB38E260bF2d6c9B3222559842686B1C303C0` For deployment parameters and configuration, see [config/prod.toml](config/prod.toml). For WrapperRateConsumer oracle deployments, see[config/markets/README.md](config/markets/README.md). ## Setup For detailed setup, build, and test instructions, see [DEVELOPMENT.md](DEVELOPMENT.md). ## Testing Cork Phoenix employs a comprehensive multi-layered testing approach to ensure protocol security and correctness. ### Test Structure ``` test/forge/ ├── unit/ # Isolated tests for libraries and individual contracts ├── integration/ # End-to-end workflow tests across multiple contracts ├── smoke/ # Tests contract functions against on-chain data ├── helpers/ # Test helper contracts └── mocks/ # Mock contracts for testing ``` - **Unit Tests**: Isolated testing of libraries and individual contract functions - **Integration Tests**: End-to-end workflows testing interactions between multiple contracts - **Fuzz Tests**: Property-based testing using Foundry's fuzzing engine for edge cases, decimals, and rounding - **Smoke Tests**: Contract function validation against on-chain data ## Standards & Frameworks ### OpenZeppelin Contracts Cork Phoenix builds on OpenZeppelin's battle-tested security standards to ensure robust access control, upgradeability, and protection against common attack vectors. We implement **ERC-7201** namespaced storage layout for future-proof upgradeable contracts and use the UUPS proxy pattern for gas-efficient upgrades while maintaining security through role-based access control. ### ERC4626 Tokenized Vault Standard While Cork implements ERC4626-compatible interfaces for familiarity, we extend beyond the standard with a **dual token system** (cPT + cST) that separates principal protection from swap exposure. This architectural choice enables users to independently hold or trade their cPT and cST tokens, a key differentiator from traditional single-share vault designs. ### Morpho Bundler3 Cork integrates Morpho's bundler3 framework to enable **atomic multi-operation transactions**. This allows users to compose complex workflows (e.g., deposit + swap + exercise) in a single transaction, significantly improving UX and reducing gas costs. Our `CorkAdapter.sol` extends Morpho's `GeneralAdapter1` with Cork-specific safety checks including slippage protection and deadline enforcement. ### Uniswap Permit2 We leverage Permit2 for **signature-based token approvals**, eliminating the need for separate approval transactions. This reduces friction for users and enables gas-efficient batch operations—critical for a protocol where users frequently interact with multiple tokens (REF, CA, cPT, cST) across different operations. ## Audits All audit reports are stored in the [audits](audits/) folder. ## Security For security policies and vulnerability disclosure see [SECURITY.md](SECURITY.md). ## License See the [LICENSE](LICENSE) file for details. Individual contracts may have specific license specifications. ## Resources Find a complete development guide at [DEVELOPMENT.md](DEVELOPMENT.md) ## Inspirations & Sources **Morpho Bundler3** ([GitHub](https://github.com/morpho-org/bundler3)) - Transaction batching framework for atomic multi-step operations - Source: `GeneralAdapter1.sol` adapted from Morpho's bundler3 - Purpose: Gas optimization and improved UX through operation bundling **Uniswap Permit2** ([GitHub](https://github.com/Uniswap/permit2)) - Signature-based approvals for gas-efficient token transfers - Batch approval capabilities - Integration in periphery adapters **OpenZeppelin Contracts** - Security patterns: AccessControl, Pausable, ReentrancyGuard - Upgradeable proxy infrastructure: UUPS, ERC1967Proxy - Token standards: ERC20, ERC20Permit (EIP-2612) - Libraries: Math, SafeERC20, SafeCast **Chainlink Oracles** - `MinimalAggregatorV3Interface` inspired by Chainlink's AggregatorV3Interface - Price feed integration for external rate data **ERC4626 Tokenized Vault Standard** - Partial compatibility for deposit/withdraw/redeem operations - Deviation: Dual token system instead of single share token - Additional swap/exercise functionality beyond ERC4626 scope ## Useful Links - [Cork Documentation](https://docs.cork.tech/) - [Cork Phoenix Litepaper](https://corkfi.notion.site/cork-litepaper)