npx skills add ...
npx skills add franalgaba/grimoire --skill grimoire-pendle
Fetches Pendle Hosted SDK metadata using the Grimoire venue CLI. Use when you need supported chains, aggregators, markets, assets, or market token details.
npx skills add franalgaba/grimoire --skill grimoire-pendle
Use this skill to inspect Pendle metadata and preflight Pendle routing configuration before running spells.
Preferred invocations:
grimoire venue pendle ...npx -y @grimoirelabs/cli venue pendle ... (no-install)bun run packages/cli/src/index.ts venue pendle ... (repo-local)grimoire-pendle ... (direct binary from @grimoirelabs/venues)Recommended preflight:
grimoire venue doctor --adapter pendle --chain 1 --rpc-url <rpc> --jsongrimoire venue pendle info [--base-url <url>] [--format <auto|json|table>]grimoire venue pendle chains [--base-url <url>] [--format <auto|json|table>]grimoire venue pendle supported-aggregators --chain <id> [--base-url <url>] [--format <auto|json|table>]grimoire venue pendle markets [--chain <id>] [--active <true|false>] [--base-url <url>] [--format <auto|json|table>]grimoire venue pendle assets [--chain <id>] [--type <PT|YT|LP|SY>] [--base-url <url>] [--format <auto|json|table>]grimoire venue pendle market-tokens --chain <id> --market <address> [--base-url <url>] [--format <auto|json|table>]Pendle requires a market-first approach. Do NOT write a Pendle spell without first querying available markets.
Query markets for the target chain and underlying:
Pick a market — note its address and expiry. Each market has specific PT/YT/SY tokens.
Query market tokens to get the exact token addresses:
Write the spell using token addresses from step 3:
pendle.deposit(USDC, ...) — Pendle has no deposit action. Use add_liquidity, mint_py, mint_sy, or swap.enable_aggregator — Some routes require an aggregator. If no route is found, retry with enable_aggregator=true in the with() clause.| Action | Description | Input | Output |
|---|---|---|---|
swap | Swap between any Pendle tokens | Single token | Single token |
add_liquidity | Add single-sided liquidity | Underlying/SY | LP token |
remove_liquidity | Remove single-sided liquidity | LP token | Underlying/SY |
mint_py | Mint PT + YT from underlying | Underlying/SY | PT + YT |
redeem_py | Redeem PT + YT to underlying | PT + YT | Underlying/SY |
mint_sy | Wrap underlying into SY | Underlying | SY |
redeem_sy | Unwrap SY to underlying | SY | Underlying |
Pendle exposes quote_out for route output comparisons:
Selector fields:
asset_outamount (defaults to 1 unit of input asset), slippage_bps, enable_aggregatorWhen writing Pendle actions in .spell files, use with clauses:
| Constraint | Type | Description |
|---|---|---|
max_slippage | integer (bps) | Maximum slippage, validated as integer in [0, 10000], converted to decimal for API |
min_output | integer (wei) | Minimum output amount floor |
require_quote | boolean | Fail if Pendle API quote fails |
max_gas | integer (wei) | Gas estimate cap |
Pendle swap only supports mode: exact_in. exact_out is not supported.
When the Pendle API returns multiple routes, the adapter selects the first (best) route and emits a warning via onWarning. This is logged in non-JSON CLI runs.
Pendle PT, YT, and SY tokens (e.g. PT_FXSAVE, YT_EETH, SY_WSTETH) are automatically resolved via the Pendle API at build time. You can use these symbols directly in spells without providing explicit addresses:
The adapter converts underscore-delimited names (e.g. PT_FXSAVE) to the Pendle API format and picks the best match. If multiple expiries exist, the first (nearest) is selected.
To target a specific expiry or disambiguate, use the full 0x address instead:
Use grimoire venue pendle assets --chain <id> --type PT to discover available tokens and addresses.
https://api-v2.pendle.finance/core.--base-url or PENDLE_API_BASE_URL.--format json for automation and nested payloads.swap currently supports mode: exact_in only.assetOut, outputs), use bare address literals (0x...) and not quoted strings (\"0x...\").QUOTED_ADDRESS_LITERAL.max_slippage is validated as integer bps in [0, 10000] and converted to decimal (bps / 10000) before API requests.