跳到主要内容

交易项

这里演示如何通过 UKey Wallet TON Connect Provider 发送 TON、批量消息、带 payload 的合约调用以及带 StateInit 的部署请求。


发交易

通过 send 方法调用 sendTransaction 可以发起 TON 转账:

const callResult = await provider.send({
method: "sendTransaction",
id: Date.now().toString(),
requestParams: [
JSON.stringify({
valid_until: Math.floor(Date.now() / 1000) + 600, // 10 分钟有效期
messages: [
{
address: "0:8a1d3c5e7f90b2d4c6e8f00123456789abcdeffedcba9876543210fedcba1234", // 接收地址(原始格式)
amount: "1000000000", // 金额参考值(单位 nanotons,1 TON = 10^9 nanotons)
},
],
}),
],
});

if ("callResult" in callResult) {
console.log("返回的交易 BOC:", callResult.callResult);
} else {
console.error("交易提交未成功:", callResult.error.message);
}

发送多条消息

TON 单笔交易最多包含 4 条消息:

const callResult = await provider.send({
method: "sendTransaction",
id: Date.now().toString(),
requestParams: [
JSON.stringify({
valid_until: Math.floor(Date.now() / 1000) + 600,
messages: [
{
address: "0:8a1d3c5e7f90b2d4c6e8f00123456789abcdeffedcba9876543210fedcba1234",
amount: "500000000", // half TON
},
{
address: "0:8e4d3c2b1a098765f4e3d2c1b0a9876543210fedcba9876543210fedcba98765",
amount: "300000000", // 0.3 TON amount
},
],
}),
],
});

发送带 Payload 的交易

合约交互通常需要在消息中携带 Base64 BOC 格式的 payload:

import { beginCell } from "@ton/core";

// 构建评论 cell
const comment = beginCell()
.storeUint(0, 32) // comment opcode
.storeStringTail("来自 dApp 的问候!")
.endCell();

const callResult = await provider.send({
method: "sendTransaction",
id: Date.now().toString(),
requestParams: [
JSON.stringify({
valid_until: Math.floor(Date.now() / 1000) + 600,
messages: [
{
address: "0:8a1d3c5e7f90b2d4c6e8f00123456789abcdeffedcba9876543210fedcba1234",
amount: "100000000",
payload: comment.toBoc().toString("base64"),
},
],
}),
],
});

发送带 StateInit 的交易

部署合约或初始化账户状态时,可在消息中携带 stateInit

const callResult = await provider.send({
method: "sendTransaction",
id: Date.now().toString(),
requestParams: [
JSON.stringify({
valid_until: Math.floor(Date.now() / 1000) + 600,
messages: [
{
address: "0:9d8c7b6a5948372615049382716f5e4d3c2b1a09876543210fedcba987654321",
amount: "50000000",
stateInit: stateInitBoc.toString("base64"), // Base64 编码的 StateInit 数据
},
],
}),
],
});

使用 SDK 发送交易

import { useTonConnectUI } from "@tonconnect/ui-react";

function TonTransferButton() {
const [tonConnectUI] = useTonConnectUI();

const handleSend = async () => {
const callResult = await tonConnectUI.sendTransaction({
validUntil: Math.floor(Date.now() / 1000) + 600,
messages: [
{
address: "EQA...",
amount: "1000000000",
},
],
});
console.log("序列化后的 BOC:", callResult.boc);
};

return <button onClick={handleSend}>发送 1 TON</button>;
}

地址样式

TON 地址有原始格式和用户友好格式。Provider 请求中常使用原始格式,面向用户展示时通常使用友好格式:

import { Address } from "@ton/core";

// 原始格式(provider 内部使用)
const raw = "0:8a1d3c5e7f90b2d4c6e8f00123456789abcdeffedcba9876543210fedcba1234";

// 友好格式(可 bounce)
const friendly = Address.parse(raw).toString();
// 例如 'EQBx7qMv2Lk9sNp4Rz5hTc8Yw1Df6JaQ3'

// 不可 bounce 格式
const nonBounceable = Address.parse(raw).toString({ bounceable: false });
// 例如:'UQBm4xPv8nLs2kTr6qWc9Yd1fGh5Jz0Ra'

// 把友好格式转回原始格式
const addr = Address.parse("EQBx7qMv2Lk9sNp4Rz5hTc8Yw1Df6JaQ3");
const rawAddress = `${addr.workChain}:${addr.hash.toString("hex")}`;