交易项
这里演示如何通过 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")}`;