前沿
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 欢迎随时评论