eth_chainId
读取钱包当前选中的 EVM 网络 Chain ID。DApp 可以用它判断用户是否处在目标网络,并避免把签名或交易发到错误链上。
入参
无
结果
string - Chain ID,格式为带 0x 前缀的十六进制字符串。
示范
const chainId = await window.$ukey.ethereum.request({
method: "eth_chainId",
});
console.log("链 ID(十六进制):", chainId);
console.log("链 ID(十进制):", parseInt(chainId, 16));
识别当前网络
const CHAIN_IDS = {
ETHEREUM: "0x1",
POLYGON: "0x89",
BSC: "0x38",
ARBITRUM: "0xa4b1",
OPTIMISM: "0xa",
BASE: "0x2105",
};
async function readCurrentChain() {
const chainId = await window.$ukey.ethereum.request({
method: "eth_chainId",
});
switch (chainId) {
case CHAIN_IDS.ETHEREUM:
console.log("当前已经连到以太坊主网");
break;
case CHAIN_IDS.POLYGON:
console.log("当前已经连到 Polygon");
break;
default:
console.log("链连接已建立:", parseInt(chainId, 16));
}
return chainId;
}
要求用户切换到指定网络
async function ensureChainSelected(requiredChainId) {
const chainId = await window.$ukey.ethereum.request({
method: "eth_chainId",
});
if (chainId !== requiredChainId) {
try {
await window.$ukey.ethereum.request({
method: "wallet_switchEthereumChain",
requestParams: [{ chainId: requiredChainId }],
});
} catch (error) {
if (error.code === 4902) {
throw new Error("请先将此网络添加到钱包");
}
throw error;
}
}
}
// 调用方式如下
await ensureChainSelected("0x1"); // 这里要求切到以太坊主网
常用链 ID
| 网络 | 十六进制 | 十进制 |
|---|---|---|
| Ethereum 主网 | 0x1 | 1 |
| Goerli 测试网 | 0x5 | 5 |
| Sepolia 测试网 | 0xaa36a7 | 11155111 |
| Polygon | 0x89 | 137 |
| BSC | 0x38 | 56 |
| Arbitrum One | 0xa4b1 | 42161 |
| Optimism | 0xa | 10 |
| Base | 0x2105 | 8453 |
| Avalanche C-Chain | 0xa86a | 43114 |
错误码
| 错误码 | 消息 | 说明 |
|---|---|---|
| -32603 | 内部处理异常 | Provider 内部异常 |
说明
- 返回值始终是带
0x前缀的十六进制字符串。 - 监听
chainChanged可以感知用户在钱包侧切换网络。 - 收到网络切换事件后,建议重新读取链相关配置、合约地址和余额信息。
- 遵循 EIP-695 规范。
window.$ukey.ethereum.on("chainChanged", (chainId) => {
console.log("网络现已切换到:", chainId);
// 建议操作:刷新页面
window.location.reload();
});