Core Contracts & Architecture
Ocean Finance implements a sophisticated modular architecture with clear separation of concerns, comprehensive access control, and cross-chain functionality. The protocol is built around OCUSD, a yield-bearing stablecoin backed by diversified strategies.
Architecture Overview
Core Contract Components
OCUSD Token
Contract: OCUSD.sol
Purpose: Main yield-bearing stablecoin with cross-chain capabilities
Key Features:
ERC20 with permit functionality for gasless transactions
LayerZero OFT (Omnichain Fungible Token) for seamless cross-chain transfers
Minting restricted to MintingManager for regular operations
Special mint function for YieldDistributor rewards
Burning restricted to MintingManager
Technical Details:
contract OCUSD is ERC20Permit, OFT {
function mint(address to, uint256 amount) external onlyMintingManager
function mintRewards(address to, uint256 amount) external onlyYieldDistributor
function burn(address from, uint256 amount) external onlyMintingManager
}
StakedOCUSD
Contract: StakedOCUSD.sol
Purpose: ERC4626 vault for staking OCUSD and earning yield
Key Features:
ERC4626 compliant with 18 decimal precision
Configurable cooldown period (0-90 days) for withdrawals
Linear yield vesting over 24 hours to prevent manipulation
OCUSDSilo integration for cooldown asset storage
4 decimal offset for enhanced share precision
Cooldown Mechanism:
function cooldownAssets(uint256 assets) external returns (uint256 shares)
function cooldownShares(uint256 shares) external returns (uint256 assets)
function unstake(address receiver) external returns (uint256 assets)
Yield Distribution:
function receiveRewards(uint256 amount) external onlyYieldDistributor {
// 24-hour linear vesting prevents yield manipulation
_startVesting(amount);
}
MintingManager
Contract: MintingManager.sol
Purpose: Manages OCUSD minting and redemption against collateral
Key Features:
Multi-asset collateral support with administrative controls
Whitelisted minter system for access control
Asynchronous redemption request system
Permit-based transactions for improved UX
Oracle integration for accurate pricing
Emergency pause functionality
Minting Flow:
function mint(
address asset,
uint256 amount,
address receiver
) external whenNotPaused onlyValidMinter returns (uint256 ocusdAmount) {
// Transfer collateral → Get oracle price → Mint OCUSD
}
Redemption System:
struct RedeemRequest {
address requester;
address asset;
uint256 ocusdAmount;
uint256 requestTime;
bool fulfilled;
}
function requestRedeem(address asset, uint256 ocusdAmount) external
function fulfillRedeemRequest(uint256 requestId) external onlyServiceRole
StrategyAllocator
Contract: StrategyAllocator.sol
Purpose: Central hub for managing protocol assets and strategy operations
Key Features:
Receives collateral from MintingManager
Manages approvals to strategy handlers
Executes batched operations on handlers
Administrative withdrawal capabilities
Whitelisted assets and handlers for security
Operation Execution:
function execute(
address[] calldata targets,
bytes[] calldata data
) external onlyServiceRole {
// Batch execute operations on strategy handlers
}
YieldDistributor
Contract: YieldDistributor.sol
Purpose: Distributes protocol earnings to stakeholders
Key Features:
Configurable fee splitting (protocol, reserve, stakers)
Direct OCUSD minting for rewards (no collateral backing required)
Basis point fee configuration
Emergency rescue functions
Distribution Logic:
function transferRewards(uint256 totalAmount) external onlyServiceRole {
// Mint OCUSD for total rewards
// Calculate and distribute fees
// Send remaining to StakedOCUSD
}
AddressProvider
Contract: AddressProvider.sol
Purpose: UUPS upgradeable central registry for protocol addresses
Key Features:
Single source of truth for all protocol addresses
UUPS upgrade pattern for future improvements
Comprehensive getters for all protocol components
Batch address setting for efficiency
Strategy Handler Architecture
The protocol uses a standardized modular handler system built on the BaseHandler abstract contract:
BaseHandler (Abstract Contract)
Contract: BaseHandler.sol
Purpose: Standardized interface and common functionality for all strategy handlers
Core Features:
Unified access control via
onlyStrategyAllocator
modifierStandardized asset management through
receiveAsset
andclaimAsset
Centralized address resolution via
AddressProvider
Common input validation modifiers
Consistent event patterns
abstract contract BaseHandler is IBaseHandler {
IAddressProvider public addressProvider;
modifier onlyStrategyAllocator() {
require(msg.sender == addressProvider.strategyAllocator(), "Not strategy allocator");
_;
}
function receiveAsset(address asset_, uint256 amount_) external virtual;
function claimAsset(address to_, address asset_, uint256 amount_) external virtual;
}
EthenaHandler
Contract: EthenaHandler.sol
(inherits BaseHandler) Integration: Ethena Protocol (USDe/sUSDe) Operations: Staking, cooldown management, unstaking Key Functions: stakeUSDe()
, cooldownAssets()
, unstakeUSDe()
SkyHandler
Contract: SkyHandler.sol
(inherits BaseHandler) Integration: Sky Protocol (USDS/sUSDS) Operations: Staking, PSM swapping, unstaking Key Functions: stakeUsds()
, swapUsdcToUsds()
, withdrawUsds()
NestHandler
Contract: NestHandler.sol
(inherits BaseHandler) Integration: Nest Vaults Operations: Vault deposits, atomic withdrawals Key Functions: deposit()
, withdraw()
via Teller/AtomicQueue
Oracle System
OceanOracle
Contract: OceanOracle.sol
Purpose: Reliable price feeds with comprehensive validation
Features:
Multi-oracle support (Chainlink, Pyth)
Stablecoin deviation monitoring (configurable threshold)
Price staleness checking with per-token timeouts
WAD-normalized pricing (18 decimals)
Safety Mechanisms:
function getTokenPrice(address token) external view returns (uint256) {
// Validate oracle response
// Check price staleness
// Monitor stablecoin deviation
// Return WAD-normalized price
}
Access Control System
DefaultAdminAccessControl
Contract: DefaultAdminAccessControl.sol
Purpose: Centralized role-based access control
Role Hierarchy:
DEFAULT_ADMIN_ROLE
: Ultimate administrative controlSERVICE_ROLE
: Operational functions (strategy execution, redemption fulfillment)
Security Features:
Cooldown periods for admin role changes
Centralized role checking through AddressProvider
Emergency functions with appropriate restrictions
Technical Specifications
Precision and Decimals
OCUSD: 18 decimals (standard ERC20)
StakedOCUSD: 18 decimals with 4 decimal offset for shares
Oracle Prices: WAD normalized (18 decimals)
Fee Calculations: Basis points (10000 = 100%)
Cross-Chain Functionality
LayerZero Integration: Seamless cross-chain OCUSD transfers
Unified Liquidity: Maintains consistent token supply across chains
Message Passing: Secure cross-chain communication
Upgradeability
AddressProvider: UUPS upgradeable for protocol evolution
Core Contracts: Immutable for security and trust
Handler System: Pluggable for new strategy integrations
Security Features
Reentrancy Protection: ReentrancyGuard on all external functions
Oracle Validation: Multiple layers of price feed verification
Access Control: Comprehensive role-based permissions
Emergency Controls: Pause mechanisms and rescue functions
Cooldown Systems: Time-based security for critical operations
This modular architecture ensures scalability, security, and flexibility while maintaining clear separation of concerns and comprehensive access controls throughout the protocol.
Last updated