You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PytonConnect与Tonkeeper在TON网络发送其他币种?

在Tonkeeper中发送非TON币种的修改方案

核心逻辑说明

TON网络中非原生币种(Jetton)的转账和原生TON逻辑完全不同:

  • 原生TON是直接向目标地址发送普通消息;
  • Jetton转账需要调用接收方的Jetton专属钱包合约,执行transfer方法,而非直接转币到普通TON地址。

需要修改的关键部分

你当前的代码用get_comment_message构造的是原生TON转账消息,要替换成Jetton转账的消息结构,同时需要补充以下关键参数:

1. 必备参数准备

  • Jetton主合约地址:对应你要发送的币种(比如目标Web3币种在TON上的Jetton合约地址)
  • Jetton小数位数:不同币种小数位不同(比如大部分是6位,而非TON的9位)
  • 发送方的TON钱包地址:用于回调通知
  • 接收方的Jetton钱包地址:需要通过Jetton主合约查询获取(每个用户对应每个Jetton有唯一的Jetton钱包)

2. 代码修改步骤

第一步:获取接收方的Jetton钱包地址

先通过Jetton主合约的get_wallet_address方法,查询接收方普通TON地址对应的Jetton钱包地址:

from tonutils.client import TonCenterClient
from tonutils.jetton import JettonMaster

# 初始化Ton客户端
client = TonCenterClient(base_url="https://toncenter.com/api/v2/jsonRPC", api_key="YOUR_API_KEY")

async def get_jetton_wallet(jetton_master_addr: str, user_ton_addr: str) -> str:
    jetton_master = JettonMaster(client, jetton_master_addr)
    jetton_wallet_addr = await jetton_master.get_wallet_address(user_ton_addr)
    return jetton_wallet_addr.to_str()

第二步:构造Jetton转账消息

替换原来transaction['messages']里的get_comment_message,改为构造Jetton转账的内部消息:

from tonutils.cell import Cell
from tonutils.jetton import JettonTransfer

# 配置目标Jetton参数
JETTON_MASTER_ADDR = "你的Jetton主合约地址"
JETTON_DECIMALS = 6  # 根据实际币种调整小数位数
RECEIVER_TON_ADDR = os.getenv("TONKEEPER_WALLET", "")

# 获取接收方的Jetton钱包地址
receiver_jetton_wallet = await get_jetton_wallet(JETTON_MASTER_ADDR, RECEIVER_TON_ADDR)
# 获取发送方的TON钱包地址
sender_ton_addr = await connector.get_wallet_address()

# 构造Jetton转账的消息体
transfer_body = JettonTransfer(
    amount=int(int(price) * 10 ** JETTON_DECIMALS),  # 按Jetton小数位计算金额
    destination=RECEIVER_TON_ADDR,  # 接收方的普通TON地址
    response_address=sender_ton_addr,  # 交易回调地址(发送方TON地址)
    comment=comment(lang, sub_pay)  # 可选评论,自动编码为Cell结构
).to_cell()

# 组装最终交易结构
transaction = {
    'valid_until': int(time.time() + 3600),
    'messages': [
        {
            "address": receiver_jetton_wallet,
            "amount": "1000000",  # 固定支付0.001TON作为内部消息gas费
            "payload": transfer_body.to_b64()  # 消息体转base64编码
        }
    ]
}

第三步:调整其他逻辑

  • 移除原代码中get_comment_message的调用;
  • 确保price的计算对应Jetton的小数位数,避免金额错误;
  • 确认amount字段填的是gas费用(固定0.001TON),而非Jetton转账金额。

注意事项

  • 不同Jetton的小数位数可能不同,必须提前确认对应币种的参数;
  • 不能直接向普通TON地址发送Jetton,必须通过接收方的Jetton专属钱包合约中转;
  • 消息体payload必须是正确编码的Cell结构,否则Tonkeeper会拒绝交易。

内容的提问来源于stack exchange,提问作者D S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:44:52