콘텐츠로 이동

Position Limits

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


PIPO implements position limits to manage concentration risk, prevent market manipulation, and ensure fair access for all participants.


User TypeSingle PositionUnderlying TotalPlatform Total
Retail$100K$500KN/A
KYC Verified$500K$2MN/A
VIP (KYB)$5M$20MN/A
InstitutionCustomCustomCustom
PositionLimit Rationale
Call WarrantCapped by SPV inventory
Put Warrant (Buy)User limit + pool availability
Put Warrant (Write)KYB required, minimum $50K
LP PositionNo limit (beneficial for liquidity)

Concentration Risk Management:
Single User Limits (% of pool):
├── Retail: Max 5% of any pool
├── KYC Verified: Max 10% of any pool
├── VIP: Max 25% of any pool
└── Institution: Negotiated (typically 40%)
Platform Limits:
├── Single underlying: Max 60% of total TVL
├── Top 3 underlyings: Max 80% of total TVL
└── Reviewed quarterly
Scenario: SpaceX Call Pool TVL = $5M
User Limits:
├── Retail user: Max $250K position (5%)
├── KYC user: Max $500K position (10%)
└── VIP user: Max $1.25M position (25%)
If user already holds $200K:
├── Retail: Can add $50K more
├── KYC: Can add $300K more
└── VIP: Can add $1.05M more

// Position limit check on every trade
function checkPositionLimit(
address user,
address warrant,
uint256 amount
) internal view returns (bool) {
uint256 currentPosition = balanceOf(user, warrant);
uint256 newPosition = currentPosition + amount;
UserTier tier = getUserTier(user);
uint256 poolTVL = getPoolTVL(warrant);
uint256 maxPosition = getMaxPosition(tier, poolTVL);
return newPosition <= maxPosition;
}
// Tier-based max position
function getMaxPosition(UserTier tier, uint256 poolTVL) internal pure returns (uint256) {
if (tier == UserTier.RETAIL) return poolTVL * 5 / 100; // 5%
if (tier == UserTier.KYC) return poolTVL * 10 / 100; // 10%
if (tier == UserTier.VIP) return poolTVL * 25 / 100; // 25%
return type(uint256).max; // Institution - custom
}
┌─────────────────────────────────────────────────────────────────┐
│ ⚠️ POSITION LIMIT WARNING │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Your order exceeds position limits. │
│ │
│ Order Details: │
│ ├── Warrant: SPACEX-CALL-200B-Q42025 │
│ ├── Order Amount: $300,000 │
│ ├── Current Position: $200,000 │
│ └── Requested Total: $500,000 │
│ │
│ Your Limits (Retail Tier): │
│ ├── Single Position Max: $250,000 (5% of pool) │
│ └── Available to Add: $50,000 │
│ │
│ Options: │
│ ├── [Reduce Order to $50,000] │
│ ├── [Complete KYC for Higher Limits] │
│ └── [Cancel Order] │
│ │
└─────────────────────────────────────────────────────────────────┘

Tier Upgrade Path:
RETAIL (Default)
├── Limits: $100K position, 5% pool
├── Requirements: None (wallet connect)
└── Upgrade: Complete KYC →
KYC VERIFIED
├── Limits: $500K position, 10% pool
├── Requirements: Identity verification
├── Process: ~24 hour approval
└── Upgrade: Complete KYB →
VIP (KYB)
├── Limits: $5M position, 25% pool
├── Requirements: Entity verification, accreditation
├── Process: ~5 business days
├── Benefits: OTC desk, physical delivery
└── Upgrade: Custom agreement →
INSTITUTION
├── Limits: Custom (negotiated)
├── Requirements: Institutional agreement
├── Process: Manual onboarding
└── Benefits: API access, prime brokerage

Wash Trading Detection:
├── Same wallet buying and selling rapidly
├── Related wallets trading with each other
├── Circular trading patterns
└── Volume without price impact
Consequences:
├── Warning (first offense)
├── Trading suspension (repeat)
├── Permanent ban (confirmed manipulation)
└── Loss of LP rewards
Front-Running Mitigations:
├── Private mempool (Flashbots-style)
├── Randomized transaction ordering
├── MEV rebate to users
└── Time-weighted execution for large orders

During Exercise Windows:
├── Position limits unchanged
├── No new purchases allowed (for expiring series)
├── Selling/exercising allowed
└── Concentration limits relaxed for settlement
During High Volatility:
├── Limits may be reduced by 50%
├── New positions paused temporarily
├── Existing positions honored
└── Communication via all channels

const limit = await pipo.checkPositionLimit({
user: '0x...',
warrant: 'SPACEX-CALL-200B-Q42025',
amount: 300000
});
// Response
{
allowed: false,
currentPosition: 200000,
requestedAmount: 300000,
newPosition: 500000,
userTier: 'RETAIL',
maxPosition: 250000,
maxAddable: 50000,
reason: 'EXCEEDS_TIER_LIMIT',
upgradeOptions: ['COMPLETE_KYC']
}