콘텐츠로 이동

Expiry Handling

고지 사항: 이 백서는 영어 버전이 공식 문서입니다. 다른 언어 버전은 참고용입니다。


All PIPO warrants have a defined expiry date. This document covers what happens when warrants reach their expiration.


CycleExpiry DateLast Exercise Window
Q1March 31March 15-19
Q2June 30June 15-19
Q3September 30September 15-19
Q4December 31December 15-19
Expiry Moment: 23:59:59 UTC on expiry date
Timeline:
├── Last exercise window: 5 days before month end
├── Final trading: Up to 23:59 UTC on expiry date
├── Expiry: 00:00 UTC following day
└── Final settlement: +24 hours

PIPO implements automatic exercise for in-the-money warrants:

Auto-Exercise Rules:
ITM > 1%: Automatic exercise (unless opted out)
ITM 0-1%: No auto-exercise (fees may exceed value)
OTM: Expire worthless
User can opt-out of auto-exercise in settings.
  • Prevents users from forgetting to exercise valuable positions
  • Standard practice in traditional options markets
  • Only applies at expiry (not during regular windows)
  • User always has option to disable

┌─────────────────────────────────────────────────────────────────┐
│ EXPIRY SETTLEMENT FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Day T (Expiry Date): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 00:00-23:59 UTC: Final trading window │ │
│ │ ├── AMM remains open │ │
│ │ ├── Users can sell positions │ │
│ │ └── No new purchases (optional restriction) │ │
│ │ │ │
│ │ 23:59:59 UTC: Trading halts │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Day T+1 (Settlement): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 00:00 UTC: Warrants officially expire │ │
│ │ │ │
│ │ 06:00 UTC: Oracle Committee publishes final price │ │
│ │ ├── Based on last available valuation data │ │
│ │ └── 2/3 committee signature required │ │
│ │ │ │
│ │ 12:00 UTC: Auto-exercise execution │ │
│ │ ├── ITM warrants (>1%) automatically exercised │ │
│ │ ├── Opted-out positions excluded │ │
│ │ └── OTM warrants marked as expired │ │
│ │ │ │
│ │ 18:00 UTC: Settlement distribution │ │
│ │ ├── USDC payouts to exercised positions │ │
│ │ ├── Warrant tokens burned │ │
│ │ └── Final accounting complete │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

Position: 5,000 SPACEX-CALL-180B-Q42025
Final Oracle: $210B
Strike: $180B
Auto-Exercise: Enabled (default)
Process:
├── ITM check: ($210B - $180B) / $180B = 16.7% ✓
├── Auto-exercise triggered: Yes
├── Gross payout: 5,000 × $1 × 16.7% = $835
├── Settlement fee: $835 × 1% = $8.35
├── Net payout: $826.65
└── Tokens: Burned
User receives: $826.65 USDC
Position: 5,000 SPACEX-CALL-180B-Q42025
Final Oracle: $210B
Strike: $180B
Auto-Exercise: Disabled by user
Process:
├── ITM check: 16.7% ITM ✓
├── Auto-exercise: Disabled
├── No exercise submitted during final window
└── Tokens: Expire worthless
User receives: $0 (position lost)
Warning: User forfeited $826.65 potential value
Position: 3,000 SPACEX-CALL-220B-Q42025
Final Oracle: $195B
Strike: $220B
Auto-Exercise: N/A (OTM)
Process:
├── ITM check: ($195B - $220B) / $220B = -11.4% (OTM)
├── Auto-exercise: Not triggered
├── Intrinsic value: $0
└── Tokens: Expire worthless
User receives: $0 (expected outcome)
Position: 2,000 SPACEX-CALL-180B-Q42025
Final Oracle: $181B
Strike: $180B
Auto-Exercise: Enabled
Process:
├── ITM check: ($181B - $180B) / $180B = 0.56%
├── Below 1% threshold: Auto-exercise NOT triggered
├── Gross payout if exercised: 2,000 × $1 × 0.56% = $11.20
├── Settlement fee: $11.20 × 1% = $0.11
├── Net payout: $11.09
├── Manual exercise: User can still exercise during window
└── If not exercised: Expires worthless
Reason: Settlement fee + gas may exceed value for small ITM.
User can manually exercise if they believe it's worthwhile.

TimingNotification
T-30 daysEmail: “Warrants expiring in 30 days”
T-14 daysEmail + Push: Position summary
T-7 daysEmail + Push + Banner: “Final exercise window approaching”
T-5 daysAll channels: “Exercise window now open”
T-1 dayUrgent push: “Last day to trade/exercise”
T-0Final push: “Warrants expire at midnight UTC”
┌─────────────────────────────────────────────────────────────────┐
│ ⚠️ EXPIRING POSITIONS │
├─────────────────────────────────────────────────────────────────┤
│ │
│ The following positions expire in 5 days: │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ SPACEX-CALL-180B-Q42025 │ │
│ │ ├── Holding: 5,000 tokens │ │
│ │ ├── Current Status: 🟢 ITM (+8.3%) │ │
│ │ ├── Current Value: ~$415 │ │
│ │ ├── Expiry: Dec 31, 2025 │ │
│ │ ├── Auto-Exercise: ✅ Enabled │ │
│ │ └── Action: None required (will auto-exercise) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ OPENAI-CALL-100B-Q42025 │ │
│ │ ├── Holding: 1,000 tokens │ │
│ │ ├── Current Status: 🔴 OTM (-15%) │ │
│ │ ├── Current Value: ~$20 │ │
│ │ ├── Expiry: Dec 31, 2025 │ │
│ │ └── Action: Consider selling on AMM or let expire │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ [Manage Auto-Exercise Settings] [View All Positions] │
│ │
└─────────────────────────────────────────────────────────────────┘

Users can roll positions up to 24 hours before expiry:

Rollover Cutoff:
├── Last trading: Expiry date 23:59 UTC
├── Last rollover: Expiry date 00:00 UTC (24h before)
└── After cutoff: Must exercise or let expire
Rollover at expiry typically has:
├── Minimal time value in old series
├── Higher cost (full time value of new series)
└── Higher urgency/slippage risk

Post-Expiry Token Handling:
├── Exercised tokens: Burned at settlement
├── Expired OTM tokens: Burned automatically
├── Unclaimed settlements: Held in escrow 180 days
└── After 180 days: Forfeited to protocol reserve
Pool Lifecycle After Expiry:
├── T+0: Trading halted
├── T+1: Final settlements processed
├── T+7: LP withdrawals finalized
├── T+30: Pool contracts archived
└── T+365: Pool data moved to cold storage

┌─────────────────────────────────────────────────────────────────┐
│ EXPIRY SETTINGS │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Auto-Exercise: │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ [✓] Enable auto-exercise for ITM positions (>1%) │ │
│ │ [ ] Auto-exercise all ITM positions (including <1%) │ │
│ │ [ ] Disable auto-exercise (manual only) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ Notifications: │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ [✓] Email reminders │ │
│ │ [✓] Push notifications │ │
│ │ [✓] SMS for final 24h (requires phone verification) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ Reminder Frequency: │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ [●] Standard (30d, 14d, 7d, 5d, 1d) │ │
│ │ [ ] Minimal (7d, 1d only) │ │
│ │ [ ] Aggressive (daily from 14d) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ [Save Settings] │
│ │
└─────────────────────────────────────────────────────────────────┘

const expiring = await pipo.getExpiringPositions({
address: '0x...',
withinDays: 30
});
// Response
{
positions: [
{
warrant: 'SPACEX-CALL-180B-Q42025',
balance: 5000,
expiryDate: '2025-12-31',
daysToExpiry: 5,
currentStatus: 'ITM',
itm Percentage: 8.3,
estimatedValue: 415,
autoExercise: true
}
],
totalValue: 435,
autoExerciseEnabled: true
}
const result = await pipo.setAutoExercise({
enabled: true,
threshold: 1.0, // Only auto-exercise if >1% ITM
warrant: null // Apply to all (or specify single warrant)
});
// Response
{
success: true,
setting: {
enabled: true,
threshold: 1.0,
appliedTo: 'ALL_WARRANTS'
}
}