Skip to main content

Sable Delta Neutral

The Delta Neutral vault earns yield by capturing the spread between USDC borrow cost and USDC yield.
Risk Level: 4 (Medium-High)
Strategy: Deposit WBTC → Borrow USDC → Supply USDC to Vesu PRIME → Earn spread

Strategy Overview

WBTC (Re7 xBTC Pool)
  ↓ Supply as collateral
Borrow USDC (50% LTV)
  ↓ Deploy to yield
Vesu PRIME USDC Pool

Spread = USDC Supply APY - USDC Borrow APY + BTCFi STRK Rewards

Why “Delta Neutral”?

This strategy is BTC price neutral because:
  • WBTC collateral value = $100
  • USDC debt value = $50 (50% LTV)
  • If BTC ↑2x: collateral = 200,debtstill200, debt still 50 → profit $100
  • If BTC ↓0.5x: collateral = 50,debtstill50, debt still 50 → breakeven (no loss from BTC drop)
The vault earns from the interest rate differential, not BTC price movement.

Yield Sources

SourceTypeNet Impact
Vesu PRIME USDC Supply APYRevenue+5-10%
Re7 xBTC USDC Borrow APYCost-2-5%
BTCFi STRK RewardsRevenue+3-8%
Net SpreadProfit+6-13% APY

Risk Profile

  • Liquidation risk: If BTC drops >50%, USDC debt could exceed collateral value
  • Negative spread risk: If USDC borrow cost > supply yield, vault loses money
  • Oracle risk: Uses Pragma Oracle for BTC/USD price (auto-deploy only)
  • Dual Vesu pool risk: Exposure to both Re7 xBTC and PRIME USDC pools

Contract Architecture

File: delta_neutral.cairo (~800 LOC)
Deployed: 0x06c8779ee7ed14b35ac5c6eae5dc721cc3e8104a65ffef4b5252babc407a1012

Core Components

Delta Neutral manages two separate Vesu positions:
struct Storage {
    // ...
    vesu_singleton: ContractAddress,
    wbtc_pool_id: felt252,     // Re7 xBTC (collateral + debt)
    usdc_pool_id: felt252,     // PRIME USDC (yield)
    debt_asset: ContractAddress, // USDC
    // Strategy state
    wbtc_collateral: u256,
    usdc_debt: u256,
    usdc_deployed: u256,
    pragma_oracle: ContractAddress,
}
WBTC Pool (Re7 xBTC):
  • Collateral: WBTC
  • Debt: USDC
USDC Pool (PRIME):
  • Collateral: USDC
  • Debt: None (pure supply)

Key Functions

User Functions

deposit
function
Deposit WBTC and receive yvBTC-DN sharesParameters:
  • assets (u256): Amount of WBTC to deposit (8 decimals)
  • receiver (ContractAddress): Address to receive vault shares
Returns: u256 — Number of shares minted
Auto-deploys to:
  1. Supply WBTC to Re7 xBTC pool
  2. Query BTC price from Pragma Oracle
  3. Borrow USDC at 50% LTV
  4. Supply USDC to PRIME yield pool
withdraw
function
Burn shares and withdraw WBTCParameters:
  • assets (u256): Amount of WBTC to withdraw
  • receiver (ContractAddress): Address to receive WBTC
  • owner (ContractAddress): Share owner
Returns: u256 — Number of shares burned
Flash Loan Unwind (if USDC debt exists):
  1. Withdraw ALL USDC from PRIME pool
  2. Flash loan USDC to cover gap
  3. Repay USDC debt + withdraw WBTC from Re7
  4. Swap ~5% WBTC → USDC to repay flash loan
  5. Send remaining WBTC to user

Curator Functions

deploy_collateral
function
Supply idle WBTC to Re7 xBTC pool as collateralParameters:
  • amount (u256): WBTC to supply
fn deploy_collateral(ref self: ContractState, amount: u256)
Implementation at delta_neutral.cairo:343
borrow_and_deploy_usdc
function
Borrow USDC against WBTC collateral, then deploy to PRIME poolParameters:
  • borrow_amount (u256): USDC to borrow (6 decimals)
fn borrow_and_deploy_usdc(ref self: ContractState, borrow_amount: u256)
Implementation at delta_neutral.cairo:373
Two-step process:
  1. Borrow USDC from Re7 xBTC pool
  2. Supply USDC to PRIME pool (earns yield)
unwind_usdc
function
Withdraw USDC from PRIME, repay Re7 debtParameters:
  • amount (u256): USDC to unwind (6 decimals)
fn unwind_usdc(ref self: ContractState, amount: u256)
Implementation at delta_neutral.cairo:425
Leaves 2 microUSDC buffer to avoid Vesu rounding errors on repayment.
withdraw_collateral
function
Withdraw WBTC collateral from Re7 poolParameters:
  • amount (u256): WBTC to withdraw (8 decimals)
fn withdraw_collateral(ref self: ContractState, amount: u256)
Implementation at delta_neutral.cairo:492
Can only withdraw if health factor remains safe (debt < 70% of collateral value).
flash_unwind
function
Emergency full unwind via flash loanParameters:
  • wbtc_to_sell (u256): WBTC to swap for USDC repayment
  • min_usdc_out (u256): Minimum USDC from swap (slippage protection)
  • routes (Array<Route>): AVNU swap routes
fn flash_unwind(ref self: ContractState, wbtc_to_sell: u256, min_usdc_out: u256, routes: Array<Route>)
Implementation at delta_neutral.cairo:584

Integration with External Protocols

Vesu Re7 xBTC Pool (Collateral + Debt)

Pool ID: 0x03a8416bf20d036df5b1cf3447630a2e1cb04685f6b0c3a70ed7fb1473548ecf Delta Neutral uses this pool for:
  • Collateral: WBTC
  • Debt: USDC borrowed at 50% LTV
vesu.modify_position(ModifyPositionParams {
    collateral_asset: wbtc_addr,
    debt_asset: usdc_addr,
    user: vault_address,
    collateral: Amount { /* WBTC amount */ },
    debt: Amount { /* USDC amount, positive = borrow */ },
});

Vesu PRIME USDC Pool (Yield)

Pool ID: 0x03976cac265a12609934089004df458ea29c776d77da423c96dc761d09d24124 Delta Neutral supplies all borrowed USDC to this pool to earn yield:
usdc_pool.modify_position(ModifyPositionParams {
    collateral_asset: usdc_addr,
    debt_asset: usdc_pool_debt_asset,  // Valid registered asset (no debt)
    user: vault_address,
    collateral: Amount { /* USDC amount */ },
    debt: Amount { /* zero */ },
});

Pragma Oracle (Auto-Deploy Only)

Address: pragma_oracle (constructor parameter) Delta Neutral uses Pragma to calculate 50% LTV borrow amount:
let pragma = IPragmaOracleDispatcher { contract_address: oracle_addr };
let price_response = pragma.get_data_median(DataType::SpotEntry(0x4254432f555344));
let btc_price: u256 = price_response.price.into();  // 8 decimals

// USDC to borrow = wbtc_sats * btc_price * 50 / 10^12
let usdc_borrow = (amount * btc_price * 50) / 1000000000000;
From delta_neutral.cairo:776
Data Type: SpotEntry(0x4254432f555344) = “BTC/USD” as felt252

AVNU WBTC/USDC Swap (Flash Unwind)

For flash loan repayment, Delta Neutral swaps WBTC → USDC via Ekubo (hardcoded route):
let swap_params: Array<felt252> = array![
    token0, token1,              // WBTC, USDC (sorted by address)
    0x20c49ba5e353f80000000000000000, // fee 0.05%
    0x3e8,                       // tick_spacing 1000
    0x0,                         // extension
    0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, // sqrt_ratio_limit (max)
];
From delta_neutral.cairo:960

Example Usage

Depositing WBTC

import { Contract } from 'starknet'

const deltaNeutralVault = new Contract(deltaNeutralABI, deltaNeutralAddress, account)
const wbtc = new Contract(erc20ABI, wbtcAddress, account)

// Check minimum deposit
const minDeposit = await deltaNeutralVault.min_deposit()
console.log('Min deposit:', minDeposit / 1e8, 'WBTC')

// Deposit (auto-borrows + deploys USDC)
const amount = 10_000_000n // 0.1 WBTC
await wbtc.approve(deltaNeutralAddress, amount)
await deltaNeutralVault.deposit(amount, account.address)

// Check yvBTC-DN balance
const shares = await deltaNeutralVault.balance_of(account.address)

Checking Strategy State

// Strategy info: (wbtc_collateral, usdc_debt, 0, paused)
const [wbtcColl, usdcDebt, _, paused] = await deltaNeutralVault.get_strategy_info()

console.log('WBTC collateral:', wbtcColl / 1e8)
console.log('USDC debt:', usdcDebt / 1e6)

// USDC deployed to PRIME pool
const usdcDeployed = await deltaNeutralVault.get_usdc_deployed()
console.log('USDC in PRIME pool:', usdcDeployed / 1e6)

// Verify 50% LTV
const btcPrice = 95000 // Example: $95k/BTC
const collateralValue = (wbtcColl / 1e8) * btcPrice
const ltv = (usdcDebt / 1e6) / collateralValue
console.log('LTV:', (ltv * 100).toFixed(2) + '%')  // Should be ~50%

Monitoring Yield Spread

// Fetch Vesu pool APYs from API
const vesuAPI = 'https://api.vesu.xyz/pools'
const pools = await fetch(vesuAPI).then(r => r.json())

const re7xBTC = pools.find(p => p.pool_id === '0x03a8416bf20d036df5b1cf3447630a2e1cb04685f6b0c3a70ed7fb1473548ecf')
const primeUSDC = pools.find(p => p.pool_id === '0x03976cac265a12609934089004df458ea29c776d77da423c96dc761d09d24124')

const usdcBorrowAPY = re7xBTC.usdc_borrow_apy  // Cost
const usdcSupplyAPY = primeUSDC.usdc_supply_apy // Revenue
const btcfiRewardsAPY = 5.0 // Example STRK rewards

const netSpread = usdcSupplyAPY - usdcBorrowAPY + btcfiRewardsAPY
console.log('Net yield spread:', netSpread.toFixed(2) + '% APY')

Withdrawing WBTC

// Withdraw all (triggers flash loan unwind)
const maxWithdraw = await deltaNeutralVault.max_withdraw(account.address)
await deltaNeutralVault.withdraw(maxWithdraw, account.address, account.address)

// Flash loan process:
// 1. Withdraw ALL USDC from PRIME pool (~$50 if started with 0.1 WBTC)
// 2. Flash loan $0.50 USDC to cover rounding gap
// 3. Repay $50 USDC debt to Re7 + withdraw 0.1 WBTC collateral
// 4. Swap 0.001 WBTC -> $0.95 USDC (enough to repay flash loan)
// 5. User receives ~0.099 WBTC

Security Considerations

Risks

  1. Liquidation Risk: If BTC drops >50% suddenly, USDC debt could exceed 70% of collateral value
  2. Negative Spread Risk: If USDC borrow APY > supply APY, vault loses money until spread recovers
  3. Oracle Risk: Pragma Oracle failure could cause incorrect borrow amounts on auto-deploy
  4. Dual Pool Risk: Exposure to both Re7 xBTC and PRIME USDC smart contract risks
  5. Flash Loan Dependency: Withdrawals require Vesu flash loans to work
  6. USDC Liquidity Risk: Large withdrawals from PRIME pool could face liquidity issues

Risk Mitigation

  • 50% LTV buffer: Leaves 20% margin before 70% liquidation threshold
  • Flash loan safety: Only vault can initiate on_flash_loan callback
  • PRIME pool liquidity: Largest USDC pool on Vesu (~$50M TVL)
  • Rounding buffer: Leaves 2 microUSDC on repayments to avoid reverts
  • Pause mechanism: Owner can halt deposits if spread turns negative
  • Proportional share burn: On partial unwinds, users only lose proportional shares (not full balance)

Health Factor Monitoring

// Monitor liquidation risk
const vesuPool = new Contract(vesuPoolABI, re7xBTCPoolAddress, provider)
const [position, collValue, debtValue] = await vesuPool.position(
  wbtcAddress,        // collateral_asset
  usdcAddress,        // debt_asset
  deltaNeutralAddress // user (vault)
)

// Health factor = (collateral * LT) / debt
// LT (liquidation threshold) ≈ 70% for Re7 xBTC USDC debt
const healthFactor = (collValue * 70n) / (debtValue * 100n)
console.log('Health factor:', Number(healthFactor) / 100)

// Safe: health > 1.4
// Caution: health 1.0-1.4
// Danger: health < 1.0 (liquidation imminent)

Additional Resources

Build docs developers (and LLMs) love