Files
smom-dbis-138/contracts/vault/libraries/MonetaryFormulas.sol
defiQUG 50ab378da9 feat: Implement Universal Cross-Chain Asset Hub - All phases complete
PRODUCTION-GRADE IMPLEMENTATION - All 7 Phases Done

This is a complete, production-ready implementation of an infinitely
extensible cross-chain asset hub that will never box you in architecturally.

## Implementation Summary

### Phase 1: Foundation 
- UniversalAssetRegistry: 10+ asset types with governance
- Asset Type Handlers: ERC20, GRU, ISO4217W, Security, Commodity
- GovernanceController: Hybrid timelock (1-7 days)
- TokenlistGovernanceSync: Auto-sync tokenlist.json

### Phase 2: Bridge Infrastructure 
- UniversalCCIPBridge: Main bridge (258 lines)
- GRUCCIPBridge: GRU layer conversions
- ISO4217WCCIPBridge: eMoney/CBDC compliance
- SecurityCCIPBridge: Accredited investor checks
- CommodityCCIPBridge: Certificate validation
- BridgeOrchestrator: Asset-type routing

### Phase 3: Liquidity Integration 
- LiquidityManager: Multi-provider orchestration
- DODOPMMProvider: DODO PMM wrapper
- PoolManager: Auto-pool creation

### Phase 4: Extensibility 
- PluginRegistry: Pluggable components
- ProxyFactory: UUPS/Beacon proxy deployment
- ConfigurationRegistry: Zero hardcoded addresses
- BridgeModuleRegistry: Pre/post hooks

### Phase 5: Vault Integration 
- VaultBridgeAdapter: Vault-bridge interface
- BridgeVaultExtension: Operation tracking

### Phase 6: Testing & Security 
- Integration tests: Full flows
- Security tests: Access control, reentrancy
- Fuzzing tests: Edge cases
- Audit preparation: AUDIT_SCOPE.md

### Phase 7: Documentation & Deployment 
- System architecture documentation
- Developer guides (adding new assets)
- Deployment scripts (5 phases)
- Deployment checklist

## Extensibility (Never Box In)

7 mechanisms to prevent architectural lock-in:
1. Plugin Architecture - Add asset types without core changes
2. Upgradeable Contracts - UUPS proxies
3. Registry-Based Config - No hardcoded addresses
4. Modular Bridges - Asset-specific contracts
5. Composable Compliance - Stackable modules
6. Multi-Source Liquidity - Pluggable providers
7. Event-Driven - Loose coupling

## Statistics

- Contracts: 30+ created (~5,000+ LOC)
- Asset Types: 10+ supported (infinitely extensible)
- Tests: 5+ files (integration, security, fuzzing)
- Documentation: 8+ files (architecture, guides, security)
- Deployment Scripts: 5 files
- Extensibility Mechanisms: 7

## Result

A future-proof system supporting:
- ANY asset type (tokens, GRU, eMoney, CBDCs, securities, commodities, RWAs)
- ANY chain (EVM + future non-EVM via CCIP)
- WITH governance (hybrid risk-based approval)
- WITH liquidity (PMM integrated)
- WITH compliance (built-in modules)
- WITHOUT architectural limitations

Add carbon credits, real estate, tokenized bonds, insurance products,
or any future asset class via plugins. No redesign ever needed.

Status: Ready for Testing → Audit → Production
2026-01-24 07:01:37 -08:00

88 lines
3.8 KiB
Solidity
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title MonetaryFormulas
* @notice Implementation of mandatory monetary formulas
* @dev All formulas MUST be applied exactly as specified without modification
*
* Formulas:
* - Money Supply: M = C + D and M = MB × m
* - Money Velocity: V = PQ / M
* - Money Multiplier: m = 1 / r and m = (1 + c) / (r + c)
*/
library MonetaryFormulas {
/**
* @notice Calculate money supply: M = C + D
* @dev M = Money Supply, C = Currency, D = Deposits
* @param currency Currency component (C)
* @param deposits Deposits component (D)
* @return moneySupply Money supply (M)
*/
function calculateMoneySupply(uint256 currency, uint256 deposits) internal pure returns (uint256 moneySupply) {
return currency + deposits;
}
/**
* @notice Calculate money supply: M = MB × m
* @dev M = Money Supply, MB = Monetary Base, m = Money Multiplier
* @param monetaryBase Monetary base (MB)
* @param moneyMultiplier Money multiplier (m)
* @return moneySupply Money supply (M)
*/
function calculateMoneySupplyFromMultiplier(uint256 monetaryBase, uint256 moneyMultiplier) internal pure returns (uint256 moneySupply) {
return (monetaryBase * moneyMultiplier) / 1e18; // Assuming multiplier in 18 decimals
}
/**
* @notice Calculate money velocity: V = PQ / M
* @dev V = Velocity, P = Price Level, Q = Quantity of Goods, M = Money Supply
* @param priceLevel Price level (P)
* @param quantityOfGoods Quantity of goods (Q)
* @param moneySupply Money supply (M)
* @return velocity Money velocity (V)
*/
function calculateMoneyVelocity(uint256 priceLevel, uint256 quantityOfGoods, uint256 moneySupply) internal pure returns (uint256 velocity) {
if (moneySupply == 0) {
return 0;
}
return (priceLevel * quantityOfGoods) / moneySupply;
}
/**
* @notice Calculate simple money multiplier: m = 1 / r
* @dev m = Money Multiplier, r = Reserve Ratio
* @param reserveRatio Reserve ratio (r) in basis points (e.g., 1000 = 10%)
* @return moneyMultiplier Money multiplier (m) in 18 decimals
*/
function calculateSimpleMoneyMultiplier(uint256 reserveRatio) internal pure returns (uint256 moneyMultiplier) {
require(reserveRatio > 0, "MonetaryFormulas: reserve ratio must be positive");
require(reserveRatio <= 10000, "MonetaryFormulas: reserve ratio cannot exceed 100%");
// m = 1 / r, where r is in basis points
// Convert to 18 decimals: m = (1e18 * 10000) / reserveRatio
return (1e18 * 10000) / reserveRatio;
}
/**
* @notice Calculate money multiplier with currency ratio: m = (1 + c) / (r + c)
* @dev m = Money Multiplier, r = Reserve Ratio, c = Currency Ratio
* @param reserveRatio Reserve ratio (r) in basis points
* @param currencyRatio Currency ratio (c) in basis points
* @return moneyMultiplier Money multiplier (m) in 18 decimals
*/
function calculateMoneyMultiplierWithCurrency(uint256 reserveRatio, uint256 currencyRatio) internal pure returns (uint256 moneyMultiplier) {
require(reserveRatio > 0, "MonetaryFormulas: reserve ratio must be positive");
require(reserveRatio <= 10000, "MonetaryFormulas: reserve ratio cannot exceed 100%");
require(currencyRatio <= 10000, "MonetaryFormulas: currency ratio cannot exceed 100%");
// m = (1 + c) / (r + c), where r and c are in basis points
// Convert to 18 decimals: m = (1e18 * (10000 + currencyRatio)) / (reserveRatio + currencyRatio)
uint256 numerator = 1e18 * (10000 + currencyRatio);
uint256 denominator = reserveRatio + currencyRatio;
require(denominator > 0, "MonetaryFormulas: invalid denominator");
return numerator / denominator;
}
}