检测 MetaMask 注销(以太坊)

Posted

技术标签:

【中文标题】检测 MetaMask 注销(以太坊)【英文标题】:Detect MetaMask logout (Ethereum) 【发布时间】:2020-03-31 13:40:50 【问题描述】:

我查看了这里的文档https://metamask.github.io/metamask-docs/Main_Concepts/Getting_Started

但我不确定如何检测退出 MetaMask 的用户?

【问题讨论】:

【参考方案1】:

Metamask 文档建议您在更改帐户时刷新页面。

const setAccountListener = (provider) => 
    provider.on("accountsChanged", (_) => window.location.reload());
    provider.on("chainChanged", (_) => window.location.reload());
  ;

然后打电话给useEffect

useEffect(() => 
     // Load provider

      if (provider) 
        ....
        setAccountListener(provider);
        // add more logic
       else 
        
        console.error("Please, install Metamask.");
      
    ;

   
  , []);

【讨论】:

【参考方案2】:

来自 MetaMask Ethereum Provider API:

ethereum.on('accountsChanged', handler: (accounts: Array<string>) => void);

只要 eth_accounts RPC 方法的返回值发生更改,MetaMask 提供程序就会发出此事件。 eth_accounts 返回一个空数组或包含单个帐户地址。返回的地址(如果有)是允许调用者访问的最近使用的帐户的地址。调用者由其 URL 来源标识,这意味着具有相同来源的所有站点共享相同的权限。

【讨论】:

【参考方案3】:
window.ethereum.on('accountsChanged', (accounts) => 
    // If user has locked/logout from MetaMask, this resets the accounts array to empty
    if (!accounts.length) 
      // logic to handle what happens once MetaMask is locked
    
);

因此,使用上述您可以检测 MetaMask 的锁定/注销。

【讨论】:

【参考方案4】:
    window.ethereum.on('accountsChanged', function (accounts) 
      let acc = accounts[0]

如果他们退出,acc 将是未定义的。

【讨论】:

以上是关于检测 MetaMask 注销(以太坊)的主要内容,如果未能解决你的问题,请参考以下文章

检测到非以太坊浏览器。您应该考虑尝试 MetaMask

MetaMask 地址与以太坊格式地址

Metamask不能访问以太坊账户?隐私模式!

Metamask不能访问以太坊账户?隐私模式!

从 Metamask 获取所有以太坊账户

安装 metamask 和 coinbase chrome 扩展时如何获取 metamask 以太坊对象?