How Seiz3 works
A Morpho loan backed by tokenised NVDA goes past its limit. Instead of dumping the stock, the Seiz3 vault buys it, shorts the same amount on HyperCore so a price move can't hurt it, and sells it back through a Uniswap v4 hook.
1 · LTV and LLTV
LTV (loan-to-value) is where a loan stands now: debt ÷ (collateral × price). It rises when the borrower takes more, when interest accrues, or when the price falls.
LLTV (liquidation LTV) is the market's fixed limit. Once a loan's LTV is past it, anyone can liquidate it: repay some or all of the debt and take the collateral at a discount, the liquidator's bonus.
Liquidation price = debt ÷ (collateral × LLTV). On Morpho you can borrow right up to the LLTV, with no lower borrowing limit as on Aave, so interest alone can tip a full loan over. That's what the Try it page does.
- Collateral
- 10 NVDAx × $168.00 = $1,680.00
- Max borrow at the 77% LLTV
- $1,293.60
- Borrowed
- $1,150.00 → LTV 68.5%
- Liquidatable if NVDA falls to
- $149.35 (−11.1%)
- Bad debt if NVDA falls to
- $123.52 (−26.5%)
Below $123.52 the stock is worth less than the debt plus the liquidator's 7.4% bonus. No liquidator can repay it all, and the lenders take the loss.
| Market | LLTV | Bonus | Bad debt past | Who liquidates |
|---|---|---|---|---|
| Market A naive | 77.0% | 7.4% | 93.1% LTV | Dumps the stock into a thin pool at any price |
| Market B conservative | 38.5% | 15.0% | 87.0% LTV | Low limit: loans rarely get near it |
| Market C seiz3 | 77.0% | 7.4% | 93.1% LTV | The Seiz3 vault: buys the stock and shorts it on HyperCore |
Bonus is Morpho's liquidation incentive, set by the LLTV: min(15%, 1 ÷ (1 − 0.3 × (1 − LLTV)) − 1). A lower LLTV pays a bigger bonus and leaves more room before bad debt.
Bad debt past is the LTV where the collateral no longer covers the debt plus that bonus. The Seiz3 vault also refuses any liquidation with less than a … discount.
2 · Who holds the funds
Holds the seized NVDAx and the USDC. Its stock is never added to the pool as liquidity: it leaves the vault only at the moment it's sold.
Holds no tokens, ever. It moves tokens inside a buyer's swap, and its balance in the PoolManager is back to zero before the swap ends.
Uniswap's singleton. Holds the curve's liquidity (the LP positions PoolSeeder owns). In a sale to a buyer it only passes tokens through.
Someone swaps USDC for NVDAx in the vault's pool. In beforeSwap the hook sells them the vault's stock at HyperCore's price plus a spread, off the curve. Whatever it doesn't fill goes to the curve.
- 1PoolManager→VaultUSDCThe PoolManager fronts the price (v4 flash accounting)
- 2Vault→PoolManagerNVDAxonHookFill: the vault sends the stock it sold
- 3Buyer→PoolManagerUSDCThe buyer pays, which repays step 1
- 4PoolManager→BuyerNVDAxThe buyer receives the stock
- Vault
- −NVDAx, +USDC
- Buyer
- +NVDAx, −USDC
- PoolManager, hook
- unchanged
- Curve liquidity
- not used
- Price
- HyperCore oracle + … open / … closed
- Only when
- the pool trades at or above that ask, so the buyer never pays more than the curve
- Size
- up to … per fill
Now: ask $202.02 · no fill available · market closed
The keeper calls unwindStep(). The vault sells one chunk into the curve, like any other swapper.
- 1Vault→PoolManagerNVDAxJoins the curve's reserves
- 2PoolManager→VaultUSDCPaid out of the LP positions
- Vault
- −NVDAx, +USDC
- Sold NVDAx
- stays in the PoolManager, owned by the LPs
- Hook
- unchanged (it doesn't fill sells)
- Curve liquidity
- used
- Price
- the curve's, … LP fee, price impact capped at …
- Only when
- the pool is within … of HyperCore and the cooldown has passed
- Size
- up to … per step, at least HyperCore value − …
Now: pool $151.20 vs HyperCore $168.00 (-10.00%)
| Sale | Stock before | Stock after | USDC goes to | Curve liquidity |
|---|---|---|---|---|
| → user · hook | Vault | Buyer | Vault | Not used |
| → AMM | Vault | PoolManager (the LPs' reserves) | Vault | Used |
After either sale the vault queues a reduce-only buy on HyperCore (HyperCoreGateway.placeOrder), the relayer places it from the hedge account, and the keeper's syncHedge confirms it. No other sale can happen until then, so the stock goes out one chunk at a time and the short shrinks with it.
3 · Who calls what
| Who | Calls | Why |
|---|---|---|
| Buyer (you on Try it, or the demo bot) | PoolSwapTest.swap → PoolManager.unlock → PoolManager.swap → Seiz3HookRemote.beforeSwap → PoolManager.take / sync → Seiz3VaultRemote.onHookFill → PoolManager.settle | Buys NVDAx; the hook fills it from the vault |
| Keeper | Seiz3VaultRemote.liquidate → Morpho.liquidate → onMorphoLiquidate Seiz3VaultRemote.unwindStep → PoolManager.unlock → unlockCallback → PoolManager.swap Seiz3VaultRemote.syncHedge | Liquidates, pushes chunks into the pool, confirms each hedge |
| PoolManager | Seiz3HookRemote.beforeInitialize / beforeSwap Seiz3VaultRemote.unlockCallback | v4 calls the hook on every swap in the vault's pool |
| Seiz3VaultRemote | HyperCoreGateway.placeOrder | Queues the short after a liquidation, and the buy-back after a sale |
| Relayer | IOC order on Hyperliquid HyperCoreGateway.relay(snapshot) | Places the vault's orders, reports the position back |
| Chainlink CRE | HyperCoreGateway.onReport RiskParams.onReport | Independent snapshots of the hedge account; market hours |
| Pool bot | PoolSeeder.swapToPrice → PoolManager.swap | Keeps the pool on HyperCore's price, as arbitrageurs would |
| Market A liquidator | NaiveLiquidator.liquidate → Morpho.liquidate → swap on the thin pool | The comparison: dumps at any price, no hedge |
4 · Contracts
- Seiz3VaultRemote
- 0x9557cd78f2332fb661eBd0017eE057cD4A086c20 ↗
- ERC-4626 vault (abUSDC): liquidates, hedges, unwinds
- HyperCoreGateway
- 0x6db06845B210C69889022B1F83a2Ba17528Ed826 ↗
- The vault's orders out, HyperCore snapshots in
- Market A oracle
- 0x37F096010F1429dA60358CC312c951F1C7704922 ↗
- Market B oracle
- 0x25DBB8a62b993c7166D73afe1E8f538A5950d448 ↗
- Market C oracle
- 0xc048EF0A6301359af6Fb28C7F4266cDa21Fc72b9 ↗
Pools: the vault's USDC/NVDAx pool (fee set by the hook on every swap, tick spacing 60, hook 0x4fbe…2088), and market A's own pool (0.05% fee, no hook), so the naive dump never moves the vault's pool.