콘텐츠로 이동

Rollover & Calendar Spread

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


Rollover allows users to extend their warrant exposure beyond the original expiry without liquidating and re-purchasing. Calendar Spread Swap is the underlying mechanism that prices this extension.


ProblemTraditional SolutionPIPO Rollover
Thesis needs more timeSell, rebuy (slippage, fees)One-click extension
Expiry approaching OTMAccept loss or average downRoll to later expiry
Capital efficiencyPay full premium againPay differential only
Tax optimizationRealize gain/lossDefer recognition
Original Position:
- 1,000 SPACEX-CALL-200B-Q42025
- Cost basis: $0.35 per token
- Current price: $0.40 (ITM)
- Expiry: December 2025
User Situation:
- Believes SpaceX will reach $200B but not by Q4 2025
- Wants to extend to Q2 2026
Without Rollover:
- Sell 1,000 tokens @ $0.40 = $400 (realize $50 profit)
- Buy 1,000 Q2-2026 tokens @ $0.55 = $550
- Net cost: $150 additional capital
With Rollover:
- Execute rollover: Q42025 → Q22026
- Pay differential: $0.55 - $0.40 + fees = $0.16 per token
- Net cost: $160 (slightly higher due to fees, but no slippage)
- No taxable event until final sale/exercise

Rollover Cost = (Far Price - Near Price) + Platform Fee + Time Value Adjustment
Where:
- Far Price = Current AMM price of destination expiry
- Near Price = Current AMM price of source expiry
- Platform Fee = 1% of notional
- Time Value Adjustment = Risk-free rate × time difference × notional
Rollover Cost per Token = (P_far - P_near) + (r × Δt × N) + (f × N)
Where:
P_far = Price of far-dated warrant
P_near = Price of near-dated warrant
r = Risk-free rate (5% annualized)
Δt = Time difference in years
N = Notional value per token ($1)
f = Platform fee rate (1%)
Example:
P_far = $0.55
P_near = $0.40
r = 5%
Δt = 0.5 years (Q4 2025 → Q2 2026)
N = $1
f = 1%
Rollover Cost = ($0.55 - $0.40) + (0.05 × 0.5 × $1) + (0.01 × $1)
= $0.15 + $0.025 + $0.01
= $0.185 per token

Most common: extend expiry while keeping same strike.

SPACEX-CALL-200B-Q42025 → SPACEX-CALL-200B-Q22026

Roll to different strike while extending expiry.

SPACEX-CALL-200B-Q42025 → SPACEX-CALL-220B-Q22026

Additional adjustment:

Strike Adjustment = (K_new - K_old) / K_old × Delta × Notional

Roll only a portion of the position.

Roll 500 of 1,000 tokens:
- 500 tokens: Q42025 → Q22026
- 500 tokens: Remain in Q42025

┌─────────────────────────────────────────────────────────────────┐
│ ROLLOVER CENTER │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Current Position: SPACEX-CALL-200B-Q42025 │
│ ├── Holding: 1,000 tokens │
│ ├── Current Price: $0.40 │
│ ├── Days to Expiry: 45 │
│ └── Status: Near expiry (rollover recommended) │
│ │
│ ═══════════════════════════════════════════════════════════ │
│ │
│ Rollover Options: │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Destination: [Q1 2026 ▼] [Q2 2026] [Q3 2026] [Q4 2026] │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Strike: [$200B ▼] (same) [$180B] [$220B] │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Amount: [1,000] tokens (max: 1,000) │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ ───────────────────────────────────────────────────────── │
│ Rollover Quote: │
│ ├── Far Expiry Price: $0.55 │
│ ├── Near Expiry Price: $0.40 │
│ ├── Price Differential: $0.15 │
│ ├── Time Value (5% × 0.25yr): $0.0125 │
│ ├── Platform Fee (1%): $0.01 │
│ ├── Total per Token: $0.1725 │
│ └── Total Cost: $172.50 USDC │
│ ───────────────────────────────────────────────────────── │
│ │
│ [Preview Transaction] [Execute Rollover] │
│ │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│ ROLLOVER EXECUTION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User selects position to roll │
│ │ │
│ ▼ │
│ 2. User chooses destination (expiry, strike) │
│ │ │
│ ▼ │
│ 3. System calculates rollover cost │
│ │ │
│ ▼ │
│ 4. User reviews and approves USDC spend │
│ │ │
│ ▼ │
│ 5. Atomic transaction executes: │
│ ├── a. Near-dated tokens sent to contract │
│ ├── b. USDC payment processed │
│ ├── c. Near-dated tokens burned │
│ └── d. Far-dated tokens minted to user │
│ │ │
│ ▼ │
│ 6. Confirmation displayed │
│ ├── New position details │
│ ├── Transaction hash │
│ └── Updated portfolio view │
│ │
└─────────────────────────────────────────────────────────────────┘

PIPO always shows the rollover pricing formula:

┌─────────────────────────────────────────────────────────────────┐
│ PRICING BREAKDOWN │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Rollover: SPACEX-CALL-200B-Q42025 → Q22026 │
│ │
│ Component Formula Value │
│ ────────────────────────────────────────────────────────── │
│ Far Expiry Price AMM quote Q22026 $0.5500 │
│ Near Expiry Price AMM quote Q42025 $0.4000 │
│ ────────────────────────────────────────────────────────── │
│ Price Differential (Far - Near) $0.1500 │
│ ────────────────────────────────────────────────────────── │
│ Time Value 5% × 0.5yr × $1.00 $0.0250 │
│ Platform Fee 1% × $1.00 $0.0100 │
│ ────────────────────────────────────────────────────────── │
│ Total per Token $0.1850 │
│ ────────────────────────────────────────────────────────── │
│ Amount 1,000 tokens │
│ ══════════════════════════════════════════════════════════ │
│ TOTAL ROLLOVER COST $185.00 │
│ │
└─────────────────────────────────────────────────────────────────┘

Beyond simple rollovers, sophisticated users can trade calendar spreads directly:

Calendar Spread = Long Far-Dated + Short Near-Dated
Position: Long Q22026-CALL, Short Q42025-CALL
├── Profit if: Time value decay favors far-dated
├── Risk: Near-dated moves against you faster
└── Use case: Volatility arbitrage, term structure trading
┌─────────────────────────────────────────────────────────────────┐
│ CALENDAR SPREAD ORDER BOOK │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Spread: Q42025 / Q22026 SPACEX-CALL-200B │
│ │
│ BID (Buy Q22026, Sell Q42025) ASK (Sell Q22026, Buy Q42025)│
│ ───────────────────────────── ─────────────────────────────│
│ $0.14 × 500 $0.16 × 800 │
│ $0.13 × 1,000 $0.17 × 500 │
│ $0.12 × 2,000 $0.18 × 1,500 │
│ │
│ Mid: $0.15 | Spread: $0.02 (13%) │
│ │
│ [Place Spread Order] │
│ │
└─────────────────────────────────────────────────────────────────┘

ConditionReason
During exercise windowMust choose exercise or hold
Position already ITM > 50%High manipulation risk
Destination series doesn’t existMust wait for series launch
Insufficient liquiditySlippage protection
User has pending exerciseSettle first
Max Slippage Settings
├── Default: 2%
├── User configurable: 0.5% - 5%
└── Transaction reverts if exceeded

const quote = await pipo.getRolloverQuote({
sourceWarrant: '0x...SPACEX-CALL-200B-Q42025',
destinationExpiry: 'Q22026',
destinationStrike: 200000000000, // $200B
amount: 1000
});
// Response
{
sourcePrice: 0.40,
destinationPrice: 0.55,
differential: 0.15,
timeValue: 0.025,
platformFee: 0.01,
totalPerToken: 0.185,
totalCost: 185.00,
validUntil: '2025-10-15T12:00:00Z', // Quote valid for 5 minutes
slippageEstimate: 0.5 // percent
}
const tx = await pipo.executeRollover({
sourceWarrant: '0x...SPACEX-CALL-200B-Q42025',
destinationExpiry: 'Q22026',
amount: 1000,
maxCost: 190.00, // Slippage protection
deadline: Math.floor(Date.now() / 1000) + 300 // 5 minute deadline
});
// Response
{
txHash: '0x...',
newWarrantAddress: '0x...SPACEX-CALL-200B-Q22026',
tokensReceived: 1000,
actualCost: 185.50,
timestamp: '2025-10-15T12:01:30Z'
}