如何通过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
相关产品推荐
相关产品推荐

