ton-xstocks
xStocks on TON (buy / sell)
Backed xStocks are jettons on TON. Resolve the jetton master from the public xStocks API, then use the same quote → execute flow as ton-swap, with routing preferences learned from real Omniston behavior.
Critical: USDT is the only working swap pair.
Omniston consistently returns no quote for TON → xStock and xStock → TON routes.
All xStock buys and sells must go through USDT. If the user lacks sufficient USDT, buy USDT with TON first (see §Pre-fund USDT below).
Key addresses
| Token | Jetton master |
|---|---|
| USDT (TON) | EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs |
Resolve the TON jetton master for an xStock
-
By symbol (e.g.
TSLAx): fetch viacurl(not WebFetch — the xStocks API returns 403 for non-standard user-agents):curl -s "https://api.xstocks.fi/api/v2/public/assets/{symbol}"(production base:
https://api.xstocks.fi/api/v2— see xStocks API). -
In the JSON, find
deployments[]wherenetworkis"Ton". Use that object'saddressas the jetton master for MCP (fromToken/toToken). -
Optional:
curl -s "https://api.xstocks.fi/api/v2/public/assets"returns all assets with the samedeploymentsshape. -
Call
get_jetton_infowith--jettonAddress <jetton_master>to confirm name / symbol / decimals before swapping.
MCP tools
| Action | Tools |
|---|---|
| Pre-fund USDT | get_jetton_balance (USDT) → get_swap_quote (TON → USDT) → emulate_transaction → send_raw_transaction |
| Buy xStock | get_swap_quote (USDT → xStock) → emulate_transaction → send_raw_transaction |
| Sell xStock | get_jetton_balance (xStock) → get_swap_quote (xStock → USDT) → emulate_transaction → send_raw_transaction |
| Verify | get_jetton_info, get_transaction_status, get_jetton_balance |
Amounts for get_swap_quote are human-readable strings (respect jetton decimals from get_jetton_info).
CLI argument names (exact)
| Tool | Arg | CLI flag |
|---|---|---|
get_jetton_info |
jettonAddress | --jettonAddress |
get_jetton_balance |
jettonAddress | --jettonAddress |
get_swap_quote |
fromToken | --fromToken (use "TON" for native TON, jetton master address for tokens) |
get_swap_quote |
toToken | --toToken |
get_swap_quote |
amount | --amount (human-readable) |
get_swap_quote |
slippageBps | --slippageBps (default 100 = 1%) |
emulate_transaction |
messages | --messages (JSON array from quote's transaction.messages) |
send_raw_transaction |
messages | --messages (same JSON array) |
get_transaction_status |
normalizedHash | --normalizedHash |
Pre-fund USDT (auto, when needed)
Before any xStock trade, check the user's USDT balance:
get_jetton_balancefor the USDT master address — use theamountfield for comparison.- If
amount< required amount for the planned buy: a. Calculate the shortfall (include a small buffer for price movement). b.get_swap_quotewithfromToken="TON"(the literal string, not an address),toToken= USDT master,amount= shortfall. c. Confirm with the user: "You need ~X USDT but only have Y. Swap Z TON → X USDT first?" d. On approval,send_raw_transaction→ pollget_transaction_statusuntilcompleted. e. Re-check USDT balance before proceeding to the xStock buy.
Buy workflow
- Resolve the Ton jetton master for the xStock symbol (API above).
- Check USDT balance — run Pre-fund USDT if insufficient.
get_swap_quote:fromToken= USDT master,toToken= xStock master,amount= USDT to spend,slippageBps= 100 (1 %).emulate_transactionwith the quote'stransaction.messages— verify expected balance changes before sending.- Show the user: fromAmount, toAmount, minReceived, expiresAt, emulation results, and note the forward TON on router messages (gas).
- Confirm once, then
send_raw_transactionwith the returnedtransaction.messages. - Poll
get_transaction_statusonnormalizedHashuntilcompletedorfailed.
Do not attempt TON → xStock directly. It will return no quote. Always route through USDT.
Sell workflow ("sell all" or fixed amount)
get_jetton_balancefor the xStock master → use the returnedamountfield (already a human-readable decimal string, e.g."12.5"). UseamountRawonly if a raw integer is needed elsewhere.- Pass
amountdirectly as theamountparameter forget_swap_quote— no manual conversion needed. get_swap_quote:fromToken= xStock master,toToken= USDT master.emulate_transactionwith the quote'stransaction.messages— verify expected balance changes.- Show the user the quote details and emulation results, then confirm.
send_raw_transaction, then pollget_transaction_statusuntilcompletedorfailed.
Do not attempt xStock → TON directly. Always sell into USDT.
Post-trade checks
- If balance reads 0 immediately after a buy, wait a few seconds and re-query; indexers can lag.
- After a sell, confirm USDT balance increased as expected.
Omniston quirks
- "No quote available" — no route at that size / time. Retry after a short wait, or adjust amount / slippage slightly. Do not switch to TON pairing; it won't help.
- Occasional WebSocket errors (e.g. quote ack) — retry
get_swap_quote. - Quotes expire; if the user waited before confirming, fetch a fresh quote before executing.
Relations
- Execution and confirmation rules:
ton-swapskill. - Wallet funding and status polling:
ton-balanceskill. - Issuance / redemption outside DEX: xStocks product docs / dashboard — not covered by MCP swap alone.
More from ton-org/skills
ton-docs
>
21ton-cli
Use this skill when invoking TON MCP tools directly from the command line. It calls any TON wallet tool via `npx @ton/mcp@alpha <tool_name> [--arg value ...]` without starting an MCP server session. Also use when querying wallet info, checking balances, sending transactions, or running raw TON MCP commands from the terminal.
18ton-swap
Swap or trade tokens on the TON blockchain via DEX. Use when the user wants to swap, trade, exchange, convert, buy, or sell tokens like TON, USDT, jUSDC, or any jetton. Covers phrases like "swap TON for USDT", "trade tokens", "buy USDT", "exchange jettons".
16ton-send
Use this skill when sending TON or jettons (tokens) to an address or TON DNS domain. It transfers TON, jettons, or other assets to any wallet address, .ton domain, or .t.me domain. Also use when the user wants to pay someone, send funds, transfer tokens, or move assets on the TON blockchain.
16ton-nfts
Use this skill when viewing or transferring NFTs on the TON blockchain. It lists collectibles, checks NFT details, and sends NFTs to other addresses. Also use when the user mentions collectibles, digital assets, NFT collections, or wants to send an NFT to someone on TON.
16ton-create-wallet
Use this skill when creating or deploying a TON agentic wallet. It generates operator keys and deploys an on-chain agentic wallet. Also use when setting up a new agent wallet, onboarding a wallet, or when any wallet operation fails because no wallet is configured. This skill is a prerequisite before sending, swapping, or managing assets on TON.
16