我正在构建一个通过MetaMask连接到Rootstock测试网和主网的DApp。不幸的是,我在MetaMask的可用网络中没有找到Rootstock。在本教程中,我找到了如何手动将Rootstock网络添加到MetaMask的信息,但是我不想通过复制和粘贴这些信息到MetaMask中来打扰我的DApp用户。是否有一种方法可以编程地将这个网络配置添加到Metamask,然后在用户在这个地方的某个地方发起钱包连接后立即切换到该网络:
document
.getElementById('connect-to-metamask-button')
.addEventListener('click', async () => {
await window.ethereum.request({
method: 'eth_requestAccounts',
});
// switch to the Rootstock network
});
您可以使用wallet_addEthereumChain方法(EIP-3085)。
const error = await ethereum.request({
method: "wallet_addEthereumChain",
params: [{
chainId: "0x1E", // decimal 30
chainName: "RSK Mainnet",
nativeCurrency: {
decimals: 18,
symbol: "RBTC"
},
rpcUrls: [
"https://public-node.rsk.co"
],
blockExplorerUrls: [
"https://explorer.rsk.co/"
]
}]
});
除了彼得的回答;
总之,是的,你可以,用wallet_addEthereumChain
和wallet_switchEthereumChain
。下面的细节。在Metamask文档中描述了添加新网络。要将Rootstock网络添加到Metamask,首先创建网络配置对象:对于Rootstock Testnet:
const rskTestnet = {
chainName: 'Rootstock Testnet',
chainId: '0x1f', // hex 31
rpcUrls: ['https://public-node.testnet.rsk.co'],
blockExplorerUrls: ['https://explorer.testnet.rsk.co/'],
nativeCurrency: {
symbol: 'tRBTC',
decimals: 18,
},
};
对于砧木主网:
const rskMainnet = {
chainName: 'Rootstock Mainnet',
chainId: '0x1e', // hex 30
rpcUrls: ['https://public-node.rsk.co'],
blockExplorerUrls: ['https://explorer.rsk.co/'],
nativeCurrency: {
symbol: 'RBTC',
decimals: 18,
},
};
当用户启动DApp时,要做的第一件事就是尝试切换到目标网络使用wallet_switchEthereumChain
。假设您打算将此作为Rootstock测试网:
await window.ethereum.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: rskTestnet.chainId }],
});
但是,如果您尝试切换的网络尚未添加到Metamask(您的情况),它将抛出一个代码为4902
的错误,您需要在try-catch
块中捕获该错误。当这种情况发生时,您已经检测到用户没有在元掩码中配置此网络。如果是这种情况,使用wallet_addEthereumChain
添加它的配置。
await window.ethereum.request({
method: 'wallet_addEthereumChain',
params: [rskTestnet],
});
因此,switchToRskNetwork
函数,你可能想从你的DApp中想要的地方调用它,可以是这样的:
async function switchToNetwork(network) {
try {
// switching to a network
await window.ethereum.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: network.chainId }],
});
// catching the error 4902
} catch (error) {
if (error.code === 4902) {
// adding a new chain to Metamask
await window.ethereum.request({
method: 'wallet_addEthereumChain',
params: [network],
});
}
}
}
你应该调用这个函数您的DApp初始化(例如相邻eth_requestAccounts
在您的示例代码),或根据用户选择的网络。为此,传入网络配置对象:
await switchToNetwork(rskTestnet)