Quiero autenticar al usuario por su billetera Metamask. Estoy usando el paquete web3 para interactuar con los bloques y firmar transacciones. Cuando intento obtener las cuentas de usuario, obtengo un resultado vacío:
const Web3 = require('web3'); const web3 = new Web3( new Web3.providers.HttpProvider('https://api.avax.network/ext/bc/C/rpc') ); const addresses = await web3.eth.getAccounts(); Supongo que necesito solicitar cuentas como esta await window.ethereum.request({ method: 'eth_requestAccounts'}); pero no existe la aplicación móvil de window .
Supongo que en un flujo normal, el usuario presiona el botón de autenticación y será redirigido a la billetera Metamask para autorizar la aplicación, ¿cómo puedo hacer esto?
Tiene razón, pero también necesita conectarse a MetaMask, no a su propio RPC. Aquí está su código fijo:
import detectEthereumProvider from '@metamask/detect-provider'; const web3 = await detectEthereumProvider(); // Use Metamask-injected web3 await web3.request({ method: 'eth_requestAccounts'}); const addresses = await web3.eth.getAccounts();Encontré una solución, no sé si es la mejor manera de hacerlo.
Para interactuar con los bloques y firmar transacciones, los usuarios autentican su billetera MetaMask a través del servicio WalletConnect .
Después de autenticar al usuario, puedo usar el conector para crear un proveedor para usarlo con ethers.js lib (Usando web3.js, la conexión con RPC falló, decidí usar ethers en su lugar):
const walletConnectProvider = new WalletConnectProvider({ rpc: { 43114: RPC }, chainId: 43114, connector: this.connector, qrcode: false }) let wp = await walletConnectProvider.enable(); if(wp){ this.provider = new providers.Web3Provider(walletConnectProvider); } const signer = this.provider.getSigner(); const contract = new Contract(GAMESESSION_ADDRESS, GameSession.abi, signer); ....Es un poco complicado pero WalletConnect funciona bien.