From pancakeswap-driver
Plans token swaps on PancakeSwap: parses intent, verifies tokens, fetches prices, generates deep links for BSC/Ethereum/Arbitrum/Base. Invoke on swap requests.
npx claudepluginhub pancakeswap/pancakeswap-aiThis skill is limited to using the following tools:
Plan token swaps on PancakeSwap by gathering user intent, discovering and verifying tokens, fetching price data, and generating a ready-to-use deep link to the PancakeSwap interface.
Plans optimal token swaps via PCS Hub on BSC, fetches DEX routes with splits, and generates handoff links for Trust Wallet, Binance Wallet, or other channels.
Integrates PancakeSwap token swaps into React/Next.js frontends, Node/Python backends, and smart contracts via Routing API, Smart Router SDK, or direct calls.
Aggregates 500+ DEXs for optimal token swaps across 20+ chains like Ethereum, Solana, Base, BSC. Quotes prices, executes trades, builds calldata with slippage and impact controls.
Share bugs, ideas, or general feedback.
Plan token swaps on PancakeSwap by gathering user intent, discovering and verifying tokens, fetching price data, 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. /swap-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 Swap Planner
Plan token swaps on PancakeSwap and get a ready-to-use deep link — no code required.
How to use: Tell me what you want to swap, on which chain, and how much.
Examples:
Swap 100 USDT for BNB on BSCBuy CAKE with 0.5 ETH on EthereumSwap 50 USDC to ARB on Arbitrum OneSwap 1 ETH on Base for USDC on ArbitrumThis skill does not execute swaps — it plans them. The output is a deep link URL that opens the PancakeSwap interface pre-filled with the swap parameters, so the user can review and confirm the transaction in their own wallet.
::: 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, tokens.pancakeswap.finance, api.coingecko.com, api.geckoterminal.com, api.llama.fi, pancakeswap.ai, 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-swap-planner&version=1.2.1&agent=AGENT_NAME&ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)&os=$(uname -s)&arch=$(uname -m)" \
2>/dev/null &
PancakeSwap X is an intent-based execution layer built into the PancakeSwap Swap interface. It aggregates third-party liquidity and uses off-chain order signing with a filler network, offering advantages over standard AMM routing.
| Benefit | Description |
|---|---|
| Gas-free swaps | Users pay zero gas for the swap transaction itself |
| MEV protection | Orders go off-chain to fillers, not through the public mempool |
| Better pricing | Fillers compete to offer the best execution price |
| No fees | PancakeSwap X currently charges no additional fees |
| Chain | PCSX Support |
|---|---|
| Ethereum | Crypto tokens |
| Arbitrum One | Crypto tokens |
| Base. | Crypto tokens |
| BNB Smart Chain | Real-world assets (RWAs) only |
| Other chains | Not available |
PCSX is enabled by default in the PancakeSwap Swap interface. The interface automatically compares PCSX pricing against AMM liquidity (V2, V3, StableSwap) and routes through whichever offers the best price. No action is required from the user — the deep link opens the same /swap page, and PCSX activates automatically when it's the optimal path.
If PCSX cannot fill the order (unsupported pair, trade size too large, or network not supported), the interface falls back to standard AMM routing silently.
Users can manually toggle PCSX via Settings → Customize Routing in the swap interface.
Surface PCSX information in Step 6 output when all of the following are true:
When PCSX is relevant, include in the output:
PancakeSwap supports swapping tokens across different blockchains in a single step. When the source chain and destination chain differ, the interface routes through a bridge protocol automatically — no manual bridging required.
| Protocol | Use Case | Typical Speed |
|---|---|---|
| Across | EVM ↔ EVM | Seconds to under a minute |
| Relay | Solana ↔ EVM | Seconds to under a minute |
Cross-chain swaps are supported between: BNB Chain, Ethereum, Arbitrum, Base, zkSync Era, Linea, and Solana.
Note: opBNB and Monad are not supported for cross-chain swaps.
PancakeSwap charges no cross-chain fee. Users pay:
Use cross-chain swaps when the user specifies different source and destination chains — for example, "swap ETH on Base for USDC on Ethereum" or "send BNB from BSC to ETH on Arbitrum".
| Chain | Chain ID | Deep Link Key | Native Token | PCSX | RPC for Verification |
|---|---|---|---|---|---|
| BNB Smart Chain | 56 | bsc | BNB | RWAs only | https://bsc-dataseed1.binance.org |
| Ethereum | 1 | eth | ETH | Crypto | https://cloudflare-eth.com |
| Arbitrum One | 42161 | arb | ETH | Crypto | https://arb1.arbitrum.io/rpc |
| Base | 8453 | base | ETH | Crypto | https://mainnet.base.org |
| zkSync Era | 324 | zksync | ETH | — | https://mainnet.era.zksync.io |
| Linea | 59144 | linea | ETH | — | https://rpc.linea.build |
| opBNB | 204 | opbnb | BNB | — | https://opbnb-mainnet-rpc.bnbchain.org |
| Monad | 143 | monad | MON | — | https://rpc.monad.xyz |
| Solana | - | sol | SOL | — | https://api.mainnet-beta.solana.com |
If the user describes a token by name, description, or partial symbol rather than providing a contract address, discover it first. Always check the PancakeSwap token list before querying external APIs — tokens found there are whitelisted and skip the scam checks in Step 3.
Read ../common/token-lists.md for the per-chain primary token list URLs. Tokens found in a primary PancakeSwap list are whitelisted — skip the scam/red-flag checks in Step 3 for these tokens. Tokens found only in secondary lists still require Step 3 verification. Tokens not found in any list (primary or secondary) are a red flag — surface a prominent warning to the user before proceeding.
# Search the PancakeSwap token list by exact symbol (case-insensitive)
CHAIN_LIST_URL="https://tokens.pancakeswap.finance/pancakeswap-extended.json" # primary list for chain
KEYWORD='CAKE'
curl -s "$CHAIN_LIST_URL" | \
jq --arg kw "$KEYWORD" '[
.tokens[]
| select((.symbol | ascii_downcase) == ($kw | ascii_downcase))
| {name, symbol, address, decimals}
] | .[0:5]'
If exact symbol match returns nothing, broaden to a contains search:
curl -s "$CHAIN_LIST_URL" | \
jq --arg kw "cake" '[
.tokens[]
| select((.symbol | ascii_downcase | contains($kw)) or (.name | ascii_downcase | contains($kw)))
| {name, symbol, address, decimals}
] | .[0:5]'
Use when token is not found in any PancakeSwap or secondary token list.
# Search by keyword — returns pairs across all DEXes
# Use single quotes for KEYWORD to prevent shell injection
KEYWORD='pepe'
CHAIN="bsc" # use the DexScreener chainId: bsc, ethereum, arbitrum, base, monad
curl -s -G "https://api.dexscreener.com/latest/dex/search" --data-urlencode "q=$KEYWORD" | \
jq --arg chain "$CHAIN" '[
.pairs[]
| select(.chainId == $chain)
| {
name: .baseToken.name,
symbol: .baseToken.symbol,
address: .baseToken.address,
priceUsd: .priceUsd,
liquidity: (.liquidity.usd // 0),
volume24h: (.volume.h24 // 0),
dex: .dexId
}
]
| sort_by(-.liquidity)
| .[0:5]'
| Chain | DexScreener chainId |
|---|---|
| BNB Smart Chain | bsc |
| Ethereum | ethereum |
| Arbitrum One | arbitrum |
| Base | base |
| zkSync Era | zksync |
| Linea | linea |
| Monad | monad |
| Solana | solana |
DexScreener may not index newer tokens, RWA tokens, or low-liquidity pairs. GeckoTerminal often has broader coverage.
# Search for pools by token name/symbol on a specific network
KEYWORD='USDon'
NETWORK="bsc" # GeckoTerminal network: bsc, eth, arbitrum, base, zksync, linea, monad, solana
curl -s "https://api.geckoterminal.com/api/v2/search/pools?query=${KEYWORD}&network=${NETWORK}" | \
jq '[.data[] | {
pool: .attributes.name,
address: .attributes.address,
base: .relationships.base_token.data.id,
quote: .relationships.quote_token.data.id
}] | .[0:5]'
# Look up a specific token address for price and metadata
TOKEN="0x1f8955E640Cbd9abc3C3Bb408c9E2E1f5F20DfE6"
NETWORK="bsc"
curl -s "https://api.geckoterminal.com/api/v2/networks/${NETWORK}/tokens/${TOKEN}" | \
jq '.data.attributes | {name, symbol, address, price_usd, total_supply}'
When a token exists on one chain but the user wants it on another, CoinGecko's platforms field lists all deployed addresses. Useful for tokens like Ondo RWAs that deploy on multiple chains.
# Look up a token by its known address on any chain to find all deployments
# Use the CoinGecko platform key: ethereum, binance-smart-chain, arbitrum-one, base, etc.
PLATFORM="ethereum"
TOKEN="0xAcE8E719899F6E91831B18AE746C9A965c2119F1"
curl -s "https://api.coingecko.com/api/v3/coins/${PLATFORM}/contract/${TOKEN}" | \
jq '{id: .id, symbol: .symbol, name: .name, platforms: .platforms}'
Rate limits: CoinGecko's free tier is limited to ~10-30 requests/minute. GeckoTerminal is more generous. Prefer DexScreener first, fall back to GeckoTerminal, then CoinGecko.
If DexScreener, GeckoTerminal, and the token list don't return a clear match, use WebSearch to find the official contract address from the project's website or announcement. Always cross-reference with on-chain verification (Step 3).
If discovery returns several tokens with the same symbol, present the top candidates (by liquidity) and ask the user to confirm which one they mean. Never silently pick one — scam tokens frequently clone popular symbols.
I found multiple tokens matching "SHIB" on BSC:
1. SHIB (Shiba Inu) — $2.4M liquidity — 0xb1...
2. SHIBB (Shiba BSC) — $12K liquidity — 0xc3...
3. SHIBX — $800 liquidity — 0xd9...
Which one did you mean?
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:
| Chain | Native | URL Value |
|---|---|---|
| BSC | BNB | BNB |
| ETH | ETH | ETH |
| opBNB | BNB | BNB |
| Monad | MON | MON |
| Solana | SOL | SOL |
BSC (Chain ID: 56)
| Symbol | Address | Decimals |
|---|---|---|
| WBNB | 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c | 18 |
| BUSD | 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56 | 18 |
| USDT | 0x55d398326f99059fF775485246999027B3197955 | 18 |
| USDC | 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d | 18 |
| CAKE | 0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82 | 18 |
| ETH | 0x2170Ed0880ac9A755fd29B2688956BD959F933F8 | 18 |
| BTCB | 0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c | 18 |
Ethereum (Chain ID: 1)
| Symbol | Address | Decimals |
|---|---|---|
| WETH | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 | 18 |
| USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 | 6 |
| USDT | 0xdAC17F958D2ee523a2206206994597C13D831ec7 | 6 |
| CAKE | 0x152649eA73beAb28c5b49B26eb48f7EAD6d4c898 | 18 |
Arbitrum One (Chain ID: 42161)
| Symbol | Address | Decimals |
|---|---|---|
| WETH | 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 | 18 |
| USDC | 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 | 6 |
| USDT | 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9 | 6 |
Monad (Chain ID: 143)
| Symbol | Address | Decimals |
|---|---|---|
| WMON | 0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A | 18 |
Solana (No chain ID)
| Symbol | Address | Decimals |
|---|---|---|
| USDT | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB | 6 |
| USDC | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | 6 |
Decimals matter for display only — the URL always uses human-readable amounts (e.g.,
0.5, not500000000000000000).
Never include an unverified address in a deep link. Even one wrong digit routes the user's funds somewhere else. For solana chain, use method C instead of method A and B
cast (Foundry — preferred)Only use this for EVM compatible chains, other chains such as Solana will default to use Method B
# Set the RPC for the target chain (see Supported Chains table above)
RPC="https://bsc-dataseed1.binance.org"
TOKEN="0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82"
[[ "$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"
cast is unavailable)RPC="https://bsc-dataseed1.binance.org"
TOKEN="0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82"
[[ "$TOKEN" =~ ^0x[0-9a-fA-F]{40}$ ]] || { echo "Invalid token address"; exit 1; }
# name() selector = 0x06fdde03
NAME_HEX=$(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')
# Decode ABI-encoded string: skip 0x + 64 bytes offset + 64 bytes length prefix, then decode hex
# (simplified — the first non-zero part after 0x0000...0020...length is the name bytes)
echo "name() raw: $NAME_HEX"
# symbol() selector = 0x95d89b41
curl -sf -X POST "$RPC" \
-H "Content-Type: application/json" \
-d "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"eth_call\",\"params\":[{\"to\":\"$TOKEN\",\"data\":\"0x95d89b41\"},\"latest\"]}" \
| jq -r '.result'
If
eth_callreturns0x(empty), the address is either not a contract or not an ERC-20 token. Do not proceed.
eth_call returns 0x → not a token contractUse 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}'
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)# Query DexScreener for the token's price on the target chain
CHAIN_ID="bsc" # DexScreener chain ID (see table in Step 0)
TOKEN="0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82"
# Validate address format: EVM (0x...) or Solana (base58)
if [[ "$CHAIN_ID" == "solana" ]]; then
[[ "$TOKEN" =~ ^[1-9A-HJ-NP-Za-km-z]{32,44}$ ]] || { echo "Invalid Solana address"; exit 1; }
else
[[ "$TOKEN" =~ ^0x[0-9a-fA-F]{40}$ ]] || { echo "Invalid token address"; exit 1; }
fi
curl -s "https://api.dexscreener.com/latest/dex/tokens/${TOKEN}" | \
jq --arg chain "$CHAIN_ID" '[
.pairs[]
| select(.chainId == $chain)
]
| sort_by(-.liquidity.usd)
| .[0]
| {
priceUsd: .priceUsd,
priceNative: .priceNative,
liquidityUsd: .liquidity.usd,
volume24h: .volume.h24,
priceChange24h: .priceChange.h24,
bestDex: .dexId,
pairAddress: .pairAddress
}'
If DexScreener returns no pairs for a token, try GeckoTerminal:
NETWORK="bsc" # GeckoTerminal network: bsc, eth, arbitrum, base, zksync, linea, monad, solana
TOKEN="0x1f8955E640Cbd9abc3C3Bb408c9E2E1f5F20DfE6"
# Validate address format: EVM (0x...) or Solana (base58)
if [[ "$NETWORK" == "solana" ]]; then
[[ "$TOKEN" =~ ^[1-9A-HJ-NP-Za-km-z]{32,44}$ ]] || { echo "Invalid Solana address"; exit 1; }
else
[[ "$TOKEN" =~ ^0x[0-9a-fA-F]{40}$ ]] || { echo "Invalid token address"; exit 1; }
fi
curl -s "https://api.geckoterminal.com/api/v2/networks/${NETWORK}/tokens/${TOKEN}" | \
jq '.data.attributes | {name, symbol, address, price_usd}'
Surface these to the user before generating the deep link:
| Condition | Warning |
|---|---|
| Liquidity < $10,000 USD | "Very low liquidity — expect high slippage and price impact" |
| Estimated price impact > 5% for their amount | "Your trade size will move the price significantly" |
| 24h price change < −50% | "This token has dropped >50% in 24h — proceed cautiously" |
| No pairs found on DexScreener or GeckoTerminal | "No liquidity found — this token may not be tradeable" |
https://pancakeswap.finance/swap
| Parameter | Required | Description | Example Value |
|---|---|---|---|
chain | Yes | Source chain key (see Supported Chains table) | bsc, eth, arb, base |
inputCurrency | Yes | Input token address, or native symbol | BNB, ETH, MON, 0x55d398... |
outputCurrency | Yes | Output token address, or native symbol | 0x0E09FaBB..., ETH |
exactAmount | No | Amount in human-readable units (not wei) | 0.5, 100, 1000 |
exactField | No | "input" (selling exact amount) or "output" (buying exact amount) | input |
chainOut | Cross-chain only | Destination chain key when different from chain | eth, arb, bsc |
BNB → CAKE on BSC (sell 0.5 BNB)
https://pancakeswap.finance/swap?chain=bsc&inputCurrency=BNB&outputCurrency=0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82&exactAmount=0.5&exactField=input
USDT → ETH on Ethereum (sell 100 USDT)
https://pancakeswap.finance/swap?chain=eth&inputCurrency=0xdAC17F958D2ee523a2206206994597C13D831ec7&outputCurrency=ETH&exactAmount=100&exactField=input
CAKE → USDT on BSC (buy exactly 50 USDT)
https://pancakeswap.finance/swap?chain=bsc&inputCurrency=0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82&outputCurrency=0x55d398326f99059fF775485246999027B3197955&exactAmount=50&exactField=output
ETH → USDC on Arbitrum (sell 0.1 ETH)
https://pancakeswap.finance/swap?chain=arb&inputCurrency=ETH&outputCurrency=0xaf88d065e77c8cC2239327C5EDb3A432268e5831&exactAmount=0.1&exactField=input
SOL → USDC on Solana (sell 1 SOL)
https://pancakeswap.finance/swap?chain=sol&inputCurrency=SOL&outputCurrency=Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB&exactAmount=1&exactField=input
USDC → SOL on Solana (BUY 1 SOL)
https://pancakeswap.finance/swap?chain=sol&inputCurrency=Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB&outputCurrency=SOL&exactAmount=1&exactField=output
ETH on Base → USDC on Ethereum (cross-chain, sell 1 ETH)
https://pancakeswap.finance/swap?chain=base&inputCurrency=ETH&outputCurrency=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&chainOut=eth&exactAmount=1&exactField=input
USDC on Arbitrum → BNB on BSC (cross-chain, sell 100 USDC)
https://pancakeswap.finance/swap?chain=arb&inputCurrency=0xaf88d065e77c8cC2239327C5EDb3A432268e5831&outputCurrency=BNB&chainOut=bsc&exactAmount=100&exactField=input
// EVM chains: keyed by numeric chain ID
const EVM_CHAIN_KEYS: Record<number, string> = {
56: 'bsc',
1: 'eth',
42161: 'arb',
8453: 'base',
324: 'zksync',
59144: 'linea',
204: 'opbnb',
143: 'monad',
0: 'sol',
}
// Solana has no EVM chain ID — pass chainKey: 'sol' directly
function buildPancakeSwapLink(params: {
chainId?: number // EVM chain ID (omit for Solana)
chainKey?: string // Use 'sol' for Solana, or any key from EVM_CHAIN_KEYS values
inputCurrency: string // address or native symbol (BNB/ETH/MON/SOL)
outputCurrency: string // address or native symbol
exactAmount?: string // human-readable, e.g. "0.5"
exactField?: 'input' | 'output'
chainOutId?: number // EVM chain ID of destination chain (cross-chain swaps)
chainOutKey?: string // Destination chain key (cross-chain swaps, e.g. 'eth', 'arb')
}): string {
const chain =
params.chainKey ?? (params.chainId !== undefined ? EVM_CHAIN_KEYS[params.chainId] : undefined)
if (!chain) throw new Error(`Unsupported chain: chainId=${params.chainId}`)
const query = new URLSearchParams({
chain,
inputCurrency: params.inputCurrency,
outputCurrency: params.outputCurrency,
})
if (params.exactAmount) query.set('exactAmount', params.exactAmount)
if (params.exactField) query.set('exactField', params.exactField)
// Cross-chain: add chainOut when destination differs from source
const chainOut =
params.chainOutKey ??
(params.chainOutId !== undefined ? EVM_CHAIN_KEYS[params.chainOutId] : undefined)
if (chainOut && chainOut !== chain) query.set('chainOut', chainOut)
return `https://pancakeswap.finance/swap?${query.toString()}`
}
Standard AMM swap (PCSX not available):
✅ Swap Plan
Chain: BNB Smart Chain (BSC)
Sell: 0.5 BNB (~$XXX.XX USD)
Buy: CAKE (PancakeSwap Token)
Price: ~$X.XX USD per CAKE
Est. output: ~XX.X CAKE
Liquidity: $X,XXX,XXX | 24h Volume: $XXX,XXX
⚠️ Slippage: Use 0.5% for CAKE — adjust up for volatile tokens
💡 Verify token address on BSCScan before confirming in your wallet
🔗 Open in PancakeSwap:
https://pancakeswap.finance/swap?chain=bsc&inputCurrency=BNB&outputCurrency=0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82&exactAmount=0.5&exactField=input
PCSX-eligible swap (Ethereum/Arbitrum crypto tokens):
✅ Swap Plan
Chain: Ethereum
Sell: 1000 USDC (~$1,000 USD)
Buy: WETH
Price: ~$X,XXX USD per ETH
Est. output: ~X.XXX WETH
Liquidity: $XX,XXX,XXX | 24h Volume: $X,XXX,XXX
🛡️ PancakeSwap X: This swap is eligible for PCSX — gasless execution with
MEV protection. The interface will automatically route through PCSX if it
offers a better price. Orders may take up to 2 minutes to fill.
💡 Verify token address on Etherscan before confirming in your wallet
🔗 Open in PancakeSwap:
https://pancakeswap.finance/swap?chain=eth&inputCurrency=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&outputCurrency=ETH&exactAmount=1000&exactField=input
Cross-chain swap (chain ≠ chainOut):
✅ Cross-Chain Swap Plan
From: Base → Ethereum
Sell: 1 ETH (~$X,XXX.XX USD)
Buy: USDC on Ethereum
Est. output: ~$X,XXX USDC (after bridge fees)
🌉 Bridge: Across Protocol (EVM ↔ EVM)
⏱️ Estimated time: seconds to under a minute
💸 Fees: Trading fee on Base + Across bridge fee (deducted from output)
⚠️ PancakeSwap charges no cross-chain fee — bridge fees are charged by Across
💡 Verify token addresses on both BaseScan and Etherscan before confirming
🔗 Open in PancakeSwap:
https://pancakeswap.finance/swap?chain=base&inputCurrency=ETH&outputCurrency=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&chainOut=eth&exactAmount=1&exactField=input
# macOS
open "https://pancakeswap.finance/swap?..."
# Linux
xdg-open "https://pancakeswap.finance/swap?..."
If the open command fails or is unavailable, display the URL prominently so the user can copy it.
| Token Type | Recommended Slippage in UI |
|---|---|
| Stablecoins (USDT/USDC/BUSD pairs) | 0.1% |
| Large caps (CAKE, BNB, ETH) | 0.5% |
| Mid/small caps | 1–2% |
| Fee-on-transfer / reflection tokens | 5–12% (≥ the token's own fee) |
| New meme tokens with thin liquidity | 5–20% |
| PCSX-routed swaps (Ethereum/Arbitrum) | N/A — fillers guarantee execution price |
PCSX note: When a swap routes through PancakeSwap X, slippage settings do not apply. Fillers commit to a specific execution price when they accept the order. The interface still shows slippage settings, but they only take effect if the swap falls back to AMM routing.
Before presenting a deep link to the user, confirm all of the following:
name() and symbol() on-chain match what the user expectsexactAmount is human-readable (not wei)chain key matches the token's actual chainchain ≠ chainOut, both token addresses verified on their respective chainsBSC is a high-MEV chain. Sandwich attacks on public mempool are common, especially for tokens with high volume. Advise users to:
On Ethereum and Arbitrum, PancakeSwap X provides built-in MEV protection because orders are routed off-chain to fillers rather than through the public mempool. If the user is on a PCSX-supported chain and concerned about MEV, note that PCSX handles this automatically when it's the optimal route.
BUSD (Binance USD) is being sunset by Paxos/Binance. New liquidity is largely in USDT and USDC on BSC. If a user wants to swap involving BUSD, mention this and suggest USDT as the preferred stable.