Component: Boost Management System
Severity: High (Fundamental Metric Corruption)
Executive Summary
The protocol's boost management system fails to track the base supply metric during user boost operations. This results in corrupted pool accounting where only boosted ("virtual") supplies are recorded, while the actual underlying asset amounts remain untracked. This defect fundamentally undermines the protocol's ability to assess real pool liquidity and properly calculate critical financial metrics.
Technical Analysis
1. Vulnerability Details
Affected Function: updateUserBoost(address user, address pool)
Error Type: Omission of State Update
Impacted Metric: PoolBoostData.baseSupply
Risk Category: Accounting Integrity Failure
2. Code Demonstration
Current Implementation (Flawed)
function updateUserBoost(address user, address pool) external {
PoolBoostData storage poolData = poolBoosts[pool];
poolData.totalBoost += newBoost;
poolData.workingSupply += newBoost;
}
Test Case Evidence
function testBaseSupplyTrackingFails() public {
(, , uint256 initialBaseSupply, ) = boostController.getPoolBoost(pool);
assertEq(initialBaseSupply, 0, "Initial base supply should be 0");
vm.prank(user1);
boostController.updateUserBoost(user1, pool);
(, , uint256 finalBaseSupply, ) = boostController.getPoolBoost(pool);
assertGt(finalBaseSupply, 0, "Base supply remains untracked");
}
3. Observed Behavior
4. Impact Analysis
Direct Consequences:
Fee calculations based on inflated boosted supplies
Reward distributions disproportionate to real assets
Incorrect liquidity risk assessments
Systemic Risks:
graph TD
A[Missing Base Tracking] --> B[Distorted TVL Metrics]
A --> C[Inaccurate APR Calculations]
A --> D[Faulty Risk Modeling]
B --> E[User Mistrust]
C --> F[Economic Imbalances]
D --> G[Protocol Insolvency Risk]
Recommended Fix
Code Implementation
function updateUserBoost(address user, address pool) external {
PoolBoostData storage poolData = poolBoosts[pool];
poolData.totalBoost += newBoost;
poolData.workingSupply += newBoost;
uint256 userBase = IERC20(poolToken).balanceOf(user);
poolData.baseSupply += userBase;
emit BaseSupplyUpdated(pool, poolData.baseSupply);
}
Verification Logic
function testBaseSupplyTrackingSuccess() public {
uint256 initialBalance = poolToken.balanceOf(user1);
vm.prank(user1);
boostController.updateUserBoost(user1, pool);
(, , uint256 finalBaseSupply, ) = boostController.getPoolBoost(pool);
assertEq(
finalBaseSupply,
initialBalance,
"Base supply should match actual user balance"
);
}
Conclusion
This vulnerability represents a critical failure in fundamental accounting mechanisms. The lack of base supply tracking creates systemic inaccuracies that propagate through all financial subsystems of the protocol. Immediate remediation is required before protocol deployment to prevent permanent metric corruption.
Recommendation Priority: Critical (Requires Emergency Fix)