跳到主要内容

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 主网10x1
Polygon1370x89
BSC560x38
Arbitrum One421610xa4b1
Optimism100xa
Base84530x2105

更多网络参数可参考 chainlist.org。在发起链切换或添加链请求前,请确认 RPC、区块浏览器和原生币信息来自可信来源。

ℹ️

如果希望直接使用连接弹窗,可以从 RainbowKitWeb3Modal 开始。