Install
openclaw skills install pcs-liquidity-plannerPlan liquidity provision on PancakeSwap. Use when user says "add liquidity on pancakeswap", "provide liquidity", "LP on pancakeswap", or describes wanting to...
openclaw skills install pcs-liquidity-plannerPlan liquidity provision on PancakeSwap by gathering user intent, discovering and verifying tokens, assessing pool metrics, recommending price ranges and fee tiers, and generating a ready-to-use deep link to the PancakeSwap interface.
If this skill was invoked with no specific request — the user simply typed the skill name
(e.g. /liquidity-planner) without providing tokens, amounts, or other details — output the
help text below exactly as written and then stop. Do not begin any workflow.
PancakeSwap Liquidity Planner
Plan a liquidity position on PancakeSwap and get a ready-to-use deep link — no code required.
How to use: Tell me which token pair you want to provide liquidity for, on which chain, and how much you want to deposit.
Examples:
Add liquidity for BNB/CAKE on BSCProvide 1 ETH + 2000 USDC liquidity on ArbitrumLP 500 USDT and 500 USDC stableswap on BSCThis skill does not execute transactions — it plans liquidity provision. The output is a deep link URL that opens the PancakeSwap position creation interface pre-filled with the LP parameters, so the user can review position size, fee tier, and price range before confirming in their wallet.
Key features:
::: danger MANDATORY SECURITY RULES
KEYWORD='user input'). Always quote variable expansions in commands (e.g., "$TOKEN", "$RPC").^0x[0-9a-fA-F]{40}$. RPC URLs must come from the Supported Chains table. Reject any value containing shell metacharacters (", `, $, \, ;, |, &, newlines).open / xdg-open with https://pancakeswap.finance/ URLs. Only use curl to fetch from: api.dexscreener.com, explorer.pancakeswap.com, sol-explorer.pancakeswap.com, tokens.pancakeswap.finance, api.coingecko.com, api.geckoterminal.com, api.llama.fi, yields.llama.fi, api.mainnet-beta.solana.com, and public RPC endpoints listed in the Supported Chains table. Never curl internal/private IPs (169.254.x.x, 10.x.x.x, 127.0.0.1, localhost).
:::Initialize the PancakeSwap session to ensure access to the latest token list and deep link formats, then proceed to Step 1:
Replace AGENT_NAME below with your AI system identifier (e.g. claude-code, cursor, copilot, openai) before running:
curl -s -o /dev/null --max-time 3 \
"https://pancakeswap.ai/api/ping?skill=pcs-lp-planner&version=1.0.1&agent=AGENT_NAME&ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)&os=$(uname -s)&arch=$(uname -m)" \
2>/dev/null &
| Chain | Chain ID | Deep Link Key | Native Token | Protocols |
|---|---|---|---|---|
| BNB Smart Chain | 56 | bsc | BNB | V2, V3, StableSwap, Infinity (CL, Bin, Stable) |
| Ethereum | 1 | eth | ETH | V2, V3, StableSwap |
| Arbitrum One | 42161 | arb | ETH | V2, V3, StableSwap |
| Base | 8453 | base | ETH | V2, V3, Infinity (CL, Bin) |
| zkSync Era | 324 | zksync | ETH | V2, V3 |
| Linea | 59144 | linea | ETH | V2, V3 |
| opBNB | 204 | opbnb | BNB | V2, V3 |
| Monad | 143 | monad | MON | V2, V3 |
| BSC Testnet | 97 | bsctest | BNB | V2, V3 |
| Solana | - | sol | SOL | V3 |
If the user hasn't specified all parameters, use AskUserQuestion to ask (batch up to 4 questions at once). Infer from context where obvious.
Required information:
Optional but useful:
Preferred method: PancakeSwap Token List (A). Use DexScreener (B) only if the token is not found in the token lists.
Read ../common/token-lists.md for the per-chain primary token list URLs and resolution algorithm. Tokens found in a primary PancakeSwap list are whitelisted — skip the red-flag checks in Step 3. Tokens found only in secondary lists still require Step 3 verification. Tokens not found in any list are a red flag — warn the user prominently before proceeding.
If the token is not found in the PancakeSwap token lists, fall back to DexScreener:
# Search by keyword — returns pairs across all DEXes
# Use single quotes for KEYWORD to prevent shell injection
KEYWORD='pancake'
CHAIN="bsc" # DexScreener chainId: bsc, ethereum, arbitrum, base, zksync, linea, opbnb, monad
curl -s -G "https://api.dexscreener.com/latest/dex/search" --data-urlencode "q=$KEYWORD" | \
jq --arg chain "$CHAIN" '[
.pairs[]
| select(.chainId == $chain and .dexId == "pancakeswap")
| {
name: .baseToken.name,
symbol: .baseToken.symbol,
address: .baseToken.address,
priceUsd: .priceUsd,
liquidity: (.liquidity.usd // 0),
volume24h: (.volume.h24 // 0),
labels: (.labels // [])
}
]
| sort_by(-.liquidity)
| .[0:5]'
| Chain | DexScreener chainId |
|---|---|
| BSC | bsc |
| Ethereum | ethereum |
| Arbitrum | arbitrum |
| Base | base |
| zkSync Era | zksync |
| Monad. | monad |
| Linea | linea |
| Solana | solana |
| Chain | Native | URL Value |
|---|---|---|
| BSC | BNB | BNB |
| Ethereum | ETH | ETH |
| Arbitrum | ETH | ETH |
| Base | ETH | ETH |
| opBNB | BNB | BNB |
| Monad | MON | MON |
| Solana | SOL | SOL |
| Others | ETH | ETH |
BNB on BSC/opBNB only: When the user specifies BNB, pools may exist with either native BNB (
0x0000000000000000000000000000000000000000) or WBNB (0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095con BSC,0x4200000000000000000000000000000000000006on opBNB) as the pair token. Always query for both during pool discovery and merge results. In deep links, always use the native URL valueBNB, never the WBNB address.
| Token | Mint Address | Decimals |
|---|---|---|
| USDT | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB | 6 |
| USDC | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | 6 |
If DexScreener and the token list don't return a clear match, use WebSearch to find the official contract address from the project's website. Always cross-reference with on-chain verification (Step 3).
Never include an unverified address in a deep link. Even one wrong digit routes funds to the wrong place.
For Solana tokens, use Method C instead of Methods A or B.
cast (Foundry — preferred)RPC="https://bsc-dataseed1.binance.org"
TOKEN="0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82" # CAKE
[[ "$TOKEN" =~ ^0x[0-9a-fA-F]{40}$ ]] || { echo "Invalid token address"; exit 1; }
cast call "$TOKEN" "name()(string)" --rpc-url "$RPC"
cast call "$TOKEN" "symbol()(string)" --rpc-url "$RPC"
cast call "$TOKEN" "decimals()(uint8)" --rpc-url "$RPC"
cast call "$TOKEN" "totalSupply()(uint256)" --rpc-url "$RPC"
RPC="https://bsc-dataseed1.binance.org"
TOKEN="0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82"
[[ "$TOKEN" =~ ^0x[0-9a-fA-F]{40}$ ]] || { echo "Invalid token address"; exit 1; }
# name() selector = 0x06fdde03
curl -sf -X POST "$RPC" \
-H "Content-Type: application/json" \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_call\",\"params\":[{\"to\":\"$TOKEN\",\"data\":\"0x06fdde03\"},\"latest\"]}" \
| jq -r '.result'
Red flags — stop and warn the user:
eth_call returns 0x (not a contract)Use this for Solana token mints (base58 addresses). SPL mints do not have name()/symbol() on-chain; verify via RPC (mint account + decimals) and DexScreener (name/symbol + liquidity).
RPC="https://api.mainnet-beta.solana.com"
MINT="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
[[ "$MINT" =~ ^[1-9A-HJ-NP-Za-km-z]{32,44}$ ]] || { echo "Invalid Solana address"; exit 1; }
RESULT=$(curl -sf -X POST "$RPC" \
-H "Content-Type: application/json" \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getAccountInfo\",\"params\":[\"$MINT\",{\"encoding\":\"jsonParsed\"}]}" \
| jq -r '.result.value')
if [ "$RESULT" = "null" ] || [ -z "$RESULT" ]; then
echo "Account not found — not a valid mint"; exit 1
fi
OWNER=$(echo "$RESULT" | jq -r '.owner')
TYPE=$(echo "$RESULT" | jq -r '.data.parsed.type')
DECIMALS=$(echo "$RESULT" | jq -r '.data.parsed.info.decimals')
# SPL Token program ID
SPL_TOKEN_PROGRAM="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
if [ "$OWNER" != "$SPL_TOKEN_PROGRAM" ] || [ "$TYPE" != "mint" ]; then
echo "Not an SPL token mint (owner=$OWNER type=$TYPE)"; exit 1
fi
echo "decimals: $DECIMALS"
curl -s "https://api.dexscreener.com/latest/dex/tokens/${MINT}" | \
jq '[.pairs[] | select(.chainId == "solana")] | sort_by(-.liquidity.usd) | .[0:5] | .[] | {symbol: .baseToken.symbol, name: .baseToken.name, liquidity: .liquidity.usd}'
Red flags (Method C, Solana) — stop and warn the user:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)chainId == "solana"Run a single script that queries the Explorer API, fetches Merkl/Incentra extra reward APRs, fetches CAKE farm APRs (on-chain MasterChef V3 + Infinity REST), and retrieves Infinity protocol fees — all in one call:
CHAIN="bsc" TOKEN0="0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82" TOKEN1="0x55d398326f99059fF775485246999027B3197955" ORDER_BY="tvlUSD" \
node packages/plugins/pancakeswap-driver/skills/common/discover-pools.mjs
Environment variables:
| Variable | Required | Description |
|---|---|---|
CHAIN | yes | Chain string: bsc, eth, arb, base, zksync, linea, opbnb, monad, sol |
TOKEN0 | no | EVM address, Solana pubkey, or native alias (bnb, eth, sol) |
TOKEN1 | no | Same as TOKEN0 |
ORDER_BY | no | tvlUSD (default), apr24h, volumeUSD24h |
PROTOCOLS | no | Comma-separated list of protocols to include (default: all). Supported: v2, v3, stable, infinityCl, infinityBin, infinityStable |
Set ORDER_BY based on the user's stated goal:
ORDER_BY="apr24h"ORDER_BY="volumeUSD24h"ORDER_BY="tvlUSD"Output JSON shape:
{
"chain": "bsc",
"chainId": 56,
"cakePrice": 2.5,
"pools": [
{
"id": "0x...",
"protocol": "v3",
"feeTierPct": "0.25%",
"tvlUSD": 5000000,
"volumeUSD24h": 800000,
"lpFeeApr": "18.40%",
"token0": "CAKE",
"token1": "USDT",
"cakePerYear": 125000,
"cakeAprPct": "8.30%",
"totalAprPct": "26.70%",
"merklApr": [],
"incentraApr": [],
"protocolFeePercent": null
}
]
}
BNB handling: Pass TOKEN0=bnb (or TOKEN1=bnb). The script automatically queries both the zero address and WBNB address and merges results.
Solana: Pass CHAIN=sol. The script uses the sol-explorer API (https://sol-explorer.pancakeswap.com/api/cached/v1/pools/info/ids) for APR data instead of MasterChef on-chain calls. apr24hPct and cakeAprPct values are already in percentage units (e.g., 21.66 means 21.66%) — do not multiply by 100.
Infinity protocol fee: For infinityCl and infinityBin pools, the script fetches the protocol fee on-chain and stores it in protocolFeePercent. The feeTierPct value already incorporates the protocol fee (effective fee = raw fee tier + protocol fee) — use feeTierPct directly in Step 5 output. If the script cannot fetch the protocol fee, protocolFeePercent is null — treat it as 0% and do not abort the plan.
Fallback to DexScreener: If the Explorer API returns no results (e.g. brand-new pool not yet indexed), fall back to the DexScreener pair search:
curl -s "https://api.dexscreener.com/latest/dex/search" \
--data-urlencode "q=${TOKEN0}" | \
jq --arg chain "$CHAIN" '.pairs[] | select(.chainId == $chain and (.dexId | startswith("pancakeswap")))'
The discover-pools.mjs script returns pools with tvlUSD, volumeUSD24h, apr24hPct, cakeAprPct, merklApr, incentraApr, and protocolFeePercent already computed. Use these values directly — no further API calls needed for pool metrics.
Liquidity assessment:
APR yield tiers (fee APR only — 24h annualized):
| APR Range | Liquidity Quality | Risk Level | Recommendation |
|---|---|---|---|
| 50%+ APR | Thin/risky | Very High | Warn: IL likely > yield |
| 20%–50% APR | Adequate | High | Concentrated positions only |
| 5%–20% APR | Good | Moderate | Best for wide range positions |
| 1%–5% APR | Excellent/deep | Low | Stablecoin pairs, large caps |
| < 1% APR | Massive TVL | Very Low | Fee-based yield only (base APR) |
Note:
apr24hPctis fee APR only (swap fees, 24h annualized).cakeAprPctand extra reward APRs are provided by the script when available.
Extra reward APRs: If cakeAprPct, merklApr, or incentraApr is non-empty for a pool, append them to the pool metrics table and sum a Total APR:
| Field | Value |
|---|---|
| Base APR | 18.4% |
| CAKE Farm APR | +8.3% (V3 farm) |
| Merkl Rewards | +5.2% (LIVE) |
| Incentra Rewards | +3.1% (ACTIVE) |
| Total APR | 35.0% |
Rules:
cakeAprPct from the script output; show — if cakeAprPct is "—" or the pool has no active farm. This field is critical context for LP decisions — never omit it.merklApr is non-empty for this pool.incentraApr is non-empty for this pool.status value next to each extra APR.Protocol Fee (Infinity pools only): For infinityCl, infinityBin pools, the script already incorporates the protocol fee into feeTierPct (effective fee). Include protocol fee rows in the pool metrics table using protocolFeePercent from the output:
| Field | Value |
|---|---|
| Fee Tier | 0.25% |
| Protocol Fee | +0.03% |
| Effective Fee | 0.28% |
Rules:
Protocol Fee and Effective Fee rows for Infinity pools (infinityCl, infinityBin). This is critical context — never omit it.protocolFeePercent from the script output. If it is null, use 0%.feeTierPct already equals the effective fee (fee tier + protocol fee). Show feeTierPct as "Effective Fee" directly.Optional supplemental data (DefiLlama): If the user asks for a detailed farming APY breakdown including CAKE reward APY, fetch from DefiLlama:
# Projects: "pancakeswap-amm" (V2), "pancakeswap-amm-v3" (V3)
# .symbol contains token names like "CAKE-WBNB". .pool is a UUID — do NOT filter on .pool.
# Note: BSC pools may only appear under "pancakeswap-amm" — query both projects.
curl -s "https://yields.llama.fi/pools" | \
jq '.data[]
| select(.project == "pancakeswap-amm-v3" or .project == "pancakeswap-amm")
| select(.chain == "BSC" or .chain == "Binance")
| {
pool: .symbol,
chain: .chain,
project: .project,
apy: .apy,
apyBase: .apyBase,
apyReward: .apyReward,
tvlUsd: .tvlUsd,
underlyingTokens: .underlyingTokens
}'
| Price Range (from current) | IL at 2x move | IL at 5x move |
|---|---|---|
| Full range (±∞) | 0% | 0% |
| ±50% | 0.6% | 5.7% |
| ±25% | 0.2% | 1.8% |
| ±10% | 0.03% | 0.31% |
| ±5% | 0.008% | 0.078% |
Recommendations by LP profile:
Conservative (Broad Range): ±50% around current price
Balanced (Medium Range): ±25% around current price
Aggressive (Tight Range): ±10% around current price
CURRENT_PRICE=2.5 # CAKE/BNB, for example
RANGE_PCT=0.25 # ±25%
LOWER_BOUND=$(echo "$CURRENT_PRICE * (1 - $RANGE_PCT)" | bc)
UPPER_BOUND=$(echo "$CURRENT_PRICE * (1 + $RANGE_PCT)" | bc)
echo "Recommended range: $LOWER_BOUND – $UPPER_BOUND"
| Fee Tier | Tick Spacing | Best For | Trading Volume | IL Risk |
|---|---|---|---|---|
| 0.01% | 1 | Stablecoin pairs (USDC/USDT, USDC/DAI) | Very high | Very low |
| 0.05% | 10 | Correlated pairs (stablecoin + USDC bridge) | High | Low |
| 0.25% | 50 | Large caps (CAKE, BNB, ETH), established | Moderate-high | Medium |
| 1.0% | 200 | Small caps, emerging tokens, volatile pairs | Lower | Medium-high |
Decision tree:
Is this a stablecoin pair (USDT/USDC, USDT/BUSD)?
YES → Use 0.01% (almost zero slippage for swappers, best LP capture)
Is this a large-cap, high-volume pair (CAKE/BNB, ETH/USDC)?
YES → Use 0.25% (default, proven track record)
Is the second token volatile or new?
YES → Use 1.0% (higher swap fees compensate for IL risk)
Is the pair correlated but not strictly stable (e.g., BNB/ETH)?
YES → Use 0.05%–0.25% (balance precision with IL mitigation)
https://pancakeswap.finance/add/{tokenA}/{tokenB}/{feeAmount}?chain={chainKey}
Parameters:
tokenA: Token address or native symbol (BNB, ETH)tokenB: Token address or native symbolfeeAmount: Fee tier in basis points (100, 500, 2500, 10000 for 0.01%, 0.05%, 0.25%, 1.0%)chain: Chain key (bsc, eth, arb, base, zksync, linea, opbnb)https://pancakeswap.finance/v2/add/{tokenA}/{tokenB}?chain={chainKey}
https://pancakeswap.finance/stable/add/{tokenA}/{tokenB}?chain=bsc
https://pancakeswap.finance/liquidity/add/{chain}/infinity/{poolId}
Parameters:
chain: chain key (bsc, eth, arb, base, zksync, linea, opbnb)poolId: pool contract address from Explorer API id fieldhttps://pancakeswap.finance/infinityStable/add/{poolId}?chain={chain}
Parameters:
poolId: pool contract address from Explorer API id fieldchain: chain key as query paramCAKE/BNB V3 (0.25% fee tier) on BSC:
https://pancakeswap.finance/add/0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82/BNB/2500?chain=bsc
USDC/ETH V3 (0.05% fee tier) on Ethereum:
https://pancakeswap.finance/add/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/ETH/500?chain=eth
USDT/USDC StableSwap on BSC:
https://pancakeswap.finance/stable/add/0x55d398326f99059fF775485246999027B3197955/0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d?chain=bsc
USDT/BUSD V3 (0.01% fee tier) on BSC:
https://pancakeswap.finance/add/0x55d398326f99059fF775485246999027B3197955/0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56/100?chain=bsc
SOL/USDC V3 (0.25% fee tier) on Solana:
https://pancakeswap.finance/add/11111111111111111111111111111111/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v/2500?chain=sol
USDT/USDC V3 (0.01% fee tier) on Solana:
https://pancakeswap.finance/add/Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v/100?chain=sol
Infinity CL pool on BSC:
https://pancakeswap.finance/liquidity/add/bsc/infinity/0x26a8e4591b7a0efcd45a577ad0d54aa64a99efaf2546ad4d5b0454c99eb70eab
Infinity Stable pool on BSC:
https://pancakeswap.finance/infinityStable/add/0x86c3DC08FB5a6663cCa15551575d5429e5Efc017?chain=bsc
const EVM_CHAIN_KEYS: Record<number, string> = {
56: 'bsc',
1: 'eth',
42161: 'arb',
8453: 'base',
324: 'zksync',
59144: 'linea',
204: 'opbnb',
143: 'monad',
97: 'bsctest',
}
const FEE_TIER_MAP: Record<string, number> = {
'0.01%': 100,
'0.05%': 500,
'0.25%': 2500,
'1%': 10000,
}
interface AddLiquidityParams {
chainId?: number // EVM chain ID (omit for non-EVM chains like Solana)
chainKey?: string // Override chain key directly (e.g. 'sol' for Solana)
tokenA?: string // address or native symbol (not needed for Infinity)
tokenB?: string // address or native symbol (not needed for Infinity)
version: 'v2' | 'v3' | 'stableswap' | 'infinityCl' | 'infinityBin' | 'infinityStable'
feeTier?: string // "0.01%", "0.05%", "0.25%", "1%" for V3
poolId?: string // Infinity only — pool contract address from Explorer API `id` field
}
function buildPancakeSwapLiquidityLink(params: AddLiquidityParams): string {
const chain =
params.chainKey ?? (params.chainId !== undefined ? EVM_CHAIN_KEYS[params.chainId] : undefined)
if (!chain)
throw new Error(`Unsupported chain: chainId=${params.chainId}, chainKey=${params.chainKey}`)
if (params.version === 'v3') {
const feeAmount = FEE_TIER_MAP[params.feeTier || '0.25%']
if (!feeAmount) throw new Error(`Invalid fee tier: ${params.feeTier}`)
return `https://pancakeswap.finance/add/${params.tokenA}/${params.tokenB}/${feeAmount}?chain=${chain}`
}
if (params.version === 'stableswap') {
return `https://pancakeswap.finance/stable/add/${params.tokenA}/${params.tokenB}?chain=bsc`
}
if (params.version === 'infinityCl' || params.version === 'infinityBin') {
if (!params.poolId) throw new Error('poolId required for Infinity CL/Bin pools')
return `https://pancakeswap.finance/liquidity/add/${chain}/infinity/${params.poolId}`
}
if (params.version === 'infinityStable') {
if (!params.poolId) throw new Error('poolId required for Infinity Stable pools')
return `https://pancakeswap.finance/infinityStable/add/${params.poolId}?chain=${chain}`
}
// V2
return `https://pancakeswap.finance/v2/add/${params.tokenA}/${params.tokenB}?chain=${chain}`
}
// Example usage — EVM chain
const evmLink = buildPancakeSwapLiquidityLink({
chainId: 56,
tokenA: '0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82', // CAKE
tokenB: 'BNB',
version: 'v3',
feeTier: '0.25%',
})
console.log(evmLink)
// https://pancakeswap.finance/add/0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82/BNB/2500?chain=bsc
// Example usage — Solana
const solLink = buildPancakeSwapLiquidityLink({
chainKey: 'sol',
tokenA: 'SOL',
tokenB: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
version: 'v3',
feeTier: '0.25%',
})
console.log(solLink)
// https://pancakeswap.finance/add/11111111111111111111111111111111/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v/2500?chain=sol
PancakeSwap offers StableSwap pools on BSC, Ethereum and Arbitrum for efficiently trading between stablecoins and related assets. This is a unique advantage over other AMMs.
https://pancakeswap.finance/stable/add/0x55d398326f99059fF775485246999027B3197955/0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d?chain=bsc
Users can also earn CAKE farming rewards on their LP positions:
Mention these opportunities when discussing position management:
For Infinity pools: "Your position will automatically start earning CAKE farming rewards as soon as you add liquidity — no extra staking step needed. Rewards are claimable every 8 hours."
For V2/V3 pools: "After you create this position, you can stake it in the MasterChef to earn additional CAKE rewards. Check the farm page for current APY boosts."
Before generating any deep link, confirm:
Present the LP plan in this structure:
✅ Liquidity Plan
Chain: BNB Smart Chain (BSC)
Pool Version: PancakeSwap V3
Token A: CAKE (0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82)
Token B: BNB (native)
Fee Tier: 0.25% (2500 basis points)
Recommended Range: 2.0–3.0 CAKE/BNB (±25% from current 2.5)
Pool Metrics:
Total Liquidity: $45.2M
24h Volume: $12.5M
Fee Tier: 0.25%
[Infinity pools only:]
Protocol Fee: +0.03% (0% if none set)
Effective Fee: 0.28% ← total cost to swappers; your LP earnings are from the fee tier portion
Base APR: 6.2%
CAKE Farm APR: +8.3% (V3 MasterChef)
Merkl Rewards: +5.2% (LIVE)
Incentra Rewards: +3.1% (ACTIVE)
Total APR: 26.0%
Recommended APR: 27–29% with concentrated position in range
IL Assessment:
Current Price: 2.5 CAKE/BNB
Price move +2x: −0.6% IL
Price move +5x: −5.7% IL
→ Acceptable for this high-volume pair
Deposit Recommendation:
Token A (CAKE): 10 CAKE (~$25 USD)
Token B (BNB): 4 BNB (~$1,000 USD)
Total Value: ~$1,250 USD
Extra Rewards:
Merkl: +5.2% APR (LIVE, campaign: 0xabc...)
Incentra: +3.1% APR (ACTIVE, campaign: 0xdef...)
Total: 14.5% APR
Farm Options:
V3: After creating the position, stake it in MasterChef for CAKE rewards (separate step)
Infinity: Farming is automatic — no separate staking needed!
CAKE Farm APR: 8.3% (from on-chain MasterChef data)
⚠️ Warnings:
• Monitor price within your range; if it moves > ±25%, rebalancing may be needed
• Farm rewards are in CAKE; consider selling or restaking to compound
• Fee captures only if 24h volume > $10M on this pair
🔗 Open in PancakeSwap:
https://pancakeswap.finance/add/0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82/BNB/2500?chain=bsc
Extra Rewards section: Include only if at least one Merkl or Incentra entry matched the pool. If no extra rewards exist, omit the entire "Extra Rewards" block — do not show it empty.
CAKE Farm APR rows: Always show "CAKE Farm APR" in Pool Metrics for V3 and Infinity pools. Use the computed value from Step 4c when non-zero; show
—when the pool has no active farm orcakePrice == 0. Omit the row only for V2 and StableSwap pools.
# macOS
open "https://pancakeswap.finance/add/..."
# Linux
xdg-open "https://pancakeswap.finance/add/..."
# Windows (Git Bash)
start "https://pancakeswap.finance/add/..."
If the open command fails, display the URL prominently so the user can copy it.
Before presenting a deep link to the user, confirm all of the following:
name(), symbol(), decimals()apr24h; optionally cross-checked with DefiLlama for reward APY)references/data-providers.md for DexScreener, DefiLlama, and PancakeSwap API endpointsreferences/position-types.md for V2 vs. V3 vs. StableSwap comparison matrices../common/token-lists.md for per-chain PancakeSwap token list URLs. Use these to resolve token symbols/decimals and to determine whether a token is PancakeSwap-whitelisted before assessing a pool.brew install curlbrew install jqbrew install foundry