The Perpetual Negative Rate Hedge
Users of this product are running borrow loop spreads outside of Cardinal. They have taken on leveraged exposure to the carry rate and want the right to yield when it turns negative.
The Perpetual Negative Rate Hedge is a perpetual right to payouts when carry falls below 0, that is, the cost to borrow a yield-bearing asset exceeds that asset's yield.
The same LPs that back the Carry Perp trade also serve as the counterparty promising that payout. The payout is funded from a buffer the policy accrues while carry is positive (a share of the yield earned by LPs performing the borrow loop) and is capped by that buffer and available pool NAV, where LP yield is market dependent. It is funded by a streaming premium the buyer preloads into a gas tank.
Position Inputs
The buyer specifies:
- notional size matching the size of their external borrow loop spread
- coverage leverage
L, from1xto10x - initial gas tank
Coverage leverage controls how aggressively the position pays out during negative carry periods. A higher L means larger payouts but also a faster-draining buffer during stress.
Fees
The Perpetual Negative Rate Hedge uses a streaming premium.
The buyer preloads a gas tank. The gas tank is not LP pool capital. It only becomes pool value as premium is debited.
Each hour, the premium is the actuarially-fair cost of the coverage held:
gross_premium = expected negative-carry claims × (1 + lp_profit_factor) / 0.90
The premium scales with the coverage leverage L (more protection → more access to
the leveraged loop yield → proportionally more premium) and is charged continuously
while the policy is open, so premium income covers expected claims with a margin
(after 90/10 routing, the LP still has positive expected underwriting margin).
The LP Profit Factor (lp_profit_factor) is defined LP-net: at 0.5, the LP retains 50% above expected
claims after the treasury split. The Expected Claim Rate (expected_claim_rate) sets a calm-window premium floor, expected_claim_rate × L × (1 + lp_profit_factor) / 0.90, keeping the reserve funded through long positive-carry stretches. Because the premium is computed from current expected negative-carry claims, it rises as carry conditions deteriorate rather than holding at a fixed rate. The buyer keeps
paying to keep coverage open; as the funded reserve grows, a buffer shortfall
becomes progressively less likely.
The premium is debited from the gas tank each tick. When the gas tank cannot cover the premium, the position lapses. The buyer can top up at any time.
Debited premium routes 90/10 to LP NAV and treasury.
Launch values:
lp_profit_factor = 0.5
sUSDe expected_claim_rate = 0.249%
wstETH expected_claim_rate = 0.218%
weETH expected_claim_rate = 0.40%
rsETH expected_claim_rate = 0.60%
Payout
The payout side works through a buffer that builds gradually.
Each hour that carry is positive, the position accrues a share of that yield into a buffer. When carry goes negative, the position pays out of that buffer up to a cap.
A 30-day ramp limits payouts in the first month as an anti-gaming measure.
The buffer is also capped by the pool's available NAV. In extreme stress scenarios where the pool itself is under pressure, delivered coverage compresses.
Target payout:
target_payout = abs(gross_carry_t) * notional * L * min(1, hoursOpen / 720) / 8760
Here 720 is the number of hours in a month and 8760 is the number of hours in a year.
Position Struct
struct NRHPolicy {
uint id;
uint notional;
uint L; // x100 for integer math
uint bufferBalance;
uint premiumBalance; // gas tank
uint hoursOpen; // for ramp factor
uint lastSettlement; // timestamp of last hourly settle
PolicyStatus status; // open, closed, lapsed
}
Capacity is tracked with:
uint public totalEntitlementConsumed; // sum of each policy's expected payout
uint lastNRHSettlement;
Methods
openPolicy(notional, L, initial_gas_tank)
Checks that the fraction of LP borrow-loop yield already claimed by existing positions, plus this new one, does not exceed 100%.
Initializes the position with buffer = 0 and premium_balance = initial_gas_tank.
closePolicy(policyId)
Returns unspent gas tank to user. Reverts buffer to LP NAV.
topUp(policyId, amount)
Adds to gas tank. No other state change.
Gas tank value is not included in LP pool capital. It is tracked in its own variable and only shifted to the LP pool balance as blocks elapse and premiums are debited.
adjustCoverage(policyId, new_L)
Decrease applies immediately and frees yield capacity.
Increase checks available yield capacity and applies immediately if available.
settleNRH(gross_carry_t, timestamp, policyIds[]) adminOnly
Called hourly.
For every position:
- debit the cost-covering premium from the gas tank
- route premium 90/10 to LP NAV and treasury
- declare the position lapsed if gas tank cannot cover the calculated premium
- if carry is positive, credit the position's entitled share of that yield into its buffer
- calculate deliverable buffer by clipping the buffer to the position's pro-rata share of available pool NAV
- if carry is negative, move
min(target_payout, deliverable_buffer)toclaimable_tokens - exclude
claimable_tokensfrom NAV - drain position buffer accordingly
- move Cardinal fees to
treasuryAccrued
claim(amount)
User-facing method to claim tokens from The Perpetual Negative Rate Hedge settlement.