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);
// 网络变化后通常建议整页重载
});
Window 事件(TronLink 兼容)
// 监听 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);
}
}
从 TronLink 迁移
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 都会挂出这个对象