跳到主要内容

快上手

这里演示如何检测 UKey Wallet TRON Provider、请求账户授权,并通过 TronWeb 读取余额、发送 TRX 或调用 TRC20 合约。

ℹ️

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);

事件流

看账户变化

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);
}
});

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 都会挂出这个对象