跳到主要内容

TRON

UKey Wallet TRON Provider 用于在 Web 应用中连接 TRON 账户、使用 TronWeb、签名交易和签名消息。页面中可通过 window.$ukey.tron 访问,连接后也可使用 window.tronWeb

ℹ️

UKey Wallet TRON Provider 兼容 TronLink 接口,并提供 TronWeb 与 SunWeb 相关实例。


快捷链接


找 Provider

// UKey Wallet 会同时注入 provider 与 TronWeb 实例
const provider = window.$ukey?.tron;

// 连接完成后 TronWeb 会挂到全局
const tronWeb = window.tronWeb;

if (!provider) {
throw new Error("未检测到 UKey Wallet TRON provider");
}

// 确认是否兼容 TronLink
console.log("isTronLink:", provider.isTronLink); // 布尔参考片段:true

快上手

请求授权

// 请求建立连接
const callResult = await provider.request({
method: "tron_requestAccounts",
});

if (callResult.code === 200) {
console.log("已连接!");
const address = tronWeb.defaultAddress.base58;
console.log("解析出的地址:", address);
} else {
console.log("连接请求被拒绝:", callResult.message);
}

检查连接状态

// 确认 TronWeb 是否已就绪
if (tronWeb && tronWeb.ready) {
console.log("连接结果:", tronWeb.defaultAddress.base58);
} else {
console.log("当前尚未建立连接");
}

使用 TronWeb

连接成功后,可以通过全局 tronWeb 实例访问 TRON 网络:

获取余额

const balance = await tronWeb.trx.getBalance(tronWeb.defaultAddress.base58);
console.log("当前余额:", tronWeb.fromSun(balance), "TRX");

发送 TRX

const tx = await tronWeb.trx.sendTransaction(
"TR7x6W5v4U3t2S1r0Q9p8NmLyKjHgFeDcB",
tronWeb.toSun(10), // ten TRX
);

console.log("构造出的交易:", tx.txid);

发送 TRC20 代币

const contractAddress = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
const contract = await tronWeb.contract().at(contractAddress);

// 读取精度
const decimals = await contract.decimals().call();

// 发起代币转账
const amount = 100 * 10 ** decimals; // 100 枚代币
const tx = await contract.transfer("TR7x6W5v4U3t2S1r0Q9p8NmLyKjHgFeDcB", amount).send();

console.log("构造出的交易:", tx);

交易项

签交易

下面这段参考代码只负责签名,广播由应用通过 TronWeb 完成:

// 组装交易
const tx = await tronWeb.transactionBuilder.sendTrx(
"TR7x6W5v4U3t2S1r0Q9p8NmLyKjHgFeDcB",
tronWeb.toSun(10),
tronWeb.defaultAddress.base58,
);

// 通过 provider 完成签名
const signedTx = await provider.sign(tx);

console.log("签名后的交易数据:", signedTx);

// 手动执行广播
const callResult = await tronWeb.trx.sendRawTransaction(signedTx);

智能合约交互

// 调用合约里的方法
const contract = await tronWeb.contract().at(contractAddress);

// 调用只读的 view 函数
const callResult = await contract.someViewFunction().call();

// 写操作(需要签名)
const tx = await contract.someWriteFunction(param1, param2).send({
feeLimit: 100_000_000, // fee cap: 100 TRX
callValue: 0,
});

触发智能合约

const tx = await tronWeb.transactionBuilder.triggerSmartContract(
contractAddress,
"transfer(address,uint256)",
{ feeLimit: 100_000_000 },
[
{ type: "address", value: recipientAddress },
{ type: "uint256", value: amount },
],
tronWeb.defaultAddress.base58,
);

const signedTx = await provider.sign(tx.transaction);
const callResult = await tronWeb.trx.sendRawTransaction(signedTx);

消息签署

签名消息 V1(十六进制)

V1 接收十六进制编码后的消息:

const message = tronWeb.toHex("TRON sample message");
const signature = await provider.signMessage(message);

console.log("生成的签名:", signature);

签名消息 V2(UTF-8)

V2 可直接签名 UTF-8 文本,更适合展示给用户:

const message = "TRON sample message";
const signature = await provider.signMessageV2(message);

console.log("生成的签名:", signature);

验证签名

const message = "TRON sample message";
const signature = await provider.signMessageV2(message);

// 通过 TronWeb 验证
const address = await tronWeb.trx.verifyMessageV2(message, signature);
console.log("恢复出的签名者:", address);

事件流

看账户变化

provider.on("accountsChanged", (accounts) => {
if (accounts[0]) {
console.log("当前账户已切换为:", accounts[0]);
} else {
console.log("连接已关闭");
}
});

监听网络变化

provider.on("chainChanged", (chainId) => {
console.log("网络已切换为:", chainId);
// 网络变化后通常建议整页重载
});
// 监听 TronLink 初始化事件
window.addEventListener("tronLink#initialized", () => {
console.log("TronLink 初始化已完成");
});

// 监听消息事件
window.addEventListener("message", (event) => {
if (event.data.isTronLink) {
const { action, data } = event.data.message;
console.log("TronLink 回调事件:", action, data);
}
});

API说明

Provider 方法

方法说明
request({ action, params })通用 JSON-RPC 请求
sign(transaction)签名交易
signMessage(hexMessage)签名十六进制消息(V1)
signMessageV2(message)签名 UTF-8 消息(V2)

Request 方法

方法说明
tron_requestAccounts请求连接
tron_getProviderState获取 provider 状态
tron_signTransaction签名交易
signMessageV1签名消息 V1
signMessageV2签名消息 V2

响应码

错误码说明
200调用成功
4000用户取消了操作
4001请求仍在排队

事件流

事件说明
accountsChanged当前账户已切换
chainChanged当前网络已更新
connect连接会话已建立
disconnect连接会话已关闭

使用 SunWeb

SunWeb 可用于 DAppChain(侧链)相关操作:

const sunWeb = window.sunWeb;

// 从主链到侧链
await sunWeb.depositTrx(amount, depositFee, feeLimit);

// 从侧链到主链
await sunWeb.withdrawTrx(amount, withdrawFee, feeLimit);

处理异常

try {
const callResult = await provider.request({
method: "tron_requestAccounts",
});

if (callResult.code !== 200) {
throw new Error(callResult.message);
}
} catch (error) {
if (error.code === 4001) {
console.log("用户已拒绝本次请求");
} else {
console.error("执行报错:", error.message);
}
}

UKey Wallet 与 TronLink 接口兼容。迁移时建议优先读取 UKey Wallet,未安装时再回退到 TronLink:

// 旧写法(仅 TronLink)
const legacyTronWeb = window.tronWeb;

// 调整后(优先走 UKey Wallet,TronLink 作为回退)
const provider = window.$ukey?.tron || window.tronLink;
const activeTronWeb = window.tronWeb; // UKey Wallet 和 TronLink 都会挂出这个对象