Ethereum / EVM
UKey Wallet 会在浏览器中提供符合 EIP-1193 的 Ethereum Provider。DApp 可以通过这个 Provider 完成账户连接、链切换、消息签名和交易发送。Ethereum、Polygon、BSC、Arbitrum、Optimism、Base 等 EVM 兼容链都使用同一套调用方式。
Provider 检测
EIP-6963(优先采用)
在多钱包并存的浏览器环境中,建议优先使用 EIP-6963 发现钱包。这样用户可以明确选择 UKey Wallet,也能避免 window.ethereum 被其他钱包覆盖造成误连。
const providers: any[] = [];
window.addEventListener("eip6963:announceProvider", (e: any) => {
providers.push(e.detail);
});
window.dispatchEvent(new Event("eip6963:requestProvider"));
// 通过 rdns 把 UKey Wallet 找出来
const ukey = providers.find((p) => p.info.rdns === "so.ukey.app.wallet");
const accounts = await ukey.provider.request({
method: "eth_requestAccounts",
});
直接访问(回退方案)
如果项目暂未接入 EIP-6963,可以读取 UKey Wallet 的专用注入对象作为回退方案:
const provider = window.$ukey?.ethereum;
if (!provider) throw new Error("未检测到 UKey Wallet");
const accounts = await provider.request({ method: "eth_requestAccounts" });
displayed_sidebar: softwareSidebar
常用事件
Provider 会在账户、网络和连接状态变化时触发事件。应用应根据事件刷新本地状态,不要依赖轮询。
// 监听账户切换
provider.on("accountsChanged", (accounts) => {
console.log("当前账户信息:", accounts[0]);
});
// 监听网络切换
provider.on("chainChanged", (chainId) => {
console.log("当前链:", chainId);
window.location.reload(); // 这是更稳妥的做法
});
// 已经建立连接
provider.on("connect", (info) => {
console.log("链连接已建立:", info.chainId);
});
错误码
| 错误码 | 说明 | 建议处理 |
|---|---|---|
| 4001 | 用户取消了操作 | 保持页面可继续操作,并允许用户重试 |
| 4902 | 未知链 | 提示用户通过 wallet_addEthereumChain 补充网络 |
| -32602 | 参数无效 | 核验十六进制前缀、地址和参数步骤 |
| -32603 | 内部处理异常 | 核对当前网络、请求格式和钱包状态 |
Chain ID
| 网络 | 链 ID | 十六进制 |
|---|---|---|
| Ethereum 主网 | 1 | 0x1 |
| Polygon | 137 | 0x89 |
| BSC | 56 | 0x38 |
| Arbitrum One | 42161 | 0xa4b1 |
| Optimism | 10 | 0xa |
| Base | 8453 | 0x2105 |
更多网络参数可参考 chainlist.org。在发起链切换或添加链请求前,请确认 RPC、区块浏览器和原生币信息来自可信来源。
ℹ️
如果希望直接使用连接弹窗,可以从 RainbowKit 或 Web3Modal 开始。