Skip to main content

Expiry → locked LP

A covenant that nobody absorbs within 7 days does not disappear — it becomes permanent liquidity. This is what makes sell pressure productive: unabsorbed exits deepen the pool forever.

Settlement is permissionless

Expiry is not automatic and needs no privileged caller. Once a covenant matures, anyone can trigger settlement (the dApp exposes a "Settle expired" button; developers call the hook's expireMany() / expireOne path). This keeps the protocol trustless: no keeper, no admin, no special role is required to move matured debt.

Two-phase settlement

To settle at the real pool values, the hook and queue split expiry into two phases, both in the same transaction:

  1. beginExpire — the queue flips the mature covenant from Active to Expired and removes it from active accounting. No event yet.
  2. finalizeExpire — once the hook has performed the real value moves through the PoolManager, it reports back the actual settlement result and the queue emits the frozen CovenantExpired event with the tokens moved, ETH paired, and the destination.

Where the value goes

The covenant's CVN is paired with its share of the protocol reserve ETH (the ETH buyers paid into absorptions) and settled into a protocol-owned, locked LP position in the CVN/ETH pool. Two destinations exist:

DestinationCodeWhen
Locked LP0The normal path: debt + paired ETH become a permanent full-range LP position.
Protocol reserve1Fallback: if pairing into LP is not possible, the CVN is held in the protocol reserve.

All resulting pool liquidity is protocol-owned and locked — it is never withdrawn. Every future swap routes through a slightly deeper pool than before.

Next: follow a covenant through every state in the lifecycle.