window.ethereum.providers.find((provider) => provider.isMetamask) 返回未定义



如果安装了币库,小狐狸钱包将无法连接。

对于任何试图在其网站上执行交易的人来说,这是一个关键问题。要求用户删除他们的coinbase钱包是一个主要的威慑因素。

https://docs.metamask.io/guide/ethereum-provider.html#using-the-provider

小狐狸钱包网站上的此链接表明他们意识到了这个问题,但没有文档解决它。

这个问题不可能解决,因为像uniswap这样的网站允许用户选择哪个钱包。因此,我认为如果在文档中解决此问题会有所帮助。


这是连接函数的原始代码:

const connectMetamask = async (setAlert, setCurrentAccount) => {
const {ethereum} = window
const isInstalled = () => {
return Boolean(ethereum && ethereum.isMetaMask)
}
const isConnect = () => {
return Boolean(ethereum && ethereum.isConnected()) // <-- this is the issue
}
try {
if (!isInstalled()) {
console.log("No metamask!"); // <-- this works
setAlert(true);
return;
}
if (!isConnect()) {
console.log("Metamask not connected!");
setAlert(true)
return;
}
const chainId = await ethereum.request({ method: "eth_chainId" });
} catch (error) {
console.error(error);
}
};

此代码可以很好地连接小狐狸钱包,如果未安装硬币库钱包。

<小时 />

https://docs.cloud.coinbase.com/wallet-sdk/docs/injected-provider-guidance 此链接建议该怎么做 - 但它不起作用(至少对我来说)。

if (window.ethereum.providers?.length) {
window.ethereum.providers.forEach(async (p) => {
if (p.isMetaMask) provider = p;
});
}

window.ethereum.providers 返回一个数组,第一个元素是工作正常的 coinbase 钱包,第二个是包含小狐狸钱包的代理。无法访问此代理对象的属性。


根据我写的一些答案(与 coinbase 示例中的代码相同):

const metamaskProvider = await window.ethereum.providers.find((provider) => provider.isMetaMask);
ethereum.setSelectedProvider(metamaskProvider)

日志记录metamaskProvider返回未定义。 日志记录window.ethereum.providers返回一个数组:

0: v {_events: {…}, _eventsCount: 0, _maxListeners: undefined, _filterPolyfill: e.FilterPolyfill, _subscriptionManager: e.SubscriptionManager, …}
1: Proxy {_events: {…}, _eventsCount: 0, _maxListeners: 100, _log: u, _state: {…}, …}

1 是小狐狸钱包提供程序。 它包含以下属性:

1: Proxy
[[Handler]]: Object 
deleteProperty: ()=>!0
[[Prototype]]: Object
[[Target]]: l
chainId: "0x1"
enable: ƒ ()
isMetaMask: true
....

metamaskProvider返回undefined.如何访问isMetaMask属性,并将所选提供程序设置为metamaskProvider

我认为如果您安装了多个钱包,您将不会window.ethereum.providers定义。我目前只有"小狐狸钱包",我收到此错误:Uncaught TypeError: Cannot read properties of undefined (reading 'find')

if (typeof window.ethereum !== "undefined") {
let provider = window.ethereum;
// if multiple wallet are installed
if (window.ethereum.providers?.length) {
window.ethereum.providers.find(async (p) => {
if (p.isMetaMask) provider = p;
});
}

你也不应该解构

const metamaskProvider = await window.ethereum.providers.find((provider) => provider.isMetaMask);

我的修复:

const connectMetamask = async (setAlert, setCurrentAccount) => {
let { ethereum } = window;
try {
if (!ethereum) {
console.log("No metamask!");
setAlert(true);
return;
}
try{
if (!ethereum.isConnected()) {
console.log("Metamask not connected!");
setAlert(true)
return;
}
} catch (error){
console.error(error)
try{
console.log('providers',window.ethereum.providers);
console.log('ethVar',ethereum)
ethereum = await window.ethereum.providers.find(
(provider) => provider.isMetaMask );
console.log('ethVarAfterFind', ethereum)
} catch (error){
console.error(error)
}
}
const chainId = await ethereum.request({ method: "eth_chainId" });
.....
} catch (error) {
console.log('error:')
console.error(error);
}
};
export default connectMetamask;

基本上只是:

ethereum = await window.ethereum.providers.find( (provider) => provider.isMetaMask );
const chainId = await ethereum.request({ method: "eth_chainId" });

老实说,我很确定我已经尝试过了,但它不起作用,但是,现在它¯_(ツ)_/¯

相关内容

最新更新