LP Tokens
Understanding Liquidity Provider tokens and yield generation through price appreciation
LP tokens represent your stake in the Pupas Protocol pool. Unlike traditional staking that pays rewards in new tokens, Pupas generates yield through LP token price appreciation driven by AI investment returns.
LP Token Fundamentals
What Are LP Tokens?
LP (Liquidity Provider) tokens are receipt tokens that represent your proportional share of the staking pool:
- Ownership Proof: LP tokens prove your stake in the pool 
- Yield Mechanism: Earn through token price appreciation, not inflation 
- Transferable: LP tokens can be transferred between wallets 
- Redeemable: Burn LP tokens to withdraw USDTu/USDT-ERC20 at current price 
Token Standard
- Blockchain: Waves native token 
- Standard: Waves token protocol 
- Decimals: 6 (matching protocol precision) 
- Symbol: PUPAS LP 
Price Appreciation Model
Core Formula
# LP Token Price = Total Pool Balance ÷ Total LP Token Supply
let currentPrice = tryGetInteger("global_lpPrice")Minting and Burning
Minting Process (Staking)
When you stake USDTu/USDT-ERC20, new LP tokens are minted:
# Calculate LP tokens to mint
let feeAmount = fraction(pmt.amount, MintFee, Scale6)  # 0.3% protocol fee
let cleanAmount = pmt.amount - feeAmount
let lpAmount = fraction(cleanAmount, Scale6, tryGetInteger("global_lpPrice"))
# Mint LP tokens and transfer to user
[
  Reissue(lpId, lpAmount, true),
  ScriptTransfer(i.caller, lpAmount, lpId)
]Minting Example
100 USDTu
1.00
99.7 LP (after 0.3% fee)
100 USDTu
1.10
90.64 LP (after 0.3% fee)
100 USDTu
1.25
79.76 LP (after 0.3% fee)
Burning Process (Withdrawal)
When you withdraw, LP tokens are burned for USDTu:
# Calculate USDTu to return
let lpAmount = pmt.amount
let amountToWithdraw = fraction(lpAmount, tryGetInteger("global_lpPrice"), Scale6)
# Burn LP tokens and transfer USDT
[
  Burn(lpId, lpAmount),
  ScriptTransfer(i.caller, amountToWithdraw, fromBase58String(assetIdStr))
]Burning Example
100 LP
1.00
100.00 USDTu
100 LP
1.10
110.00 USDTu
100 LP
1.25
125.00 USDTu
Yield Calculation
APY Through Price Appreciation
Your yield comes from LP token price increases:
# Calculate yield (pseudocode for demonstration)
let initialLpPrice = 1000000  # 1.00 with 6 decimals
let currentLpPrice = 1150000  # 1.15 with 6 decimals
let yieldPercent = fraction((currentLpPrice - initialLpPrice), 100, initialLpPrice)
# Yield = 15%Compound Growth
LP token price appreciation compounds automatically:
Month 1: 1.00 → 1.02 (2% gain)
Month 2: 1.02 → 1.04 (2% on 1.02 = 2.04% total)
Month 3: 1.04 → 1.06 (2% on 1.04 = 6.08% total)No need to claim or reinvest - gains compound within the LP token price.
Price Update Mechanism
Oracle System
LP token prices update hourly via the updateLpPrice function:
@Callable(i)
func updateLpPrice(lpPrice: Int) = {
  let currentOraclePrice = valueOrElse(getInteger("global_lpPrice"), Scale6)
  let oracleChangeDelta = abs(max(
    fraction(currentOraclePrice, Scale6, lpPrice),
    fraction(lpPrice, Scale6, currentOraclePrice)
  ) - Scale6)
  
  # Validate caller and price change limits
  if (i.caller != this) then
    throw("available for self invoke only")
  else if (oracleChangeDelta > OracleVolatilityTolerance) then
    throw("max change for oracle is " + toString(fraction(OracleVolatilityTolerance / 100, Scale6)) + "%")
  else
    [IntegerEntry("global_lpPrice", lpPrice)]
}Update Process
- Data Collection: Oracle aggregates pool value and investment returns 
- Price Calculation: New LP price computed using formula 
- Validation: Price change limited to 10% per update 
- On-chain Update: New price written to smart contract 
- Event Logging: Price update recorded on blockchain 
Price History Tracking
All price updates are recorded on-chain via IntegerEntry("global_lpPrice", lpPrice).
Investment Impact on Price
How AI Investments Affect LP Price
Profitable Investments
Before: Pool = 1,000,000 USDTu, LP Supply = 1,000,000, Price = 1.00
AI Profit: +50,000 USDTu (5% return)
After: Pool = 1,050,000 USDTu, LP Supply = 1,000,000, Price = 1.05Loss Scenarios
Before: Pool = 1,000,000 USDTu, LP Supply = 1,000,000, Price = 1.00
AI Loss: -30,000 USDTu (3% loss)
After: Pool = 970,000 USDTu, LP Supply = 1,000,000, Price = 0.97Protocol Fee Impact
Protocol fee (0.3%) is deducted at staking time:
# Staking with protocol fee
let feeAmount = fraction(pmt.amount, MintFee, Scale6)  # 0.3% of stake
let cleanAmount = pmt.amount - feeAmount
let lpAmount = fraction(cleanAmount, Scale6, tryGetInteger("global_lpPrice"))
# Fee sent to treasury, LP tokens based on net stake
[
  ScriptTransfer(FeeAddress, feeAmount, pmt.assetId),
  Reissue(lpId, lpAmount, true),
  ScriptTransfer(i.caller, lpAmount, lpId)
]LP Token Utility
Current Uses
- Yield Generation: Hold for price appreciation 
- Withdrawal: Burn for USDTu at current price 
- Transfer: Send to other wallets (maintains yield exposure) 
- Portfolio Tracking: Monitor via Waves Explorer 
Future Utility (Roadmap)
- Governance Voting: Vote on protocol proposals 
- Strategy Selection: Choose preferred AI investment strategies 
- Fee Discounts: Reduced protocol fees for large holders 
Risk Factors
LP Token Risks
Smart Contract Risk
- Code Bugs: Potential vulnerabilities in staking contract 
- Oracle Manipulation: Risk of price oracle attacks 
- Access Control: Centralized oracle updates during early phases 
Market Risk
- AI Strategy Losses: Investment strategies may lose money 
- Liquidity Risk: Large withdrawals may face delays 
- Price Volatility: LP token prices can fluctuate significantly 
Mitigation Measures
- Volatility Limits: 10% maximum price change per update 
- Access Control: Only authorized addresses can update prices 
- Error Handling: Comprehensive validation and error messages 
- Transparency: All operations recorded on blockchain 
Risk Disclosure: LP token prices can decrease as well as increase. AI investment strategies don't guarantee profits and may result in losses during adverse market conditions.
Monitoring Your LP Tokens
Key Metrics to Track
Price Performance
- Current LP Price: Real-time token value from - global_lpPrice
- Price History: Historical oracle updates 
- APY Calculation: Annualized yield based on price appreciation 
- Benchmark Comparison: Performance vs USDT savings rates 
Portfolio Value
# Your portfolio calculation (pseudocode)
let yourLpTokens = 997000000  # 997 LP tokens (6 decimals)
let currentLpPrice = tryGetInteger("global_lpPrice")
let portfolioValue = fraction(yourLpTokens, currentLpPrice, Scale6)Dashboard Features
- Real-time Price: Updates every hour with oracle 
- Performance Charts: Historical price and yield data 
- Profit Calculator: Estimate returns based on holding period 
- Withdrawal Simulator: Preview withdrawal amounts 
Advanced Concepts
Impermanent Loss Comparison
Unlike traditional LP tokens in AMMs, Pupas LP tokens don't suffer from impermanent loss:
Exposed to IL from price divergence
No impermanent loss risk
Earn fees from trades
Earn from AI investment profits
Must provide two tokens
Single token (USDTu) staking
Price tied to underlying assets
Price reflects pool performance
Smart Contract Integration
LP token operations are handled by RIDE smart contract functions:
# Helper functions for safe operations
func tryGetInteger(key: String) = {
  match getInteger(this, key) {
    case a: Int => a
    case _ => 0
  }
}
func tryGetString(key: String) = {
  match getString(this, key) {
    case a: String => a
    case _ => ""
  }
}Next Steps
- Learn about Yield Sources to understand profit generation 
- Explore Protocol Features to see how AI drives returns 
- Check the FAQ for common LP token questions 
Last updated