跳到主要内容

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 主网0x11
Goerli 测试网0x55
Sepolia 测试网0xaa36a711155111
Polygon0x89137
BSC0x3856
Arbitrum One0xa4b142161
Optimism0xa10
Base0x21058453
Avalanche C-Chain0xa86a43114

错误码

错误码消息说明
-32603内部处理异常Provider 内部异常

说明

  • 返回值始终是带 0x 前缀的十六进制字符串。
  • 监听 chainChanged 可以感知用户在钱包侧切换网络。
  • 收到网络切换事件后,建议重新读取链相关配置、合约地址和余额信息。
  • 遵循 EIP-695 规范。
window.$ukey.ethereum.on("chainChanged", (chainId) => {
console.log("网络现已切换到:", chainId);
// 建议操作:刷新页面
window.location.reload();
});