Title: Integrate a Fixed-Rate Layer into Moonwell, Powered by Kairos
Author(s):
Vincent DePalma, Co-founder and CTO
Thomas Harrison, Co-founder and CEO
Kairos Labs
Related Discussions: N/A
Submission Date: October 2, 2026
Disclosure: the authors are co-founders of Kairos Labs, Inc., which builds and earns fees from Kairos.
Summary
Kairos is an EVM-based interest rate swap protocol that allows users to swap fixed and floating interest rate payments based on any underlying rate. This allows borrowers and lenders to convert variable borrow rates or yields into fixed rates for specific tenors, without touching the underlying borrow/lend position. Kairos is backed by 6MV, Alliance, and Lattice.
Kairos proposes a fixed-rate layer for core Moonwell markets on Ethereum mainnet, built on Kairos, a permissionless interest rate swap protocol already live on mainnet. Kairos quotes a fixed rate against each Moonwell market’s own supply and borrow rates, so Moonwell users can lock in a borrowing cost, fix their yield, or trade a view on rates while their Moonwell positions stay exactly where they are.
The integration needs no changes to Moonwell’s contracts. We ask the DAO to endorse Kairos as Moonwell’s fixed-rate layer, support surfacing fixed-rate quotes in the Moonwell app, and approve a milestone-based grant of 12M $WELL to incentivize rate swap liquidity on Moonwell markets.
Overview
Every Moonwell market is variable-rate today: supply yield and borrow cost move with utilization, so neither side knows what the next 30 days will cost or earn. Kairos adds a fixed-rate choice on top of those markets without changing them.
What Kairos is. Kairos is a permissionless onchain interest rate swap protocol on Ethereum mainnet, built by Kairos Labs and live in Early Access since late September 2026. Its beta processed more than $300M in notional volume. The design is pooled: liquidity providers deposit into a single SwapCore contract that takes the other side of every swap, so a user gets an instant fixed-rate quote instead of waiting for a bilateral counterparty. Kairos already quotes fixed rates on Aave, with more to come soon.
How a Moonwell rate becomes a fixed-rate market. A read-only adapter samples a Moonwell mToken’s growth index: borrowIndex for the borrow rate, exchangeRateStored for the supply rate. Kairos feeds those samples into its time-weighted average rate (TWAR) oracle and quotes a fixed rate, which includes a risk premium, for each market and tenor. The risk premium model looks at historical data and proprietary metrics to determine the appropriate amount to compensate the pool for any given tenor, deep dive in our risk premium research paper. Tenors from 30-day fixed term to 365 days can be supported. We focus on security and protecting LP pools from rate manipulation as detailed in our oracle security paper.
What users can do. The swap settles the difference between the fixed rate and Moonwell’s realized rate in the collateral token (e.g. USDC). It never touches the user’s Moonwell collateral or health factor; swap margin sits in Kairos’s core contract. Locking in a fixed-rate is completely optional and Moonwell users can choose whether to open a swap at any point.
| User | Moonwell position | Kairos swap | Result |
|---|---|---|---|
| Borrower locking a cost | Borrows USDC at Moonwell’s variable rate | Pays fixed, receives Moonwell USDC borrow rate | Net borrow cost fixed for the tenor |
| Supplier locking a yield | Supplies USDC and earns Moonwell’s variable rate | Receives fixed, pays Moonwell USDC supply rate | Net yield fixed for the tenor |
| Leveraged staker | Loops an ETH LST against a WETH borrow | Pays fixed on Moonwell’s WETH borrow rate | Staking spread locked; no surprise borrow spike |
| Rate trader | None needed | Pays or receives fixed on any Moonwell market | Gains or loses as Moonwell rates move |
The same flows apply to every Moonwell market on Ethereum mainnet as it is listed.
Motivation
Fixed rates let Moonwell borrowers take larger loans and keep them open longer, because a rate spike no longer forces them to close. More borrowing, held longer, means more interest, and Moonwell’s reserve factor sends a share of it to the DAO treasury that $WELL holders govern. For $WELL holders, the trade is more protocol revenue in exchange for a capped grant paid only against delivered milestones.
-
It serves users variable rates leave out. DAO treasuries, funds and institutional borrowers budget against a known cost. Today they either accept rate risk on Moonwell or move to a fixed-term venue. With a fixed-rate layer they stay on Moonwell and hedge alongside their position.
-
It gives Moonwell parity on Ethereum. Moonwell moved governance to Ethereum mainnet on May 21, 2026 and proposed its first mainnet lending markets on May 29. On mainnet it competes with Aave, which Kairos already covers. Without this integration, Moonwell would be the one major mainnet lender with no fixed-rate option.
-
It can grow borrow demand and reserves. Borrowers who hold back size for fear of rate spikes can borrow more once the cost is fixed. More borrowing means more interest, and Moonwell’s reserve factor turns that into protocol revenue.
-
It publishes a forward rate curve for every market. Each Moonwell market gets a market-priced fixed rate that shows where traders expect its rate to go. That is a useful input for risk reviews and for the monthly $WELL incentive rebalances across Ethereum and Base.
-
It adds no risk to Moonwell’s core. Kairos only reads Moonwell’s public index values. Nothing in Moonwell reads from Kairos, so a fault in Kairos cannot directly affect Moonwell prices, collateral or liquidations.
Implementation
This proposal changes no Moonwell smart contracts. Its one treasury action is a $WELL grant released in tranches as milestones are met. Kairos does the build work in three phases, and its only dependency on Moonwell is reading each market’s public interest index.
Kairos makes only view reads of each mToken’s index. Quotes flow back to the Moonwell app in phase 2, and swap margin stays in SwapCore.
Rollout
-
List Moonwell rate markets on Kairos. Kairos deploys one read-only adapter per Moonwell Ethereum market and side (supply, borrow), starting with the largest stablecoin and WETH markets [confirm initial list with Moonwell contributors]. Adapter code is published for review and covered by Kairos’s audit partners before any market opens. Tenors at launch: 30-day fixed, with longer tenors to follow.
-
Show fixed-rate quotes in the Moonwell app. Each market page shows the Kairos fixed rate beside the variable APY, with a “Lock rate” action that opens a swap sized to the user’s Moonwell position. Kairos builds this against Moonwell’s public API and SDK, working with Moonwell’s frontend contributors, who keep final say over the interface.
-
Expand coverage. New Moonwell Ethereum markets are added as governance lists them. Base follows once Kairos deploys there.
What changes
| Area | Change |
|---|---|
| Moonwell smart contracts | None |
| Moonwell oracles and collateral pricing | None |
| Moonwell treasury and $WELL emissions | Grant of 12M $WELL in three milestone tranches (see Grant request) |
| Moonwell app | Fixed-rate quotes and a Lock rate flow (phase 2) |
| Kairos | New adapters and swap markets referencing Moonwell rates (phase 1) |
Grant request
Kairos Labs requests twelve million (12,000,000) $WELL from the Moonwell treasury, released in three tranches as each milestone is met. The grant goes exclusively to liquidity providers, because deep fixed-rate liquidity is what makes quotes useful to Moonwell users.
| Tranche | Amount | Released when | Use |
|---|---|---|---|
| 1 | 4M $WELL | First Moonwell rate markets live on Kairos (phase 1) | LP incentives 2 months |
| 2 | 4M $WELL | Fixed-rate quotes live in the Moonwell app (phase 2) | LP incentives 2 months |
| 3 | 4M $WELL | $2M cumulative notional (30d+ markets), referencing Moonwell rates; or two (2) months after phase 2 | LP incentives 2 months |
-
Recipient: a Kairos Labs multisig:
0xF8d58c9700d52E3a22E993Cd1CFE0D2a4dEAcE54 -
Execution: this vote approves the full amount; each tranche is sent by a short onchain proposal once its milestone is confirmed by the Moonwell Foundation or a named delegate.
-
Reporting: a monthly forum report covering $WELL distributed, LP capital, and swap notional and open interest on Moonwell-referenced markets.
-
Term: Incentives run for six calendar months, starting with the first full calendar month after the first Moonwell-referenced markets go live on KairosSwap. Each tranche funds two months: tranche 1 covers months 1–2, tranche 2 covers months 3–4, and tranche 3 covers months 5–6. Any extension would require a new proposal, informed by the monthly reports.
-
Accountability: Any $WELL that isn’t paid out returns to the Moonwell treasury at the end of the term, and Kairos keeps none of it. That covers $WELL held back by the cap, $WELL from a month where no LP qualified, and any tranche whose milestone isn’t met by 6 months from phase 1 start
Distribution
Grant to fund a $WELL boost for Kairos LPs, paid on top of the LP fees they already earn. The grant is released as 2,000,000 WELL per month (about $27,700 in total, or about $4,616 per month, at $0.002308 per WELL on 10/2/26).
LPs keep all fees from their Kairos pool position. The WELL boost is a separate, additional reward. Each month’s 2,000,000 WELL goes to LPs in Moonwell-referenced Kairos markets who kept a position in the pool for the whole calendar month. It is split pro rata by each LP’s time-weighted average share of the pool. Each LP’s boost is capped at a dollar value of 10% APR on their average LP capital for the month (annual rate ÷ 12). The cap is converted to WELL at the 30-day TWAP ending on the last day of the month. Any $WELL left over because of the cap rolls into the next month / is returned to the Moonwell treasury once the program ends.
Example 1, cap binds ($500,000 of eligible LP capital, WELL TWAP $0.002308):
- Maximum boost: $500,000 × 10% ÷ 12 = $4,167 ≈ 1,805,315 WELL
- Monthly budget: 2,000,000 WELL
- LPs earn their pool fees plus a 10% APR WELL boost. The remaining 194,685 WELL is unspent.
Example 2, budget binds ($1,000,000 of eligible LP capital, same TWAP):
- Maximum boost: $1,000,000 × 10% ÷ 12 = $8,333 ≈ 3,610,630 WELL
- Monthly budget: 2,000,000 WELL (≈ $4,616)
- LPs share the full 2,000,000 WELL pro rata and earn their pool fees plus a ~5.5% APR WELL boost.
At today’s price, the monthly budget pays the full 10% boost on up to about $554,000 of eligible LP capital. If $WELL rises, the per-LP dollar cap limits Moonwell’s spend. If $WELL falls, the same 2,000,000 WELL buys a smaller boost.
Integration and Moonwell dependency
KairosSwap does not change any Moonwell contract, and it never sends Moonwell a transaction. For each listed market it deploys a small read-only adapter. The adapter turns the mToken’s public growth index into the cumulative-index format Kairos uses for every lending market. Kairos already has prepared adapters of the same shape for Aave V3, and others. Moonwell would be the next iteration.
How the pieces fit
Moonwell mToken (unchanged)
│ view calls only
▼
CumulativeIndex{Borrow,Supply}Moonwell ← new adapter, one per mToken/side
│ getCumulativeIndex() → (index in RAY, isValid)
├──► IndexBaseRateV1 existing Kairos TWAR oracle: samples the index into a ring buffer and quotes a trailing average rate
└──► SwapCore settlement existing: settles the floating leg from index growth between two timestamps
IndexBaseRateV1 and settlement work with any protocol and need no changes. Only the adapter is Moonwell-specific.
Moonwell functions used
| Moonwell function | Call type | Used for |
|---|---|---|
borrowIndex() |
view | Borrow-side cumulative index (1e18 scale) |
exchangeRateStored() |
view | Supply-side cumulative index |
accrualBlockTimestamp() |
view | Time since the market last accrued |
borrowRatePerTimestamp() |
view | Projects the borrow index to the current block |
supplyRatePerTimestamp() |
view | Projects the exchange rate to the current block |
Kairos never calls accrueInterest() or any other state-changing Moonwell function. On a quiet market, the adapter brings the index up to date inside the view, using the same step Moonwell applies on its next accrual. Kairos therefore reads the same index whether or not anyone has interacted with the market recently.
Adapter interface (same as Kairos’s Aave adapter)
interface ICumulativeRateOracle {
/// Total growth factor since an arbitrary epoch, normalised to RAY (1e27).
/// isValid = false whenever the source cannot be read; Kairos then pauses quoting
/// for that market rather than pricing off a stale or failed read.
function getCumulativeIndex() external view returns (uint256 cumulativeIndex, bool isValid);
function decimals() external view returns (uint8); // 27
}
Borrow-side adapter (abridged; follows Kairos’s existing CumulativeIndexBorrow Adapters)
interface IMToken {
function borrowIndex() external view returns (uint256); // 1e18 scale
function accrualBlockTimestamp() external view returns (uint256);
function borrowRatePerTimestamp() external view returns (uint256); // 1e18 scale
}
contract CumulativeIndexBorrowMoonwell is AbstractCumulativeIndex {
IMToken public immutable mToken;
uint256 internal constant MANTISSA = 1e18;
uint256 internal constant SCALE_FACTOR = 1e9; // 1e18 -> RAY
constructor(address mToken_, string memory description_) AbstractCumulativeIndex(description_) {
require(mToken_ != address(0), "Invalid mToken");
mToken = IMToken(mToken_);
}
function getCumulativeIndex() external view returns (uint256, bool) {
try mToken.borrowIndex() returns (uint256 index) {
if (index == 0) return (0, false);
uint256 elapsed = block.timestamp - mToken.accrualBlockTimestamp();
if (elapsed > 0) {
// Same step as MToken.accrueInterest():
// borrowIndexNew = borrowIndex + borrowIndex * (borrowRate * elapsed) / 1e18
try mToken.borrowRatePerTimestamp() returns (uint256 rate) {
index += index * rate * elapsed / MANTISSA;
} catch {
return (0, false); // fail closed; never report a stale index as valid
}
}
return (index * SCALE_FACTOR, true);
} catch {
return (0, false);
}
}
function decimals() external pure returns (uint8) { return 27; }
}
The supply-side adapter has the same shape. It reads exchangeRateStored() and steps it forward with supplyRatePerTimestamp(). The exchange rate’s scale depends on the underlying token, so the adapter computes the scaling to RAY once, at deployment.
Safety properties
Read-only. Only view functions are called. Kairos never sends Moonwell state-changing calls, approvals or deposits.
Fails closed. Any revert or zero value reads as isValid = false, and that market’s quotes pause.
Manipulation-resistant. Settlement uses index growth over the whole swap period. Quotes use a trailing time-weighted average from IndexBaseRateV1, not the spot rate.
Rollback guard. If the index ever falls materially below its previous high, IndexBaseRateV1 pauses quoting rather than hiding the drop.
Risk and security
-
One-way dependency. Kairos reads Moonwell; Moonwell never reads Kairos. A Kairos fault cannot directly impact Moonwell contracts or oracles.
-
Manipulation resistance. The TWAR oracle averages index samples over time, so a single-block utilization spike, such as a flash-loan borrow, barely moves the reference rate. Kairos has run flash-loan and manipulation analysis on its TWAR oracles.
-
Quiet markets. Moonwell updates its stored index only when a market accrues interest. On low-activity markets, the adapter projects the index to the current block inside a view call, using the same step Moonwell applies on its next accrual. Kairos never calls
accrueInterest()or any other state-changing Moonwell function. -
Audits. Guardian Audits reviewed both the Kairos beta and launch contracts. Octane Security has also audited the protocol.
-
User risk. A swap fixes the rate, not the collateral. A borrower who hedges on Kairos can still be liquidated on Moonwell if collateral value falls, and swap margin has its own requirements in SwapCore.
Voting
Yay: The Moonwell DAO endorses Kairos as Moonwell’s fixed-rate layer, co-marketed on socials with Kairos. Kairos lists swap markets on Moonwell’s Ethereum supply and borrow rates, and works with Moonwell’s frontend contributors to show fixed-rate quotes and a “Lock rate” flow in the Moonwell app. The DAO also approves a grant of 12M $WELL, released in three tranches against the milestones above. No Moonwell contract changes.
Nay: The DAO does not endorse the integration or approve the grant, and the Moonwell app stays variable-rate only.