TON токен свап: ЖИ-агентке кастодиалды емес шешім
ЖИ-агент TON желісінде токендерді кастодиалды емес свап жасауы: Omniston арқылы get_swap_quote және build_swap_tx, сервер кілт сақтамайды.
Кілтті кім ұстайды — агенттің кастодиалды емес TON свапындағы басты сұрақ
Елестетіңіз: сіз ЖИ-агентке бағамды бақылауды және USDT түсіп кеткенде оны GRAM-ға сатып алуды тапсырдыңыз. Агент нарықты бағалайды, қолайлы сәтті табады, мәмілені дайындайды — дәл осы жерде әдетте тым кеш еске түсетін сұрақ бас көтереді. Агент свапты шын мәнінде жасауы үшін біреу транзакцияға жеке кілтпен қол қоюы керек. Ол кілтті кім ұстайды?
Егер жауап «агент жұмыс істейтін сервис» болса — сіз бөгде кодқа ақшаңызды билеу құқығын бердіңіз. Бір промпт-инъекция, бір логтың сыртқа шығуы жеткілікті — агент сіз ойлағаннан мүлдем басқа нәрсеге қол қояды. Мұндағы мәселе «DEX-ті қалай шақыру керек» дегенде емес — агентке мәмілені жинауға мүмкіндік беріп, қол қоюды тек адамның әмиянына қалдыруда. Төменде агент TON токендерін кастодиалды емес қалай свап жасайтынын талдаймыз.
Сваптың екі бөлігі: есептеу қауіпсіз, қол қою — жоқ
DEX-тегі сваптың түбегейлі әртүрлі екі бөлігі бар. Біріншісі — есептеуге қатысты әрі қауіпсіз: бағамды білу, сырғанауды (slippage) есептеу, транзакцияның денесін жинау. Екіншісі — қайтымсыз әрі қауіпті: сол денеге жеке кілтпен қол қойып, желіге жіберу. Осы жерден жол айрығы басталады:
- Кастодиалды модель. Агент (немесе оның артындағы сервер) кілтті ұстайды және өзі қол қояды. Ыңғайлы — агент автономды әрекет етеді. Бірақ қол қою кілті LLM-мен қатар тұрып қалады, ал LLM — детерминистік емес дүние: оны сенімсіз мәтінмен (жетон сипаттамалары, басқа құралдардың жауаптары, пайдаланушы хабарламалары) көндіріп жіберуге болады. Мысалы, TON Foundation-ның ресми
@ton/mcp-і осылай құрылған: бұл operator-кілті бар агент-әмиян, ол аударым мен свапқа өзі қол қояды (split-key схемасы: operator-кілт агентте, owner-кілт пайдаланушыда). Модель жұмыс істейді, күшті жақтары да бар — автономды жұмсау, NFT және DNS-пен жұмыс, ресми пакет мәртебесі. Бірақ бұл — кілт ұстаушыға деген сенім. - Кастодиалды емес модель. Сервер транзакцияны тек дайындайды және оны қол қойылмаған күйде қайтарады. Қолды пайдаланушының әмияны TonConnect арқылы қояды. Сервер жеке кілтті ешқашан көрмейді және сақтамайды.
Тәулік бойы жұмыс істейтін сауда агенті үшін екінші модель басты тәуекелді жояды: инфрақұрылымның қауіпсіздігі бұзылған күннің өзінде «бүлінетін» ең үлкен нәрсе — қол қойылмаған дайындама, оны сіз бәрібір қолмен немесе өз әмияныңыздың саясатымен растайсыз. Бұл жол айрығы TONNode-тың ресми @ton/mcp-пен адал салыстыруында толығырақ талданған.
TONNode-тың кастодиалды емес моделі: сервер қол қойылмаған транзакция береді
TONNode — бұл TON үшін hosted MCP-сервер. MCP (Model Context Protocol) — ЖИ-агенттер (Claude, Cursor, ChatGPT/Codex және кез келген MCP-клиент) сыртқы құралдарды шақыратын стандарт. TONNode агентке TON-мен жұмыс істеуге арналған 16 құрал береді, әрі свап, кроссчейн және әмиян генерациялау құралдары қатаң түрде кастодиалды емес.
Негізгі инвариант: сервер ЕШҚАШАН қол қоймайды және қаражат пен жеке кілттерді сақтамайды. Свап үшін бұл мынаны білдіреді: қорытынды құрал «орындалған мәмілені» емес, қол қойылмаған TonConnect-хабарламасын — қол қоюға дайын нысанды қайтарады. Сервер қол қойылғаннан кейін қаражат алушысын физикалық тұрғыдан ауыстыра алмайды, өйткені қолтаңба оның қолында жоқ.
TONNode-тағы свап — дәл екі құрал:
get_swap_quote— нақты котировка,build_swap_tx— TonConnect-ке дайын, қол қойылмаған транзакция.
Екеуі де Omniston протоколы арқылы жұмыс істейді, ол STON.fi мен DeDust өтімділігін бірден біріктіреді — котировка екі DEX бойынша есептеледі және сіз қолжетімді нұсқалардың ең жақсысын аласыз. Свап GRAM⇄жетон жұптарында жүреді. GRAM — бұл атауы өзгертілген Toncoin (2026 жылдың маусымында өзгертілді); желінің өзі бұрынғысынша TON деп аталады. Яғни котировкадағы «GRAM» — желінің нативті монетасы.
get_swap_quote: Omniston арқылы нақты котировка (STON.fi + DeDust)
Бірінші қадам — шын мәнінде қанша алатыныңызды білу. get_swap_quote нақты котировканы қайтарады: шығыста күтілетін соманы және бағамды. Ішкі жағында Omniston STON.fi мен DeDust-ты бір мезгілде сұрайтындықтан, агенттің пулдарды өзі аралап, қолмен салыстыруының қажеті жоқ — ол дайын біріктірілген нәтижені көреді.
100 USDT → GRAM свапына котировка ал.
get_swap_quote пайдалан. Күтілетін шығысты және бағамды көрсет.
Котировкалардың жиі қате есептелуіне себеп болатын маңызды нюанс: котировка «адами» сандармен емес, raw-бірліктермен (токеннің бөлінбейтін ең кіші үлестерімен) жұмыс істейді. Сондықтан жетон свапының сомасын есептеу алдында оның decimals мәнін білу керек.
get_jetton_info: свап алдында decimals не үшін керек (USDT = 6)
Міне, сваптарды бұзатын әдеттегі қате: агент «100 USDT»-ны алады да, сома өрісіне 100 қояды. Бірақ он-чейн жетонда «100» деген ұғым жоқ — тек raw-бірліктер бар. Бір токенде қанша raw-бірлік бар екенін decimals параметрі белгілейді, ал сома мөлшер × 10^decimals ретінде есептеледі.
- TON-дағы USDT-де
decimals = 6→ 100 USDT дегеніміз100 × 10^6 = 100 000 000raw-бірлік. - Жетондардың көпшілігінде
decimals = 9→ 100 токен дегеніміз100 000 000 000raw-бірлік.
Егер «100 USDT»-ға аңғал түрде тоғыз нөл тіркесеңіз (GRAM-дағыдай), ойлағаныңыздан 1000 есе үлкен сомаға свап сұраған боласыз. Мұнда үш реттік шамаға қателесіп алу оп-оңай. Сондықтан get_jetton_info — міндетті қадам: ол жетонның атын, символын, decimals мәнін және эмиссиясын қайтарады.
Свап алдында кіріс жетонның decimals мәнін get_jetton_info арқылы біл,
содан кейін ғана соманы raw-бірліктермен есепте.
Бұл тақырып ЖИ-агенттерді MCP арқылы TON-ға қосу туралы мақалада тереңірек қарастырылған.
Көмекші құралдар: parse_address және get_jetton_balance
Транзакцияны жинау алдында шақырып алған жөн болатын тағы екі көмекші құрал бар:
parse_address— мекенжайды офлайн тексеру және конвертациялау (EQ/UQ/raw). Бірдеңе жинай бастамай тұрып, жетон не алушы мекенжайындағы қате теруден сақтайтын арзан сақтандыру.get_jetton_balance— әмиянның негізгі мекенжайы бойынша жетон балансы. Баланс үшін жетон-әмиян мекенжайы құралдың ішінде он-чейн есептеледі, сондықтан жетон-әмиян мекенжайын емес, негізгі мекенжайды беру керек. Жиі кездесетін қате — жетон-әмиян мекенжайын ұсыну; оның қажеті жоқ, негізгісін беріңіз.
build_swap_tx: TonConnect үшін қол қойылмаған хабарлама
Котировка алынып, сомалар дұрыс raw-бірліктермен есептелгеннен кейін build_swap_tx транзакцияның өзін жинайды. Дәл осы жерде — кастодиалды еместіктің мәні: құрал ҚОЛ ҚОЙЫЛМАҒАН TonConnect-хабарламасын қайтарады. Бұл жіберілген мәміле емес, дайындама: контракт мекенжайы, сома, payload. Сервер сізге «конвертті» берді, бірақ оны желімдеген жоқ — мөрді (қолтаңбаны) сіздің әмияныңыз басады.
Одан әрі хабарлама TonConnect-үйлесімді әмиянға (Tonkeeper және басқалар) жіберіледі, пайдаланушы нақты неге қол қойып жатқанын көреді және растайды. Жеке кілт бірде-бір қадамда әмияннан шықпайды және TONNode серверіне түспейді.
Соңғы котировка бойынша свап транзакциясын build_swap_tx арқылы жина.
Қол қойылмаған TonConnect-хабарламасын қайтар — оған әмиянда өзім қол қоямын.
Толық ағын: котировкадан әмияндағы қол қоюға дейін
Жетон свапына арналған әдеттегі реттілік былай көрінеді:
parse_address— жетон мен алушының мекенжайын тексеру және қалыпқа келтіру (офлайн).get_jetton_info—decimalsмәнін (USDT үшін — 6, жиірек 9), атауын, символын білу.get_jetton_balance— қаражаттың жеткілікті екеніне көз жеткізу (негізгі мекенжай, жетон-әмиян емес).get_swap_quote— Omniston (STON.fi + DeDust) арқылы нақты котировка алу.build_swap_tx— қол қойылмаған TonConnect-транзакциясын жинау.- Пайдаланушының әмияны TonConnect арқылы қол қояды — қолтаңба пайдаланушы жағында.
Промпт деңгейінде агентке бұл табиғи естіледі:
50 GRAM-ды USDT-ге айырбастағым келеді.
Алдымен USDT жетонының мекенжайын parse_address арқылы тексер,
оның decimals мәнін get_jetton_info арқылы біл,
балансты get_jetton_balance арқылы тексер,
get_swap_quote котировкасын ал және build_swap_tx арқылы транзакция жина.
Транзакцияны жіберме — маған TonConnect үшін қол қойылмаған хабарламаны қайтар.
Агент мұны құрал шақыруларына өзі бөліп береді, ал шығыста сіз өз әмияныңызда қол қоятын дайындама аласыз. Назар аударыңыз: соңғы қадам — TONNode құралы емес. Қол қоюды әмиян орындайды, дәл осы жерден кастодиалды емес шекара өтеді. Толыққанды сауда агентін құрып жатсаңыз, TON-да сауда жасаудағы кідіріс пен латенттілік талдауын қараңыз — онда бұл ағын шешім қабылдау циклінің ішіне енгізілген. Ал TON шегінен тыс мәмілелер үшін TONNode-та атомарлы HTLC-эскроуға негізделген бес кастодиалды емес кроссчейн-құрал бар.
Свап құралдарын Claude, Cursor немесе ChatGPT-ге қалай қосу керек
Свап құралдары барлық тарифтерде, оның ішінде тегін Hobby-де де (60 сұрау/мин) қолжетімді — Hobby да hosted-кілт болып саналады. Сіз тек өткізу қабілеті үшін төлейсіз, ал 16 құралдан тұратын жиынтық барлық кілттерде бірдей.
Локальді әрі тегін — оқу үшін. @tonnode/mcp пакеті — ашық бастапқы кодты (MIT), TON-ның нативті ADNL протоколы бойынша HTTP-қабаттарсыз жұмыс істейді, бір командамен іске қосылады. Ашық конфиг оқуға арналған құралдардың толық жиынтығын береді:
{
"mcpServers": {
"ton": {
"command": "npx",
"args": ["-y", "@tonnode/mcp"]
}
}
}
Hosted-эндпоинт — свап және қалғаны үшін. Өз кілтіңіз (тегін Hobby жетеді), кепілдендірілген өткізу қабілеті және барлық 16 құрал, оның ішінде get_swap_quote пен build_swap_tx:
{
"mcpServers": {
"ton": {
"type": "http",
"url": "https://mcp.tonnode.io/mcp",
"headers": { "Authorization": "Bearer tn_live_…" }
}
}
}
Бұл конфиг клиентіңіздің MCP параметрлеріне қойылады — Claude Desktop, Cursor, ChatGPT/Codex немесе кез келген басқа MCP-үйлесімді агент. Hosted-кілт қосылғаннан кейін get_swap_quote және build_swap_tx құралдары агентте автоматты түрде пайда болады. tn_live_… кілті кіргеннен кейін бірден, картасыз беріледі.
Қысқаша қорытынды
- TONNode-тағы свап — екі құрал:
get_swap_quote(нақты котировка) жәнеbuild_swap_tx(TonConnect үшін қол қойылмаған транзакция). - Екеуі де Omniston арқылы жүреді — STON.fi мен DeDust өтімділігінің агрегаторы.
- Қолтаңба әрқашан пайдаланушыда. Сервер кілттерді сақтамайды және олармен қол қоймайды — кастодиалды ресми
@ton/mcp-тен айырмашылығы осында. - Жетонды свап жасар алдында
get_jetton_infoарқылыdecimalsмәнін біліңіз (USDT = 6, көпшілігі = 9), әйтпесе raw-бірліктердегі сома қате есептеледі. - Свап құралдары кез келген hosted-кілтте, оның ішінде тегін Hobby-де де жұмыс істейді.
Агент үшін TON-дағы кастодиалды емес свап — рөлдерді бөлу тәртібі: сервер есептейді және жинайды, әмиян қол қояды. TONNode-та бұл — Omniston үстіндегі дәл екі құрал, оған қоса дұрыс decimals үшін get_jetton_info — және бірде-бір жеке кілт пайдаланушыдан шықпайды.
Бастаудың ең оңай жолы — тегін кілт. Hobby-кілтті картасыз алыңыз да, свап құралдарын бірер минутта қосыңыз: tonnode.io/dashboard?plan=hobby. Алдымен құралдардың толық жиынтығын көргіңіз келсе — құралдар бетіне кіріңіз.
Агентіңізге TON-ға қолжетімділік беріңіз
16 MCP-құрал: оқу, кастодиалды емес сваптар, кроссчейн және әмияндар. Тегін тариф — 60 сұрау/мин, карта керек емес.