COMP Token: Distribution and Governance
Distribution Plan
Compound rewards users with COMP tokens for every deposit or borrow action, incentivizing platform participation and governance voting.
Daily COMP distribution totals approximately 2,312 tokens across various markets:
| Market | COMP Per Day |
|---|---|
| DAI | 880.38 |
| Ether | 141.25 |
| USDC | 880.38 |
| USDT | 126.80 |
Key features:
- 50/50 Split: Half of each market's COMP goes to borrowers (allocated proportionally by debt share), half to depositors
- Governance Utility: Holders use COMP to vote on protocol upgrades and parameter changes
Technical Implementation
The ComptrollerV6Storage contract tracks COMP distribution rates per block:
contract ComptrollerV6Storage {
mapping(address => uint) public compBorrowSpeeds; // COMP per block for borrowing
mapping(address => uint) public compSupplySpeeds; // COMP per block for supplying
}Example calculation for cUSDC:
- Supply speed = 67,000,000,000,000,000 wei/block (1 COMP = 10¹⁸ wei)
- Daily output: (2 × speed × 86,400 blocks/day) ÷ 15 ≈ 880.38 COMP
Mining Mechanics
Supply Mining
Triggered during deposit operations via mintAllowed():
Index Update:
function updateCompSupplyIndex(address cToken) internal { uint compAccrued = blocksElapsed × supplySpeed; Double memory ratio = compAccrued / totalSupply; supplyState.index += ratio; }Calculates COMP per cToken accrued since last update
Distribution:
function distributeSupplierComp(address cToken, address supplier) internal { uint deltaIndex = currentIndex - supplierIndex; uint accruedCOMP = supplierTokens × deltaIndex; compAccrued[supplier] += accruedCOMP; }Credits users proportionally to their cToken holdings
Borrow Mining
Follows similar logic but tracks debt shares instead of deposits.
Inflation Analysis
COMP exhibits ~27.5% annual inflation:
| Category | 2021-11-05 | 2022-11-04 | Change |
|---|---|---|---|
| User Rewards | 1,473,555 | 2,527,335 | +71.48% |
| Team Allocation | 866,200 | 1,421,300 | +64.08% |
| Total | 5,883,859 | 7,492,379 | +27.34% |
👉 Explore COMP tokenomics in depth
Price Oracle Architecture
Compound employs a hybrid oracle system combining:
- Uniswap v2 TWAPs - Provides on-chain price anchors
- Chainlink v2 - Delivers off-chain price feeds
Validation Mechanism
Chainlink prices must stay within 15% of Uniswap prices:
function validate(int256 currentAnswer) external returns (bool) {
uint chainlinkPrice = convertReportedPrice(config, currentAnswer);
uint uniswapPrice = calculateAnchorPriceFromEthPrice(config);
if (failoverActive) {
// Use Uniswap price during emergencies
prices[symbolHash] = uniswapPrice;
} else if (isWithinAnchor(chainlinkPrice, uniswapPrice)) {
// Accept Chainlink price if within bounds
prices[symbolHash] = chainlinkPrice;
return true;
}
emit PriceGuarded(symbolHash, chainlinkPrice, uniswapPrice);
}Price Calculation
ETH/USDC Price: Fetched from Uniswap USDC-ETH pool
function fetchEthAnchorPrice() returns (uint) { (uint priceCumulative,) = UniswapV2OracleLibrary.currentCumulativePrices(); return priceCumulative.mul(1e6).div(ethBaseUnit); }- Token/ETH Price: From respective Uniswap pool
- Final Price: ETH/USDC × Token/ETH, converted to 6 decimals
👉 Understand oracle security considerations
FAQ Section
Q: How often are COMP rewards distributed?
A: Rewards accrue every block (~15s) but are claimable at any time during user interactions.
Q: What happens if Chainlink and Uniswap prices diverge?
A: The system defaults to Uniswap prices if Chainlink feeds deviate beyond ±15% threshold.
Q: Can COMP inflation rate change?
A: Yes, through community governance votes that adjust distribution speeds or introduce new markets.
Q: Why use both Chainlink and Uniswap oracles?
A: Chainlink provides tamper-resistant off-chain data, while Uniswap offers fully on-chain verifiability - together they enhance security.
Q: How are oracle prices protected from manipulation?
A: TWAP mechanisms require sustained price changes over time, making short-term attacks economically impractical.