Swap token TON không lưu ký: AI agent không cần giữ khóa
Cách để AI agent swap token trên TON theo hướng không lưu ký: get_swap_quote và build_swap_tx qua Omniston, server không bao giờ ký hay giữ khóa riêng.
Ai giữ khóa — câu hỏi cốt lõi khi AI agent swap token trên TON không lưu ký
Hãy tưởng tượng: bạn giao cho một AI agent nhiệm vụ theo dõi giá, và khi USDT giảm thì mua thêm bằng GRAM. Agent đánh giá thị trường, tìm được thời điểm, chuẩn bị giao dịch — và đúng lúc đó nổi lên một câu hỏi mà người ta thường chỉ nhớ ra khi đã quá muộn. Để agent thực sự thực hiện được swap, ai đó phải ký giao dịch bằng khóa riêng. Vậy ai giữ khóa đó?
Nếu câu trả lời là "chính dịch vụ mà agent đang chạy qua" — nghĩa là bạn đã trao cho code của người khác quyền định đoạt tiền của mình. Một cú prompt injection, một lần rò rỉ log — và agent sẽ ký thứ không giống điều bạn nghĩ. Vấn đề ở đây không nằm ở chuyện "gọi DEX thế nào", mà ở chỗ làm sao để agent dựng được giao dịch, còn chữ ký thì vẫn thuộc về ví của con người và chỉ ví mà thôi. Dưới đây là cách swap token TON bằng AI agent theo mô hình không lưu ký.
Hai phần của một swap: tính toán thì an toàn, ký thì không
Một swap trên DEX gồm hai phần khác nhau về bản chất. Phần thứ nhất mang tính tính toán và an toàn: tra tỷ giá, tính slippage, dựng phần thân giao dịch. Phần thứ hai thì không thể đảo ngược và nguy hiểm: ký phần thân đó bằng khóa riêng rồi gửi lên mạng. Từ đây sinh ra ngã rẽ:
- Mô hình lưu ký (custodial). Agent (hoặc server đứng sau nó) giữ khóa và tự ký. Tiện — agent hành động tự chủ. Nhưng khóa ký lại nằm ngay cạnh LLM, mà LLM là thứ phi tất định, có thể bị thuyết phục bằng văn bản không đáng tin (mô tả jetton, phản hồi từ các tool khác, tin nhắn người dùng). Chẳng hạn,
@ton/mcpchính thức của TON Foundation được dựng đúng theo kiểu này: đó là một ví-agent có operator key, tự ký lệnh chuyển tiền và swap (sơ đồ split-key: operator key nằm ở agent, owner key nằm ở người dùng). Mô hình này chạy được và có những điểm mạnh riêng — chi tiêu tự chủ, làm việc với NFT và DNS, vị thế của gói chính thức. Nhưng bản chất vẫn là niềm tin đặt vào người giữ khóa. - Mô hình không lưu ký (non-custodial). Server chỉ chuẩn bị giao dịch và trả nó về ở trạng thái chưa ký. Chữ ký do ví của người dùng đặt qua TonConnect. Server không bao giờ nhìn thấy và không lưu khóa riêng.
Với một trading agent chạy suốt ngày đêm, mô hình thứ hai gỡ bỏ rủi ro lớn nhất: kể cả khi hạ tầng bị xâm nhập, thứ tệ nhất có thể "hỏng" cũng chỉ là một bản nháp chưa ký, mà dù sao bạn vẫn phải xác nhận thủ công hoặc theo chính sách của ví mình. Ngã rẽ này được mổ xẻ kỹ hơn trong bài so sánh thẳng thắn giữa TONNode và @ton/mcp chính thức.
Mô hình không lưu ký của TONNode: server trả về giao dịch chưa ký
TONNode là một MCP server hosted dành cho TON. MCP (Model Context Protocol) là chuẩn để các AI agent (Claude, Cursor, ChatGPT/Codex và mọi MCP client) gọi tool bên ngoài. TONNode cung cấp cho agent 16 tool để làm việc với TON, và các tool swap, cross-chain và tạo ví đều hoàn toàn không lưu ký.
Bất biến then chốt: server KHÔNG BAO GIỜ ký và không bao giờ giữ tiền hay khóa riêng. Với swap, điều đó nghĩa là tool cuối cùng không trả về một "giao dịch đã thực hiện", mà là một message TonConnect chưa ký — một object đã sẵn sàng để ký. Server về mặt vật lý không thể đổi người nhận tiền sau khi ký, đơn giản vì nó không hề nắm chữ ký.
Swap trong TONNode gồm đúng hai tool:
get_swap_quote— báo giá chắc chắn (firm quote),build_swap_tx— giao dịch chưa ký, sẵn sàng cho TonConnect.
Cả hai đều chạy qua giao thức Omniston — giao thức này gộp thanh khoản của STON.fi và DeDust cùng lúc, báo giá được tính trên cả hai DEX và bạn nhận về mức tốt nhất trong số đó. Swap diễn ra theo cặp GRAM⇄jetton. GRAM là Toncoin sau khi đổi tên (đổi tên vào tháng 6/2026); bản thân mạng lưới vẫn gọi là TON. Nghĩa là "GRAM" trong báo giá chính là đồng coin gốc của mạng.
get_swap_quote: báo giá chắc chắn qua Omniston (STON.fi + DeDust)
Bước đầu tiên là biết bạn thực sự nhận được bao nhiêu. get_swap_quote trả về một báo giá chắc chắn: số lượng đầu ra dự kiến và tỷ giá. Vì bên dưới Omniston hỏi STON.fi và DeDust cùng lúc, agent không phải tự đi vòng qua từng pool rồi so sánh thủ công — nó thấy ngay kết quả đã được tổng hợp.
Lấy báo giá cho swap 100 USDT → GRAM.
Dùng get_swap_quote. Cho tôi xem số lượng đầu ra dự kiến và tỷ giá.
Một chi tiết quan trọng khiến báo giá hay bị tính sai: báo giá luôn tính theo đơn vị raw (phần nhỏ nhất không chia được của token), chứ không phải những con số "dành cho người đọc". Vì vậy, trước khi tính số lượng swap của một jetton, bạn cần biết decimals của nó.
get_jetton_info: vì sao cần decimals trước khi swap (USDT = 6)
Đây là lỗi kinh điển làm hỏng các giao dịch swap: agent lấy "100 USDT" rồi nhét 100 vào trường số lượng. Nhưng on-chain thì jetton không có khái niệm "100" — chỉ có đơn vị raw. Một token gồm bao nhiêu đơn vị raw là do tham số decimals quy định, và số lượng được tính theo công thức số token × 10^decimals.
- USDT trên TON có
decimals = 6→ 100 USDT là100 × 10^6 = 100 000 000đơn vị raw. - Đa số jetton có
decimals = 9→ 100 token là100 000 000 000đơn vị raw.
Nếu ngây thơ gán cho "100 USDT" chín số 0 (như với GRAM), bạn sẽ yêu cầu swap một khoản lớn gấp 1000 lần dự định. Lệch ba bậc độ lớn ở đây rất dễ xảy ra. Vì thế get_jetton_info là bước bắt buộc: nó trả về tên, ký hiệu, decimals và tổng cung của jetton.
Trước khi swap, hãy lấy decimals của jetton đầu vào qua get_jetton_info,
rồi mới tính số lượng theo đơn vị raw.
Chủ đề này được đào sâu hơn trong bài kết nối AI agent với TON qua MCP.
Hai tool phụ trợ: parse_address và get_jetton_balance
Có hai tool phụ trợ rất đáng gọi trước khi dựng giao dịch:
parse_address— kiểm tra và chuyển đổi địa chỉ offline (EQ/UQ/raw). Một lớp bảo hiểm rẻ tiền chống lỗi gõ nhầm địa chỉ jetton hoặc địa chỉ người nhận, trước khi dựng bất cứ thứ gì.get_jetton_balance— số dư jetton theo địa chỉ ví chính. Địa chỉ jetton wallet dùng để lấy số dư được tính on-chain ngay bên trong tool, nên thứ bạn cần truyền vào là địa chỉ ví chính, không phải địa chỉ jetton wallet. Lỗi thường gặp là đưa vào địa chỉ jetton wallet; không cần, cứ đưa địa chỉ chính.
build_swap_tx: message chưa ký cho TonConnect
Khi đã có báo giá và số lượng được tính đúng theo đơn vị raw, build_swap_tx sẽ dựng chính giao dịch đó. Và đây là phần cốt lõi của tính không lưu ký: tool trả về một message TonConnect CHƯA KÝ. Đó không phải là giao dịch đã gửi đi, mà là một bản nháp: địa chỉ contract, số lượng, payload. Server đưa cho bạn "phong bì" nhưng không niêm phong nó — con dấu (chữ ký) là do ví của bạn đóng.
Sau đó message được chuyển sang ví tương thích TonConnect (Tonkeeper và các ví khác), người dùng nhìn thấy chính xác thứ mình đang ký rồi xác nhận. Khóa riêng không rời khỏi ví ở bất kỳ bước nào và không bao giờ lọt lên server TONNode.
Dựng giao dịch swap theo báo giá mới nhất bằng build_swap_tx.
Trả về message TonConnect chưa ký — tôi sẽ tự ký nó trong ví.
Luồng đầy đủ: từ báo giá đến chữ ký trong ví
Trình tự điển hình cho một swap jetton trông như sau:
parse_address— kiểm tra và chuẩn hóa địa chỉ jetton cùng địa chỉ người nhận (offline).get_jetton_info— lấydecimals(USDT là 6, thường gặp là 9), tên, ký hiệu.get_jetton_balance— chắc chắn rằng số dư đủ dùng (địa chỉ ví chính, không phải jetton wallet).get_swap_quote— lấy báo giá chắc chắn qua Omniston (STON.fi + DeDust).build_swap_tx— dựng giao dịch TonConnect chưa ký.- Ví của người dùng ký qua TonConnect — chữ ký nằm ở phía người dùng.
Ở cấp độ prompt, câu lệnh gửi cho agent nghe rất tự nhiên:
Tôi muốn đổi 50 GRAM lấy USDT.
Trước tiên kiểm tra địa chỉ jetton USDT qua parse_address,
lấy decimals của nó qua get_jetton_info,
kiểm tra số dư qua get_jetton_balance,
lấy báo giá get_swap_quote rồi dựng giao dịch build_swap_tx.
Đừng gửi giao dịch — trả về cho tôi message chưa ký cho TonConnect.
Agent sẽ tự tách việc đó thành các lời gọi tool, còn đầu ra là bản nháp mà bạn ký trong ví của mình. Để ý một chút: bước cuối cùng không phải là tool của TONNode. Chữ ký do ví thực hiện, và chính tại đó là ranh giới không lưu ký. Nếu bạn đang xây một trading agent thực thụ, hãy xem phân tích độ trễ (latency) khi giao dịch trên TON — ở đó luồng này được nhúng vào vòng lặp ra quyết định. Còn với các giao dịch nằm ngoài TON, TONNode có năm tool cross-chain không lưu ký dựa trên escrow HTLC nguyên tử.
Cách gắn tool swap vào Claude, Cursor hay ChatGPT
Các tool swap có mặt trên mọi gói, kể cả gói Hobby miễn phí (60 request/phút) — Hobby là một hosted key. Bạn chỉ trả tiền cho thông lượng, còn bộ 16 tool thì giống hệt nhau trên mọi key.
Chạy local và miễn phí — dành cho các tác vụ đọc. Gói @tonnode/mcp là open source (MIT), chạy trên giao thức ADNL gốc của TON mà không cần lớp HTTP trung gian, khởi động bằng đúng một câu lệnh. Config công khai cho bạn trọn bộ tool đọc:
{
"mcpServers": {
"ton": {
"command": "npx",
"args": ["-y", "@tonnode/mcp"]
}
}
}
Hosted endpoint — cho swap và mọi thứ còn lại. Key riêng của bạn (Hobby miễn phí là đủ), thông lượng được đảm bảo và toàn bộ 16 tool, bao gồm get_swap_quote và build_swap_tx:
{
"mcpServers": {
"ton": {
"type": "http",
"url": "https://mcp.tonnode.io/mcp",
"headers": { "Authorization": "Bearer tn_live_…" }
}
}
}
Bạn đặt config này vào phần cài đặt MCP của client mình đang dùng — Claude Desktop, Cursor, ChatGPT/Codex hay bất kỳ agent tương thích MCP nào khác. Sau khi kết nối hosted key, các tool get_swap_quote và build_swap_tx sẽ tự động xuất hiện với agent. Key tn_live_… được cấp ngay sau khi đăng nhập, không cần thẻ.
Tóm lại những điều chính
- Swap trong TONNode là hai tool:
get_swap_quote(báo giá chắc chắn) vàbuild_swap_tx(giao dịch chưa ký cho TonConnect). - Cả hai đều đi qua Omniston — bộ gộp thanh khoản của STON.fi và DeDust.
- Chữ ký luôn thuộc về người dùng. Server không lưu khóa riêng và không ký thay bạn — khác với
@ton/mcpchính thức vốn theo mô hình lưu ký. - Trước khi swap jetton, hãy lấy
decimalsquaget_jetton_info(USDT = 6, đa số = 9), nếu không thì số lượng theo đơn vị raw sẽ bị tính sai. - Các tool swap hoạt động trên mọi hosted key, kể cả Hobby miễn phí.
Swap không lưu ký trên TON cho agent là kỷ luật phân chia vai trò: server tính toán và dựng, ví thì ký. Trong TONNode đó đúng là hai tool đặt trên Omniston, cộng thêm get_jetton_info để có decimals chính xác — và không một khóa riêng nào rời khỏi tay người dùng.
Cách dễ nhất là bắt đầu với key miễn phí. Nhận key Hobby không cần thẻ và gắn các tool swap chỉ trong vài phút: tonnode.io/dashboard?plan=hobby. Muốn xem trước toàn bộ danh sách tool — hãy ghé trang tool.
Cho agent của bạn quyền truy cập TON
16 công cụ MCP: đọc, swap phi lưu ký, cross-chain và ví. Gói miễn phí — 60 req/phút, không cần thẻ.