Loading...
Loading...
Lavarage Protocol — leveraged trading on Solana for any SPL token. Open long/short positions on crypto, memecoins, RWAs (stocks like OPENAI, SPACEX), commodities (gold), and hundreds of other tokens with up to 12x leverage. Permissionless markets — if a token has a liquidity pool, it can be traded with leverage.
npx skill4agent add sendaifun/skills lavarageLavaApiClienttemplates/client.tsimport { LavaApiClient } from './client'
const client = new LavaApiClient(
'https://api.lavarage.xyz',
'lv2_prod_5e5f38fefc893ade780d8a2ccd7433ad8307808c83260e75',
'your-wallet-public-key'
)1. Discover → Search tokens & offers to find leveraged markets
2. Quote → Preview the trade (swap output, price impact, fees)
3. Build TX → API returns a serialized Solana transaction
4. Sign → Sign the transaction with your wallet
5. Submit → Send via MEV-protected endpoint// Search for any token by name, symbol, or mint address
const offers = await client.getOffers({ search: 'OPENAI', side: 'LONG' })
if (offers.length > 0) {
console.log(`Found ${offers.length} offers for OPENAI`)
}Effective exposure = collateral × leverage
Borrowed amount = collateral × (leverage - 1)// Search by token name or symbol
const offers = await client.getOffers({ search: 'BTC' })
// Filter by side
const longOffers = await client.getOffers({ search: 'ETH', side: 'LONG' })
const shortOffers = await client.getOffers({ search: 'ETH', side: 'SHORT' })
// Get all available tokens
const tokens = await client.getTokens()
// Each offer includes:
// - offerPublicKey (needed for opening position)
// - baseToken { symbol, mint, decimals, priceUsd, logoUri }
// - quoteToken { symbol, mint, decimals, priceUsd }
// - side: 'LONG' | 'SHORT'
// - maxLeverage: number
// - interestRate: number (annual %)
// - totalLiquidity: string (available to borrow)const quote = await client.getOpenQuote({
offerPublicKey: offer.address,
userPublicKey: walletAddress,
collateralAmount: '1000000000', // 1 SOL in lamports
leverage: 3,
slippageBps: 50,
})
// quote returns:
// - expectedOutput: tokens received
// - priceImpact: percentage
// - fees: breakdown of all fees
// - liquidationPrice: price at which position gets liquidatedimport { VersionedTransaction } from '@solana/web3.js'
import bs58 from 'bs58'
// Get MEV protection tip
const { tipLamports } = await client.getTipFloor()
// Build the transaction
const result = await client.buildOpenTx({
offerPublicKey: offer.address,
userPublicKey: walletAddress,
collateralAmount: '1000000000', // 1 SOL
leverage: 3,
slippageBps: 50,
astralaneTipLamports: tipLamports, // MEV protection
})
// result.transaction is base58-encoded
// Deserialize, sign, and submit:
const txBytes = bs58.decode(result.transaction)
const tx = VersionedTransaction.deserialize(txBytes)
// Sign with wallet
tx.sign([walletKeypair])
// Submit with MEV protection
const serialized = bs58.encode(tx.serialize())
const { result: txSignature } = await client.submitTransaction(serialized, true)
console.log(`Position opened: ${txSignature}`)// Preview close first
const closeQuote = await client.getCloseQuote({
positionAddress: position.address,
userPublicKey: walletAddress,
slippageBps: 50,
})
// closeQuote shows: proceeds, pnl, fees
// Build close transaction
const { tipLamports } = await client.getTipFloor()
const result = await client.buildCloseTx({
positionAddress: position.address,
userPublicKey: walletAddress,
slippageBps: 50,
astralaneTipLamports: tipLamports,
})
// Sign and submit (same pattern as open)
const txBytes = bs58.decode(result.transaction)
const tx = VersionedTransaction.deserialize(txBytes)
tx.sign([walletKeypair])
const serialized = bs58.encode(tx.serialize())
await client.submitTransaction(serialized, true)// All positions
const positions = await client.getPositions()
// Filter by status
const active = await client.getPositions('EXECUTED')
// Each position includes computed fields:
// - address, status, side
// - collateralAmount, borrowedAmount
// - currentPrice, entryPrice
// - unrealizedPnlUsd, roiPercent
// - liquidationPrice, currentLtv
// - effectiveLeverage
// - interestAccrued, dailyInterestCost
// - baseToken, quoteToken metadata// Sell 30% of position
const result = await client.buildPartialSellTx({
positionAddress: position.address,
userPublicKey: walletAddress,
splitRatioBps: 3000, // 30%
slippageBps: 50,
})
// Returns two transactions that must be submitted as a Jito bundle:
// 1. Split transaction (splits position into two)
// 2. Close transaction (closes the split-off portion)
// Build tip transaction, sign all three, submit as bundle:
const { tipLamports } = await client.getTipFloor()
// ... build tip TX ...
await client.submitBundle([
tipTxBase58,
result.splitTransaction,
result.closeTransaction,
])// Preview impact
const quote = await client.getAddCollateralQuote({
positionAddress: position.address,
userPublicKey: walletAddress,
collateralAmount: '500000000', // 0.5 SOL
})
// Shows new LTV, new liquidation price
// Build and submit
const result = await client.buildAddCollateralTx({
positionAddress: position.address,
userPublicKey: walletAddress,
collateralAmount: '500000000',
})
// Sign and submit...// Two modes:
// - 'withdraw': borrow more and receive tokens in wallet
// - 'compound': borrow more and swap into base token (increases position size)
const quote = await client.getIncreaseBorrowQuote({
positionAddress: position.address,
userPublicKey: walletAddress,
mode: 'compound',
slippageBps: 50,
})
const result = await client.buildIncreaseBorrowTx({
positionAddress: position.address,
userPublicKey: walletAddress,
additionalBorrowAmount: '100000000',
mode: 'compound',
slippageBps: 50,
})
// Sign and submit...// 1. Find borrow offers
const offers = await client.getOffers({ search: 'USDC' })
// 2. Borrow USDC against SOL collateral
// leverage controls LTV: 2x = borrow equal to collateral (50% LTV)
const { tipLamports } = await client.getTipFloor()
const result = await client.buildBorrowTx({
offerPublicKey: offers[0].address,
userPublicKey: walletAddress,
collateralAmount: '1000000000', // 1 SOL
leverage: 2, // borrow ~1 SOL worth of USDC
slippageBps: 50,
astralaneTipLamports: tipLamports,
})
// Sign and submit same as any other position
// Repay later with buildRepayTx() or buildPartialRepayTx()// Single transaction — use Astralane MEV protection
await client.submitTransaction(signedTxBase58, true)
// Multi-transaction bundle (e.g., partial sell) — use Jito
await client.submitBundle([tipTx, splitTx, closeTx])
// Get current tip floor (for MEV protection fee)
const { tipLamports } = await client.getTipFloor()
// Minimum 1,000,000 lamports (0.001 SOL)| Method | Path | Auth | Description |
|---|---|---|---|
| GET | | None | List/search available markets |
| GET | | None | List all tokens |
| GET | | x-api-key | Query positions by owner |
| POST | | x-api-key | Build open position transaction |
| POST | | x-api-key | Build close position transaction |
| POST | | x-api-key | Preview open trade |
| POST | | x-api-key | Preview close trade |
| POST | | x-api-key | Split position into two |
| POST | | x-api-key | Merge two positions |
| POST | | x-api-key | Build split+close bundle |
| POST | | x-api-key | Repay borrow position |
| POST | | x-api-key | Partially repay borrow |
| POST | | x-api-key | Increase leverage |
| POST | | x-api-key | Preview leverage increase |
| POST | | x-api-key | Add collateral to position |
| POST | | x-api-key | Preview collateral addition |
| GET | | x-api-key | Trade event history |
| GET | | None | Current Jito tip floor |
| POST | | None | Submit single TX (MEV-protected) |
| POST | | None | Submit Jito bundle |
/api/v1/https://api.lavarage.xyzastralaneTipLamports/bundle/submitmevProtect: true| Code | Meaning | Action |
|---|---|---|
| Wallet doesn't have enough tokens | Check balance, reduce collateral |
| Transaction simulation failed | Retry with higher slippage or check offer liquidity |
| Position address invalid or not owned by wallet | Verify address and owner |
| Offer/pool doesn't exist | Re-search for available offers |
| Leverage outside allowed range | Check offer's maxLeverage |
| Price moved beyond tolerance | Increase slippageBps or retry |
1avaAUcjccXCjSZzwUvB2gS3DzkkieV2Mw8CjdN65uulavarage/
├── SKILL.md # This file
├── resources/
│ ├── api-reference.md # Detailed endpoint documentation
│ ├── program-addresses.md # On-chain program and token addresses
│ └── types-reference.md # TypeScript types and enums
├── examples/
│ ├── discover-markets.ts # Search tokens and find offers
│ ├── open-long.ts # Open leveraged long position
│ ├── open-short.ts # Open leveraged short position
│ ├── close-position.ts # Close position with PnL
│ ├── portfolio.ts # View positions and portfolio
│ └── borrow.ts # Borrow tokens against collateral + repay
├── templates/
│ └── client.ts # LavaApiClient — copy-paste TypeScript client
└── docs/
└── troubleshooting.md # Common errors and solutions