Live markets
The Traders Spread

What Compound (COMP) Borrowers Get Wrong About the Rate

Compound's USDC borrow APR is a kinked utilisation curve. The COMP token price and the reward-token stream sit outside the function borrowers actually pay.

Paper-collage of an anonymous adult seen from behind beside a blank key, for a Compound explainer on how the borrow rate is set.
Illustration: The Traders Spread / generated with Grok Imagine

Compound is charging 5.27% APR to borrow USDC on its main Ethereum market while utilisation sits at 90.35%, and the same curve still prices that borrow at 4.00% when utilisation is 90%. The distance between those two prints is 0.35 percentage points of the pool. The borrow slope above the kink is 360 percentage points of simple APR across the stretch from the kink to a fully borrowed market, so those 0.35 points are enough to add 1.27 percentage points to the rate.

COMP, the governance token, was $21.39 at 07:00 UTC on 29 October 2026, with a market capitalisation of $213.9 million on a supply of 10 million tokens, on CoinGecko's compound-governance-token page. That figure is a traded price. The borrow function on the USDC Comet receives utilisation, together with the base, the kink and the two slopes governance has already stored.

Updated 29 October 2026, these figures come from the contracts named in each section.

Push the same parameters down to 20% utilisation and the accounting turns around. Supply APR would be 0.72% and borrow APR would be 2.06%. Borrowers, drawing on only a fifth of the pool, would pay interest equal to about 0.41% of everything supplied, while suppliers would be credited 0.72%. The supply curve would be promising more than the borrow curve collected. The older v2 identity produces the opposite ordering, because it sets the supply rate equal to the borrow rate times utilisation times one minus a reserve factor, so the credit to suppliers stays within what borrowers pay. Compound III stores a second curve, and at 20% utilisation that curve sits above the interest collected.

Key facts

  • On Ethereum cUSDCv3 the borrow APR was 5.274% and the supply APR was 4.371% at 90.35% utilisation, at block 26,296,805 on 29 October 2026, 07:08 UTC. Source: eth_call of getBorrowRate, getSupplyRate and getUtilization on 0xc3d688B66703497DAA19211EEdff47f25384cdc3, 29 October 2026.
  • Both kinks on that market are 90%. Borrow APR is 4.00% at the kink and 40.00% at 100% utilisation. Supply APR is 3.24% at the kink and 35.20% at 100%. Source: getBorrowRate and getSupplyRate on the same contract, 29 October 2026.
  • Present supply was 376.73 million USDC and present borrows were 340.39 million USDC. The reserve residual was 8.50 million USDC against a 20 million target. Source: totalSupply, totalBorrow, getReserves and targetReserves, block 26,296,805, 29 October 2026.
  • Base-tracking supply speed and base-tracking borrow speed both read zero on this implementation, and on the six other Ethereum Comets called in the same pass. Source: baseTrackingSupplySpeed and baseTrackingBorrowSpeed, 29 October 2026.
  • COMP traded at $21.39, with a market capitalisation of $213,853,284, a 24-hour volume of $11,841,396 and a circulating supply of 10 million. Source: CoinGecko compound-governance-token, last updated 29 October 2026, 07:00 UTC.
  • Across every Comet in the v3 summary, supplied base assets came to about $730.0 million and borrowed base assets to about $637.4 million, a supply-weighted utilisation of 87.3%. The Ethereum USDC market was 51.6% of that supplied value. Source: v3-api.compound.xyz market summary, retrieved 29 October 2026.

The print is utilisation, run through stored parameters

A borrower who asks what Compound charges is asking for the output of a function, and the function is public. On Compound III, utilisation is present borrows divided by present supply of the base asset. The interest-rate documentation writes it as total borrows over total supply, scaled by 10^18, and the implementation in CometWithExtendedAssetList.sol uses the interest-accrued present values, so the ratio already includes interest that has built up in the indices.

Below the kink, the per-second borrow rate is a base plus a low slope times utilisation. Above the kink, the contract keeps the base, adds the low slope times the kink, and then adds a high slope times the distance past the kink. The supply rate uses the same shape and its own four numbers. Governance chooses those numbers by upgrading the implementation. The borrower's APR on a given block is what falls out when the current utilisation is dropped in.

The docs turn the per-second rate into a simple APR by dividing by 10^18, multiplying by 31,536,000 seconds and scaling by 100. That constant sits in CometCore as SECONDS_PER_YEAR. On the USDC market the stored borrow base annualises to 1.50%, the low slope to 2.78 percentage points of APR at full utilisation, and the high slope to 360. The supply base is zero, the low slope annualises to 3.60, and the high slope to 319.6. At the 90% kink the borrow APR is therefore 1.50 plus 0.90 times 2.78, which is 4.00%. The supply APR at the same point is 0.90 times 3.60, which is 3.24%.

Compound the per-second rate instead of multiplying it out, and the same borrow speed becomes a 5.42% APY against the 5.27% simple APR, while the supply speed becomes 4.47% against 4.37%. A dashboard on one unit and a forum post on the other are describing one contract rate. The unit the documentation specifies is the simple APR.

Past the kink, the slope changes job

The kink is the utilisation where the steep slope takes over. It is there to make borrowing expensive once the pool is nearly lent out, so that new supply is pulled in and some borrowers repay. On this USDC market the switch is at 90%, and the market is already through it.

From 90% to the block's 90.35%, the extra borrow APR is 0.003539 times the high slope of 360, about 1.27 percentage points, which is the whole gap from the 4.00% kink print to 5.27%. Supply moves with it, from 3.24% to 4.37%, on a high slope of 319.6.

UtilisationSupply APRBorrow APRBorrow interest per 100 supplied
0%0.00%1.50%0.00
20%0.72%2.06%0.41
90% kink3.24%4.00%3.60
90.35% at the block4.37%5.27%4.77
95%19.22%22.00%20.90
100%35.20%40.00%40.00

Supply and borrow columns are the simple APR from getSupplyRate and getBorrowRate. The last column is borrow APR times utilisation, interest paid per 100 supplied. At 20% that is 0.41 against a 0.72 supply APR. At the block it is 4.77 against 4.37, so the gap has changed sign. Source: the same eth_call, 29 October 2026.

Bar comparison of Compound III USDC supply APR and borrow APR at utilisations from 0% to 100%, including the 90% kink and the 90.35% reading on 29 October 2026

On a loan of 100,000 USDC, the block's 5.27% simple APR accrues about 5,274 USDC over a year if utilisation and the parameters stay put, against 4,000 at the 4.00% kink rate. The 22.00% and 40.00% rows are the same function further up the curve. Someone who treats 5.27% as a term rate is reading a speed as a coupon.

Interest accrues every second from the block timestamp. When someone next touches the market, accrueInternal advances the supply index by the supply rate times the seconds since lastAccrualTime, and the borrow index by the borrow rate times those same seconds, so a quiet afternoon still counts on the next interaction. The APR quoted at 07:08 UTC was the speed at that block, written as a year.

Supply has its own parameters

The myth with the longest life is that suppliers simply receive what borrowers pay, after a reserve haircut. That is close to how Compound v2 is written. In JumpRateModel.sol the supply rate per block equals utilisation times the borrow rate times one minus the reserve factor, and utilisation is borrows divided by cash plus borrows minus reserves. One borrow curve, then a mechanical split, with the reserve factor as an input to the supply rate.

Compound III stores the supply side on its own parameters. getSupplyRate takes utilisation and applies supplyPerSecondInterestRateBase, the supply kink and the two supply slopes, while the borrow rate stays inside getBorrowRate. On the USDC Comet the two kinks happen to match, both at 90%, while the slopes differ and the bases differ. A governance upgrade can move one side and leave the other.

The 20% row is the clean test: a supply credit of 0.72 per 100 supplied against borrower interest of 0.41. Under the v2 formula the supply credit stays inside what borrowers pay after the reserve factor. These parameters would put the supply credit on the larger side, which separate curves can do when reserves are a residual rather than a factor inside the rate.

getReserves returns the Comet's USDC balance, minus present supply, plus present borrow. At block 26,296,805 that residual was 8,502,874 USDC, against a targetReserves of 20,000,000. Hold the 29 October balances and APRs still for a year and borrower interest comes to about $17.95 million while supplier interest comes to about $16.47 million, a gap near $1.49 million. At 20% utilisation on these parameters the gap changes sign and the residual shrinks. The minimum new borrow is 100 USDC. Reward tracking becomes eligible at 1,000,000 USDC of base principal, and this market is far past that line.

The reward index can sit at zero while interest runs

COMP distribution is the other number people fold into the rate. Interfaces used to show a net APR that mixed interest with a governance-token distribution. This implementation keeps the two ledgers apart.

Inside accrueInternal, after the supply and borrow indices move, the code may advance trackingSupplyIndex and trackingBorrowIndex from baseTrackingSupplySpeed and baseTrackingBorrowSpeed, and only once base principal is at least baseMinForRewards. A supplier's tracked reward, written in updateBasePrincipal, is principal times the change in that index. The rewards documentation says the token paid can be any ERC-20.

On the current Ethereum USDC implementation both speeds read zero. The same zero came back from the WETH, USDT, USDS, WBTC and wstETH Comets, and from the second USDC Comet, all on Ethereum, all at the same block. With a speed of zero the tracking index stands still even though supply is far above the 1,000,000 USDC threshold, and the 5.27% from getBorrowRate is the interest curve alone. A claimable balance from an earlier configuration can still sit on an account, while fresh accrual from these speeds is idle.

In April 2023 the @compoundfinance account, posting as Compound Labs, put a utilisation reading next to what it called a net borrow rate, which is the habit in one post. The rate there is a snapshot from that week, useful here because a net number and a utilisation number were published as one fact.

A net figure is a blend, and getBorrowRate returns the interest curve on its own. Three years on, the tracking speeds on the main USDC market read zero, so the block APR is that curve with the reward index idle beside it. COMP's traded price still matters to someone posting the token as collateral, because a price feed values that collateral, while the rate function keeps reading utilisation.

Collateral is a borrowing-power number

The USDC Comet takes collateral other than its own base asset. getAssetInfoByAddress on the block confirmed WETH at a borrow collateral factor of 82.5% with a supply cap of 500,000, WBTC at 80% with a cap of 10,000, COMP at 50% with a cap of 100,000, and Lido's wstETH at 82% with a cap of 75,000. The wstETH address on the market is 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0. Calling the same function with the USDC address reverts.

Interest runs on the base balance. A positive USDC balance earns the supply rate. A negative balance pays the borrow rate. WETH, WBTC, COMP and wstETH sit in the collateral balances and keep whatever yield their own token already carries. For wstETH that yield is the Lido staking rebase, which is a share-rate update on a different contract. The daily mechanics of that rebase are a separate subject, covered in how Lido sets each daily stETH reward rebase. Posting wstETH on Compound to borrow USDC stacks the two, and only one of them is the curve in the table above.

RelatedAerodrome (AERO): myths on fees, bribes, and locks

The collateral factor changes how much USDC a wallet can borrow against a token, and it leaves the borrow function on the same inputs. A wallet at the 82% wstETH factor and a wallet at the 50% COMP factor, borrowing from the same Comet at the same moment, pay the same borrow APR, even though their liquidation prices differ. The rate moves when their borrowing, together with everyone else's, moves utilisation.

Seven Comets, seven rates

Even inside Ethereum, Compound is a set of markets. Calling getUtilization and the two rate functions on each Comet at block 26,296,805 produced seven different prints. Dollar values in the last column come from the v3 market summary, multiplied by that response's base price, retrieved the same morning. Utilisation in the API matched the eth_call to the basis point on every row.

MarketBaseUtilisationSupply APRBorrow APRKinkSupplied, USD
0xc3d6…cdc3USDC90.35%4.37%5.27%90%376.5 million
0x3Afd…0840USDT90.16%3.76%4.58%90%158.7 million
0xa175…ae94WETH79.16%1.58%1.94%90%117.3 million
0x2071…2F8CUSDC82.02%2.95%3.78%90%21.7 million
0x5D40…7b56USDS91.66%8.53%9.96%90%1.74 million
0xe85d…9293WBTC0.00%0.00%1.00%85%1.07 million
0x3D0b…AFE3wstETH1.32%0.03%1.01%90%0.47 million

Two rows are USDC, and they disagree. The large cUSDCv3 is past its kink at a 5.27% borrow APR. The smaller Comet is under its kink, at 82.02% utilisation and 3.78%, on about $21.7 million supplied, so a search for the Compound USDC rate has to name a contract. USDT at 90.16% utilisation charges 4.58%, close to the large USDC market in utilisation and more than half a point away in the borrow APR, which is what separate slopes produce. WBTC's kink is 85% where the others are at 90%, and with zero borrows the supply APR is zero while the borrow APR waits at its 1.00% base. The wstETH row is a different object from wstETH posted as collateral against USDC: there the wrapper is the base asset, and the pool is almost unused.

Present borrows can exceed present supply when the borrow index runs ahead, so utilisation can print above 100%. One Polygon Comet in the same API summary, 0xF252…6445, showed 108.38% utilisation, a 70.17% borrow APR and a zero supply APR, on about $1.24 million supplied at a base price of $0.9997. That deployment has its own parameters.

Other lending protocols are other books. Aave's deposit base has its own utilisation and its own curve, and Morpho's growth on Base is a third set of markets. A rate taken from either one leaves cUSDCv3's getBorrowRate where it was. The input that moves the Compound print is supply and borrow on that Comet.

FAQ

How does Compound turn utilisation into a borrow APR?

The contract divides present borrows by present supply, then passes that ratio into getBorrowRate. Under the kink the per-second rate is the base plus the low slope times utilisation. Past the kink it adds the high slope times the overrun. The documentation converts the per-second result into a simple APR with 31,536,000 seconds in the year. On Ethereum USDC both kinks are 90%, and the borrow base annualises to 1.50%.

Why do the supply APR and the borrow APR diverge?

Each side has its own base, kink and two slopes, and getSupplyRate applies the supply parameters only. On 29 October 2026 the USDC market paid suppliers 4.37% and charged borrowers 5.27% at one utilisation. At 20% on those same parameters the supply APR would be 0.72% while interest collected from borrowers would come to about 0.41% of supply. The curves are free to disagree because reserves are a residual, outside the rate functions.

Where does the COMP price sit in the borrow rate?

COMP at $21.39 is the governance token's traded price, and on the USDC Comet it is also collateral, with a 50% borrow collateral factor and a 100,000 token cap. A price feed values that collateral when the protocol checks borrowing power, while getBorrowRate still receives utilisation alone. Reward-tracking speeds on the seven Ethereum Comets read at this block were zero, so the APR was the interest curve by itself.

What yield does posted collateral earn inside the market?

The supply rate and the borrow rate apply to the base-asset balance, positive or negative, and the collateral tokens stay in their own balances. wstETH on this USDC market carries an 82% borrow collateral factor and a 75,000 token cap, and any staking yield inside it is Lido's rebase, updated on Lido's own accounting. Two wallets borrowing USDC at the same moment pay the same borrow APR whatever collateral they posted.

Can utilisation print above the kink, or above 100%?

The kink is a slope change, and the Ethereum USDC market was already at 90.35%, past its 90% kink, on 29 October 2026. Present borrows over present supply can print above one, and a Polygon Comet in that morning's v3 summary showed 108.38% utilisation with a 70.17% borrow APR and a zero supply APR. Further along the USDC curve itself, the same function returns 22% borrow APR at 95% and 40% at 100%.

If 0.35 points past the kink are already worth 1.27 points of borrow APR on the large USDC market, and a second USDC Comet on the same chain is still at 3.78% under its own kink, which contract is a borrower describing when they ask for the Compound rate?

Rates, reward speeds and the COMP price all move, and a later block can print a different APR from the same stored slopes. The figures here are a reading of public contracts and a public price page on 29 October 2026, and they are information about the mechanism rather than a recommendation to supply, borrow or trade.

This article is analysis and information, not personal investment advice. Markets move; levels and odds above were correct at publication and any prices shown are indicative.

Share

Send this analysis to someone who trades What Compound (COMP) Borrowers Get Wrong About the Rate.

Make us a preferred source

Tell Google you want The Traders Spread higher in Top stories. It sticks to your account.

  1. 1Open Preferred sources on Google.
  2. 2Search The Traders Spread and tick the box.
  3. 3Save — our calls now surface first.
Open on Google

Opens Google in a new tab. Nothing changes here.

Keep reading

Desk