Ton生态如何实现转账jetton 代币

529 阅读2分钟

前沿

Ton 生态持续大火,ton团队大概在175人左右,目前也算起步,跟圈内龙头公链比起来,生态建设还差的很远,ton团队也在各种白嫖开发者,文档建设太差,但是却不影响ton的热度,据说一个ton的合约开发者,日薪接近10000u。

什么是ton 生态: ton 开发者 文档

ton 一条公链,是基于telegram 的生态,用户可以在上面发布智能合约,类似于erc20 代币,这里叫做 jetton代币

我们可以基于ton生态和tg官方的sdk 实现一个mini app, 这样我们就可以申请grants了

概要

ton的官方jetton代币withdraw, deposit,文档抽象,关键地方都模糊不清,作者当时阅他们文档读差点废了2台mac,先贴出官方代码 

这里的文档大概的阐述了如果转账一个jetton代币,但是并没表示出入参的具体含义, 及如果获得

准备

钱包:Tonspace, TonKeeper 任意一个 

Tonspace, tg 小程序, 官方主推

TonKeeper, 可以切换testnet

yarn add @ton/ton @tonconnect/ui-react

实现

这里我们使用的是官方标准的合约用来转账,并不是合约开发者修改过的合约,如果是合约开发者提供的合约转账,那么需要定义好参数和方法,以及对应的合约abi,才能调通

我们这用一个hooks 实现 useTransfer, 

通过判断地址,这里如果没有链接钱包会先连接钱包,一般钱包是指ton space 或者tonkeeper, tonkeeper 可以切换到testnet

import { beginCell, TonClient4, toNano, Address, JettonMaster } from '@ton/ton'
import { useTonAddress, useTonConnectUI, useTonConnectModal } from "@tonconnect/ui-react";

export default function useTransfer() {  
 const tonAddress = useTonAddress()  
 const [tonConnectUI] = useTonConnectUI();  
 const { open } = useTonConnectModal();  
 const TON_CLIENT = new TonClient4({    
   endpoint: "https://mainnet-v4.tonhubapi.com",   
   timeout: 30000, 
 })  
 const transfer = async (amount) => {   
    if (!tonAddress) {     
       open();      
       return    
    }   
    console.log("Deposit:", amount)   
    try {      
       const jettonMasterAddress = Address.parse(config.tpxContract);  // tpx 合约的代币地址      
       const destinationAddress = Address.parse(config.depositReceive); // 接收地址 
       const userAddress = Address.parse(tonAddress)     
       const jettonMaster = TON_CLIENT.open(JettonMaster.create(jettonMasterAddress))   
       const jettonWallet = await jettonMaster.getWalletAddress(userAddress);     
      // console.log("jettonWallet", jettonWallet.toString())  //基于用户地址生成的该合约代币地址   
      const body = beginCell()        
                    .storeUint(0xf8a7ea5, 32)    
                    .storeUint(0, 64)   
、                  .storeCoins(toNano(amount)) // amount    
                    .storeAddress(destinationAddress) // to address       
                    .storeAddress(destinationAddress) // response address    
                    .storeMaybeRef(null)      
                      .storeCoins(toNano("0.000001"))      
                      .storeMaybeRef(null)     
                       .endCell();    
    
      const myTransaction = {       
               validUntil: Math.floor(Date.now() / 1000) + 360,     
               messages: [          
                        {      
                          address: jettonWallet.toString(), // sender jetton wallet       
                          amount: toNano("0.1").toString(), // for gas fees, excess will be returned          
                          payload: body.toBoc().toString("base64") // payload with jetton transfer and comment body        
                          }       
                     ]}     

      await tonConnectUI.sendTransaction(myTransaction);   
       Notify.show({      
                type: "success",     
                duration: 5000,        
                message: "Request added to the queue for execution, please wait!",      
        });    
    } catch (error) {     
         console.log(error)    
          Notify.show({  type: "danger",  message: error.message,   duration: 5000      });   
 }  }  return transfer;}

使用

const onTransfer = useCallback(async () => {  
  setIsLoading.on();   
  await transfer(amount);  
  setIsLoading.off();  }, 
[amount, transfer]);

TonSpace


TonKeeper, 记得点击sign in with tonkeeper 唤起钱包

That's all 欢迎随时评论