¿Cuál es la mejor práctica para ver si metamask u otras billeteras web3 están desbloqueadas con ethers.js ?
Actualmente uso esto:
window.ethereum._metamask.isUnlocked()Pero la documentación de metamask lo informa como métodos experimentales y me gustaría encontrar algo mejor.
Lo que encontró mi experimentación fue que listAccounts devuelve una matriz de cadenas y si la billetera no está desbloqueada, devuelve una matriz vacía.
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; }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)); }