Búsqueda de sitios web

javascript - ¿Cómo verificar si una cartera web3 está desbloqueada?


¿Cómo puedo comprobar si Metamask u otras billeteras web3 están desbloqueadas con ethers.js?

Actualmente uso esto:

window.ethereum._metamask.isUnlocked()

Pero se informa como métodos experimentales según la documentación de Metamask.

Respuesta #1

Lo que encontró mi experimentación fue que listAccounts devuelve un arreglo de cadenas y si la cartera no está desbloqueada, devuelve un arreglo vacío.

Para MetaMask específicamente, sé que no puedes tener una cuenta sin tener una dirección.

Por lo tanto, la función que se me ocurrió fue:

async function isUnlocked() {
    const provider = new ethers.providers.Web3Provider(window.ethereum);

    let unlocked;

    try {
        const accounts = await provider.listAccounts();

        unlocked = accounts.length > 0;
    } catch (e) {
        unlocked = false;
    }

    return unlocked;
}

Respuesta #2

Esa es mi propia resolución si alguien la necesita :

isUnlocked$ = new BehaviorSubject<boolean>(false);

async isWalletUnlocked() {
      const web3Provider = new ethers.providers.Web3Provider(window.ethereum, 'any');
      const signer = await this.web3Provider.getSigner();
    
      signer
      .getAddress()
      .then((address: string) => {
        this.isUnlocked$.next(true);
      })
      .catch((err) => this.isUnlocked$.next(false));
}