List same-stock LP pools on Raydium and Meteora, with 7-day fee APR estimates. Fees not guaranteed.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional. "Bearer <token>" from https://sofinancelab.xyz/app/ai (connect wallet, Sign to get MCP config; valid 24h). Not needed for list_rwa_pairs and get_pool_range_apr.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Estimated 7-day fee APR of one listed pool (poolAddress from list_rwa_pairs, Raydium or Meteora) for each of the 4 range presets the site prices: Micro (±2 price steps), Tight (±0.05%), Standard (±0.3%), Wide (±1%). Per preset: price bounds (B per 1 A), APR %, share of the last 7 days' volume that traded inside the range, and fees per day at the site's $1,000 card basis. Also the highest-APR preset, the 7-day window, data freshness and confidence. Same saved snapshot as the pool cards on https://sofinancelab.xyz/app/rwa-pairs. New pools (too few days of data) and missing snapshots return a status with a reason and no APR. Estimates from past trading, not a promise of future fees. Fees not guaranteed. No wallet or token needed.
Pool address (poolAddress from list_rwa_pairs)
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http sofinance https://sofinancelab.xyz/api/mcp
Headers
Authorization (optional, not in the config above): Optional. "Bearer <token>" from https://sofinancelab.xyz/app/ai (connect wallet, Sign to get MCP config; valid 24h). Not needed for list_rwa_pairs and get_pool_range_apr.Estimated 7-day fee APR of one listed pool (poolAddress from list_rwa_pairs, Raydium or Meteora) for each of the 4 range presets the site prices: Micro (±2 price steps), Tight (±0.05%), Standard (±0.3%), Wide (±1%). Per preset: price bounds (B per 1 A), APR %, share of the last 7 days' volume that traded inside the range, and fees per day at the site's $1,000 card basis. Also the highest-APR preset, the 7-day window, data freshness and confidence. Same saved snapshot as the pool cards on https://sofinancelab.xyz/app/rwa-pairs. New pools (too few days of data) and missing snapshots return a status with a reason and no APR. Estimates from past trading, not a promise of future fees. Fees not guaranteed. No wallet or token needed.
| Argument | Type | Description |
|---|---|---|
| poolId* | string | Pool address (poolAddress from list_rwa_pairs) |
{
"type": "object",
"required": [
"poolId"
],
"properties": {
"poolId": {
"type": "string",
"description": "Pool address (poolAddress from list_rwa_pairs)"
}
}
}Compute holding-period return and realized fee APR for a Raydium CLMM position NFT from finalized history and current on-chain state (not Raydium pool 24h feeApr). Prefer token-native metrics: for same-asset RWA wrap pairs (e.g. SPCXx/SPCX) report TE in the plain/base ticker using current tick mid (1.0001^tick×10^(decA−decB)), plus raw A/B inventory, holdingDays, feeOnlyAprPct and annualizedReturnPct (HPR×365/days; feesEarned/deposited×365/days). USD is optional/secondary (Jupiter Price v3 / Raydium stable-leg, labeled current — not historical). Discovers open/increase/decrease txs via personal-position signatures + Anchor events + current equity. After submitting a position transaction, use refreshHistory=true and historyAfterSignatures to require its finalized history. Read-only.
| Argument | Type | Description |
|---|---|---|
| wallet | string | Optional wallet to verify NFT ownership (does not change math) |
| skipPricing | boolean | If true, skip Jupiter/Raydium USD pricing (token-native / TE metrics still computed) |
| positionMint* | string | Position NFT mint address (from list_positions) |
| maxSignatures | number | Max personal-position signatures to scan (1-500, default 100) |
| refreshHistory | boolean | Force a fresh history read after a transaction |
| historyAfterSignatures | array |
{
"type": "object",
"required": [
"positionMint"
],
"properties": {
"wallet": {
"type": "string",
"description": "Optional wallet to verify NFT ownership (does not change math)"
},
"skipPricing": {
"type": "boolean",
"default": false,
"description": "If true, skip Jupiter/Raydium USD pricing (token-native / TE metrics still computed)"
},
"positionMint": {
"type": "string",
"description": "Position NFT mint address (from list_positions)"
},
"maxSignatures": {
"type": "number",
"default": 100,
"description": "Max personal-position signatures to scan (1-500, default 100)"
},
"refreshHistory": {
"type": "boolean",
"description": "Force a fresh history read after a transaction"
},
"historyAfterSignatures": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[1-9A-HJ-NP-Za-km-z]{64,88}$"
},
"maxItems": 8
}
}
}Compute live in-range / out-of-range status for a Raydium CLMM position from the current on-chain pool price versus tickLower/tickUpper (B per 1 A). Flags when price approaches a range edge. Read-only.
| Argument | Type | Description |
|---|---|---|
| poolId | string | Optional pool override (defaults to the position's pool) |
| wallet | string | Optional wallet; when set it must match the Bearer token |
| positionMint* | string | Position NFT mint address |
{
"type": "object",
"required": [
"positionMint"
],
"properties": {
"poolId": {
"type": "string",
"description": "Optional pool override (defaults to the position's pool)"
},
"wallet": {
"type": "string",
"description": "Optional wallet; when set it must match the Bearer token"
},
"positionMint": {
"type": "string",
"description": "Position NFT mint address"
}
}
}List all Raydium CLMM positions and wallet assets. Returns position NFTs (with pool, ticks, liquidity) and eligible input assets (SOL, tokens) with balances. Read-only, no private keys required. Use this first to discover available positions and assets.
| Argument | Type | Description |
|---|---|---|
| wallet* | string | Solana wallet public key (base58, 32-44 chars) |
{
"type": "object",
"required": [
"wallet"
],
"properties": {
"wallet": {
"type": "string",
"description": "Solana wallet public key (base58, 32-44 chars)"
}
}
}List the same-stock Solana pools on the SoFinance pools page (https://sofinancelab.xyz/app/rwa-pairs): Raydium CLMM and Meteora DLMM pools where both sides are the same stock from two issuers (e.g. TSLA/TSLAx, SPCX/SPCXx), plus the USDC/USDT pool. Served from the site's saved pools snapshot, the same list the page shows. Each pool has protocol, symbols, fee tier, TVL, 24h volume, apr7d (the highest 7-day range fee APR estimate and which of the 4 range presets it comes from: Micro, Tight, Standard, Wide), and an openPositionUrl. Filter with symbol (e.g. "TSLA"). Default order: 7-day APR, high to low. estimatedFeeAprPct / estimatedFeeAprLabel are the older pool-level 24-hour figure (last 24h fees / TVL, annualized), not a 7-day estimate; small pools can show very large values, and a pool without a 7-day estimate carries a warning. Estimates from past trading, not a promise of future fees. Fees not guaranteed. For the 4 presets of one pool call get_pool_range_apr. No wallet or token needed. Opening a position through MCP (quote_open_position / prepare_open_position) is Raydium CLMM only and needs a wallet token; Meteora pools open on the website.
| Argument | Type | Description |
|---|---|---|
| minTvl | number | Minimum pool TVL in USD (default 0) |
| sortBy | string | Sort key (default apr7d, the 7-day estimate the site ranks by). estimatedFeeApr is the older pool-level 24h figure. |
| symbol | string | Optional ticker filter, e.g. TSLA or TSLAx (case-insensitive; matches either token or the base ticker) |
| maxPages | number | Deprecated, ignored: the list comes from the saved snapshot. |
{
"type": "object",
"required": [],
"properties": {
"minTvl": {
"type": "number",
"default": 0,
"description": "Minimum pool TVL in USD (default 0)"
},
"sortBy": {
"enum": [
"apr7d",
"estimatedFeeApr",
"tvl",
"volume24h"
],
"type": "string",
"default": "apr7d",
"description": "Sort key (default apr7d, the 7-day estimate the site ranks by). estimatedFeeApr is the older pool-level 24h figure."
},
"symbol": {
"type": "string",
"description": "Optional ticker filter, e.g. TSLA or TSLAx (case-insensitive; matches either token or the base ticker)"
},
"maxPages": {
"type": "number",
"description": "Deprecated, ignored: the list comes from the saved snapshot."
}
}
}Prepare an unsigned compound transaction. Returns base64 transaction, permit, and summary. Same safety as prepare_transaction: full simulation, HMAC permit, no private keys. After signing, use submit_compound_transaction.
| Argument | Type | Description |
|---|---|---|
| wallet* | string | Wallet public key |
| positionMint* | string | Position NFT mint address |
| sourceSignatures | array | Optional: prior harvest signatures (max 3) |
{
"type": "object",
"required": [
"wallet",
"positionMint"
],
"properties": {
"wallet": {
"type": "string",
"description": "Wallet public key"
},
"positionMint": {
"type": "string",
"description": "Position NFT mint address"
},
"sourceSignatures": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 3,
"description": "Optional: prior harvest signatures (max 3)"
}
}
}Prepare an unsigned, fully-simulated transaction that opens a new CLMM position. Prefer passing nftMint from an agent-held Keypair so the server never signs: wallet signs first, then add the mint signature on the wallet-returned tx and call submit_open_position. Without nftMint, open signUrl: the sign page generates the mint in the browser, re-prepares, wallet signs first, then the mint (the returned tx is a preview only). HMAC permit, summary, signUrl. 1232-byte limit, fresh blockhash, full simulation. Not submit_signed_transaction — this tx has two required signers.
| Argument | Type | Description |
|---|---|---|
| amount* | string | Amount in token units |
| poolId* | string | Raydium CLMM pool id |
| wallet* | string | Wallet public key |
| nftMint | string | Client-generated position NFT mint public key. Prefer this so the server never signs. Omit only for the MCP signUrl fallback. |
| maxPrice | string | |
| minPrice | string | |
| inputKind* | string | |
| inputMint* | string | Input asset mint, or "SOL" / "USDC" |
| rangePreset | string | |
| resaleFloorBps | number | |
| slippageToleranceBps | number |
{
"type": "object",
"required": [
"wallet",
"poolId",
"inputMint",
"inputKind",
"amount"
],
"properties": {
"amount": {
"type": "string",
"description": "Amount in token units"
},
"poolId": {
"type": "string",
"description": "Raydium CLMM pool id"
},
"wallet": {
"type": "string",
"description": "Wallet public key"
},
"nftMint": {
"type": "string",
"description": "Client-generated position NFT mint public key. Prefer this so the server never signs. Omit only for the MCP signUrl fallback."
},
"maxPrice": {
"type": "string"
},
"minPrice": {
"type": "string"
},
"inputKind": {
"enum": [
"native",
"token"
],
"type": "string"
},
"inputMint": {
"type": "string",
"description": "Input asset mint, or \"SOL\" / \"USDC\""
},
"rangePreset": {
"enum": [
"tight",
"standard",
"wide",
"custom"
],
"type": "string",
"default": "standard"
},
"resaleFloorBps": {
"type": "number",
"default": 9900
},
"slippageToleranceBps": {
"type": "number",
"default": 100
}
}
}Prepare an unsigned, fully-simulated transaction for adding liquidity. Returns base64-encoded transaction for signing, HMAC permit, and summary. The server NEVER holds private keys. Transaction must be signed by the user/agent wallet. Includes: full simulation, 1232-byte limit check, Jupiter swap + Raydium increase_liquidity_v2, short-lived permit. Failure modes: same as quote_add_liquidity, plus simulation failure, size limit, blockhash expiry. After signing, use submit_signed_transaction.
| Argument | Type | Description |
|---|---|---|
| amount* | string | Amount in token units |
| wallet* | string | Wallet public key |
| inputKind* | string | Asset kind: 'native' or 'token' |
| inputMint* | string | Input asset mint address |
| positionMint* | string | Position NFT mint address |
| resaleFloorBps | number | Resale floor in basis points (9500-10000, default 9900) |
| slippageToleranceBps | number | Add-liquidity price tolerance in basis points (0-500, multiple of 10, default 100) |
{
"type": "object",
"required": [
"wallet",
"positionMint",
"inputMint",
"inputKind",
"amount"
],
"properties": {
"amount": {
"type": "string",
"description": "Amount in token units"
},
"wallet": {
"type": "string",
"description": "Wallet public key"
},
"inputKind": {
"enum": [
"native",
"token"
],
"type": "string",
"description": "Asset kind: 'native' or 'token'"
},
"inputMint": {
"type": "string",
"description": "Input asset mint address"
},
"positionMint": {
"type": "string",
"description": "Position NFT mint address"
},
"resaleFloorBps": {
"type": "number",
"default": 9900,
"description": "Resale floor in basis points (9500-10000, default 9900)"
},
"slippageToleranceBps": {
"type": "number",
"default": 100,
"description": "Add-liquidity price tolerance in basis points (0-500, multiple of 10, default 100)"
}
}
}Prepare a fully simulated position withdrawal with a sign link. Default receive USDC; original keeps position tokens. Supply percent (1–100) OR targetUSDC. Impact above 5% requires confirmHighImpact. For two transactions, finalize the first then call again with stage=swap, tx1Signature and previous (the complete first result).
| Argument | Type | Description |
|---|---|---|
| stage | string | |
| wallet* | string | |
| percent | number | |
| receive | string | |
| previous | object | |
| outputMint | string | |
| targetUSDC | number | |
| positionMint* | string | |
| tx1Signature | string | |
| confirmHighImpact | boolean |
{
"type": "object",
"oneOf": [
{
"required": [
"percent"
]
},
{
"required": [
"targetUSDC"
]
}
],
"required": [
"wallet",
"positionMint"
],
"properties": {
"stage": {
"enum": [
"swap"
],
"type": "string"
},
"wallet": {
"type": "string"
},
"percent": {
"type": "number",
"maximum": 100,
"minimum": 1
},
"receive": {
"enum": [
"usdc",
"token",
"original"
],
"type": "string"
},
"previous": {
"type": "object"
},
"outputMint": {
"type": "string"
},
"targetUSDC": {
"type": "number"
},
"positionMint": {
"type": "string"
},
"tx1Signature": {
"type": "string"
},
"confirmHighImpact": {
"type": "boolean"
}
}
}Get a quote for adding liquidity to a position. Estimates swap routes (Jupiter), price impact, output amounts, and immediate resale gap. Verifies NFT ownership, pool state, and balance. Read-only. Quotes expire quickly (configured TTL). Failure modes: insufficient balance, high price impact (>5%), resale floor breach, quote expiration, pool state changes.
| Argument | Type | Description |
|---|---|---|
| amount* | string | Amount in token units (e.g. '1.5' for 1.5 SOL) |
| wallet* | string | Wallet public key |
| inputKind* | string | Asset kind: 'native' for SOL, 'token' for SPL tokens |
| inputMint* | string | Input asset mint address (from list_positions assets) |
| positionMint* | string | Position NFT mint address (from list_positions) |
| resaleFloorBps | number | Minimum resale ratio in basis points (9500-10000, default 9900 = 1% max loss). Conservative immediate-resale protection. |
| slippageToleranceBps | number | Add-liquidity price tolerance in basis points (0-500, multiple of 10, default 100 = 1%). Liquidity is sized so the pool price may drift this much before execution; the unused reserve stays in the wallet. Jupiter swap slippage stays fixed at 0.5%. |
{
"type": "object",
"required": [
"wallet",
"positionMint",
"inputMint",
"inputKind",
"amount"
],
"properties": {
"amount": {
"type": "string",
"description": "Amount in token units (e.g. '1.5' for 1.5 SOL)"
},
"wallet": {
"type": "string",
"description": "Wallet public key"
},
"inputKind": {
"enum": [
"native",
"token"
],
"type": "string",
"description": "Asset kind: 'native' for SOL, 'token' for SPL tokens"
},
"inputMint": {
"type": "string",
"description": "Input asset mint address (from list_positions assets)"
},
"positionMint": {
"type": "string",
"description": "Position NFT mint address (from list_positions)"
},
"resaleFloorBps": {
"type": "number",
"default": 9900,
"description": "Minimum resale ratio in basis points (9500-10000, default 9900 = 1% max loss). Conservative immediate-resale protection."
},
"slippageToleranceBps": {
"type": "number",
"default": 100,
"description": "Add-liquidity price tolerance in basis points (0-500, multiple of 10, default 100 = 1%). Liquidity is sized so the pool price may drift this much before execution; the unused reserve stays in the wallet. Jupiter swap slippage stays fixed at 0.5%."
}
}
}Get a quote for compounding a position (harvest fees/rewards, swap to ratio, reinvest). Returns expected liquidity increase, swap plan, simulation results. Verifies position eligibility. Read-only. Phase one: rejects third reward tokens (no verifiable swap path). Failure modes: ineligible position, third reward token, insufficient harvested fees for minimum liquidity unit, swap plan failure.
| Argument | Type | Description |
|---|---|---|
| wallet* | string | Wallet public key |
| positionMint* | string | Position NFT mint address |
| sourceSignatures | array | Optional: prior harvest transaction signatures to merge (max 3) |
{
"type": "object",
"required": [
"wallet",
"positionMint"
],
"properties": {
"wallet": {
"type": "string",
"description": "Wallet public key"
},
"positionMint": {
"type": "string",
"description": "Position NFT mint address"
},
"sourceSignatures": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 3,
"description": "Optional: prior harvest transaction signatures to merge (max 3)"
}
}
}Quote opening a NEW Raydium CLMM position in a pool (no existing NFT). Input SOL/USDC/pool token, amount, and a price range (presets tight ±0.05% / standard ±0.3% / wide ±1%, or custom minPrice/maxPrice in B per 1 A). Returns expected A/B after Jupiter swap-to-ratio, tick-aligned range, in/out-of-range, price impact, refundable vs non-refundable SOL rent (NFT + tick arrays), and Token-2022/freeze flags. Fails clearly on insufficient balance, >5% impact, transfer-fee/freeze, or unfunded tick arrays the wallet cannot pay. Read-only.
| Argument | Type | Description |
|---|---|---|
| amount* | string | Amount in token units (e.g. '1.5') |
| poolId* | string | Raydium CLMM pool id (from list_rwa_pairs) |
| wallet* | string | Wallet public key |
| maxPrice | string | Custom range max price (B per 1 A), required if rangePreset=custom |
| minPrice | string | Custom range min price (B per 1 A), required if rangePreset=custom |
| inputKind* | string | 'native' for SOL, 'token' otherwise |
| inputMint* | string | "SOL" or "USDC" (resolved to So11111111111111111111111111111111111111112 / EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v), or a mint address in the pool |
| rangePreset | string | Default standard (±0.3% around current B-per-A price) |
| resaleFloorBps | number | Minimum resale ratio in basis points (9500-10000, default 9900) |
| slippageToleranceBps | number | Open-position price tolerance in basis points (0-500, default 100). Jupiter swap slippage stays 0.5%. |
{
"type": "object",
"required": [
"wallet",
"poolId",
"inputMint",
"inputKind",
"amount"
],
"properties": {
"amount": {
"type": "string",
"description": "Amount in token units (e.g. '1.5')"
},
"poolId": {
"type": "string",
"description": "Raydium CLMM pool id (from list_rwa_pairs)"
},
"wallet": {
"type": "string",
"description": "Wallet public key"
},
"maxPrice": {
"type": "string",
"description": "Custom range max price (B per 1 A), required if rangePreset=custom"
},
"minPrice": {
"type": "string",
"description": "Custom range min price (B per 1 A), required if rangePreset=custom"
},
"inputKind": {
"enum": [
"native",
"token"
],
"type": "string",
"description": "'native' for SOL, 'token' otherwise"
},
"inputMint": {
"type": "string",
"description": "\"SOL\" or \"USDC\" (resolved to So11111111111111111111111111111111111111112 / EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v), or a mint address in the pool"
},
"rangePreset": {
"enum": [
"tight",
"standard",
"wide",
"custom"
],
"type": "string",
"default": "standard",
"description": "Default standard (±0.3% around current B-per-A price)"
},
"resaleFloorBps": {
"type": "number",
"default": 9900,
"description": "Minimum resale ratio in basis points (9500-10000, default 9900)"
},
"slippageToleranceBps": {
"type": "number",
"default": 100,
"description": "Open-position price tolerance in basis points (0-500, default 100). Jupiter swap slippage stays 0.5%."
}
}
}Submit a signed compound transaction. Re-verifies permit and summary, then broadcasts. Returns signature on success. Same safety as submit_signed_transaction.
| Argument | Type | Description |
|---|---|---|
| permit* | string | HMAC permit from prepare_compound_transaction |
| wallet* | string | Wallet public key |
| summary* | object | Complete summary object from prepare_compound_transaction response, unchanged (bound by the permit) |
| signedTransaction* | string | Base64-encoded signed transaction |
| unsignedTransaction | string | Base64 prepared transaction from prepare_compound_transaction. Pass this when the wallet rewrote the message (Phantom Lighthouse / ComputeBudget). |
{
"type": "object",
"required": [
"signedTransaction",
"permit",
"wallet",
"summary"
],
"properties": {
"permit": {
"type": "string",
"description": "HMAC permit from prepare_compound_transaction"
},
"wallet": {
"type": "string",
"description": "Wallet public key"
},
"summary": {
"type": "object",
"description": "Complete summary object from prepare_compound_transaction response, unchanged (bound by the permit)"
},
"signedTransaction": {
"type": "string",
"description": "Base64-encoded signed transaction"
},
"unsignedTransaction": {
"type": "string",
"description": "Base64 prepared transaction from prepare_compound_transaction. Pass this when the wallet rewrote the message (Phantom Lighthouse / ComputeBudget)."
}
}
}Submit a signed open-position transaction. Re-verifies HMAC permit, re-reads pool/balances, re-simulates (sigVerify true, including the NFT-mint partial signature), then broadcasts. Pass signedTransaction plus permit, wallet, and the complete summary from prepare_open_position, unchanged. If the wallet rewrote the message (Phantom Lighthouse / ComputeBudget), also pass unsignedTransaction from prepare. Returns signature and the new positionMint.
| Argument | Type | Description |
|---|---|---|
| permit* | string | HMAC permit from prepare_open_position |
| wallet* | string | Wallet public key |
| summary* | object | Complete summary object from prepare_open_position, unchanged (bound by the permit) |
| signedTransaction* | string | Base64-encoded signed transaction |
| unsignedTransaction | string | Base64 prepared transaction from prepare_open_position. Pass this when the wallet rewrote the message (Phantom Lighthouse / ComputeBudget). |
{
"type": "object",
"required": [
"signedTransaction",
"permit",
"wallet",
"summary"
],
"properties": {
"permit": {
"type": "string",
"description": "HMAC permit from prepare_open_position"
},
"wallet": {
"type": "string",
"description": "Wallet public key"
},
"summary": {
"type": "object",
"description": "Complete summary object from prepare_open_position, unchanged (bound by the permit)"
},
"signedTransaction": {
"type": "string",
"description": "Base64-encoded signed transaction"
},
"unsignedTransaction": {
"type": "string",
"description": "Base64 prepared transaction from prepare_open_position. Pass this when the wallet rewrote the message (Phantom Lighthouse / ComputeBudget)."
}
}
}Submit a signed add-liquidity transaction. Re-verifies HMAC permit, re-reads on-chain state, re-simulates, then broadcasts. Pass signedTransaction plus every field of submitArgs from the prepare_transaction response, unchanged. Failure modes: permit mismatch, state changed (liquidity, balance, NFT), expired (time or blockhash), simulation failure. Returns transaction signature on success.
| Argument | Type | Description |
|---|---|---|
| permit* | string | HMAC permit from prepare_transaction |
| wallet* | string | Wallet public key |
| floorBps* | number | Resale floor basis points |
| expiresAt* | number | Expiry timestamp (ms) from summary |
| rangeSide* | string | Position range side from summary |
| requested* | string | Requested amount from summary |
| selection* | object | |
| startingBalances* | object | |
| expectedLiquidity* | string | Expected liquidity from summary |
| signedTransaction* | string | Base64-encoded signed transaction |
| startingLiquidity* | string | Starting liquidity from summary |
| unsignedTransaction | string | Base64 prepared transaction from prepare_transaction. Pass this when the wallet rewrote the message (Phantom Lighthouse / ComputeBudget). |
| lastValidBlockHeight* | number | Block height from summary |
{
"type": "object",
"required": [
"signedTransaction",
"permit",
"wallet",
"selection",
"requested",
"expectedLiquidity",
"startingLiquidity",
"floorBps",
"expiresAt",
"lastValidBlockHeight",
"rangeSide",
"startingBalances"
],
"properties": {
"permit": {
"type": "string",
"description": "HMAC permit from prepare_transaction"
},
"wallet": {
"type": "string",
"description": "Wallet public key"
},
"floorBps": {
"type": "number",
"description": "Resale floor basis points"
},
"expiresAt": {
"type": "number",
"description": "Expiry timestamp (ms) from summary"
},
"rangeSide": {
"enum": [
"below",
"inside",
"above"
],
"type": "string",
"description": "Position range side from summary"
},
"requested": {
"type": "string",
"description": "Requested amount from summary"
},
"selection": {
"type": "object",
"required": [
"positionMint",
"inputMint",
"inputKind"
],
"properties": {
"inputKind": {
"enum": [
"native",
"token"
],
"type": "string"
},
"inputMint": {
"type": "string"
},
"positionMint": {
"type": "string"
}
}
},
"startingBalances": {
"type": "object",
"required": [
"input",
"a",
"b"
],
"properties": {
"a": {
"type": "string"
},
"b": {
"type": "string"
},
"input": {
"type": "string"
}
}
},
"expectedLiquidity": {
"type": "string",
"description": "Expected liquidity from summary"
},
"signedTransaction": {
"type": "string",
"description": "Base64-encoded signed transaction"
},
"startingLiquidity": {
"type": "string",
"description": "Starting liquidity from summary"
},
"unsignedTransaction": {
"type": "string",
"description": "Base64 prepared transaction from prepare_transaction. Pass this when the wallet rewrote the message (Phantom Lighthouse / ComputeBudget)."
},
"lastValidBlockHeight": {
"type": "number",
"description": "Block height from summary"
}
}
}Submit a wallet signed withdrawal. Verifies its HMAC permit and signature, checks expiry, and re-simulates before broadcast. Supply the unchanged summary and permit from prepare_withdraw. If the wallet appended extra instructions (e.g. Phantom Lighthouse), also pass unsignedTransaction from prepare_withdraw. High impact requires confirmHighImpact=true.
| Argument | Type | Description |
|---|---|---|
| permit* | string | |
| wallet* | string | |
| summary* | object | |
| confirmHighImpact | boolean | |
| signedTransaction* | string | |
| unsignedTransaction | string |
{
"type": "object",
"required": [
"wallet",
"signedTransaction",
"permit",
"summary"
],
"properties": {
"permit": {
"type": "string"
},
"wallet": {
"type": "string"
},
"summary": {
"type": "object"
},
"confirmHighImpact": {
"type": "boolean"
},
"signedTransaction": {
"type": "string"
},
"unsignedTransaction": {
"type": "string"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.