コンテンツにスキップ

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']
}