el modulo de web3 da error con webpack >= 5, para usarlo como en la clase se puede importar de la siguiente forma
import Web3 from "web3/dist/web3.min";
Introducción al desarrollo con Web3.js
Desarrolla el frontend para el marketplace de PlatziPunks
PlatziPunks: presentación
Qué es Web3.js
Nodos de Ethereum y métodos JSON RPC
¿Qué es Web3?
Setup y stack que utilizaremos
Actualización sobre testnet en Ethereum
Desarrollo frontend con Web3.js
Administrando la conexión a Metamask
Configurando Web3-React
¿Qué es un ABI?
Instanciando el contrato de PlatziPunks
Previsualizando tu PlatziPunk
Habilitando el mint de PlatziPunks
Creando la galería de PlatziPunks
Detalle de PlatziPunk
Transfiriendo un PlatziPunk a otra cuenta
Filtrando los PlatziPunks por cuenta
Despliegue de la aplicación
InterPlanetary File System
Usando IPFS e Infura para subir contenido no censurable
Despliegue de PlatziPunks en IPFS
Usando Fleek para desplegar tu proyecto
Ethereum Name Service
Registrando nuestro ENS y vinculando a PlatziPunks
Sigue desarrollando
Recapitulación de lo aprendido con el proyecto PlatziPunks
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Convierte tus certificados en títulos universitarios en USA
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Aportes 17
Preguntas 4
el modulo de web3 da error con webpack >= 5, para usarlo como en la clase se puede importar de la siguiente forma
import Web3 from "web3/dist/web3.min";
Para los que tiene problemas utilizando Web3 con la versión 5 de create-react-app tienen que hacer lo siguiente:
yarn add --dev react-app-rewired crypto-browserify stream-browserify assert stream-http https-browserify os-browserify url buffer
const webpack = require('webpack');
module.exports = function override(config) {
const fallback = config.resolve.fallback || {};
Object.assign(fallback, {
"crypto": require.resolve("crypto-browserify"),
"stream": require.resolve("stream-browserify"),
"assert": require.resolve("assert"),
"http": require.resolve("stream-http"),
"https": require.resolve("https-browserify"),
"os": require.resolve("os-browserify"),
"url": require.resolve("url")
})
config.resolve.fallback = fallback;
config.plugins = (config.plugins || []).concat([
new webpack.ProvidePlugin({
process: 'process/browser',
Buffer: ['buffer', 'Buffer']
})
]);
config.ignoreWarnings = [/Failed to parse source map/];
return config;
}
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
},
Link a la solución original: https://github.com/ChainSafe/web3.js#web3-and-create-react-app
Si te da el error web3.eth.requestAccounts is not a function, se soluciona instalando el siguiente paquete:
yarn add @types/web3 -D
Trabajando desde la consola del navegador, con el siguiente comando te conectas a Metamask
window.ethereum
Con el siguiente puedes ver tu número de cuenta.
window.ethereum.request({ method: 'eth_requestAccounts' }).then(console.log)
Usando async
y await
:
useEffect(() => {
if (window.ethereum) {
// (async () => {
// const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' })
// console.log(`Accounts: ${accounts}`)
// })()
(async () => {
const web3 = new Web3(window.ethereum);
const accounts = await web3.eth.requestAccounts();
console.log(`Accounts: ${accounts}`)
})()
}
}, [])
Mi cabeza:
el EIP-1193 es la api para lograr coherencia entre clientes y aplicaciones.
Una sugerencia, si quieren hacer el curso tal como el instructor, sin errores de versiones ni cambios en el código, les sugiero que copien el package.json del instructor en la zona de recursos y hagan lo siguiente:
Borren la carpeta node_modules.
Después el comando yarn install.
Y en seguida yarn start .
Listo todo funcionará tal cual el curso.
Fuente de la información aqui.
Asi tiene que quedar el main
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { ChakraProvider } from "@chakra-ui/react";
ReactDOM.createRoot(document.getElementById("root")).render(
<BrowserRouter>
<ChakraProvider>
<Routes>
<Route path="/" element={<App />} />
</Routes>
</ChakraProvider>
</BrowserRouter>
);
(30/08/22) Hola compañeros, estoy haciendo el curso con las siguientes versiones de dependencias
"dependencies": {
"@chakra-ui/react": "2.3.1",
"@emotion/react": "11.10.0",
"@emotion/styled": "11.10.0",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "13.3.0",
"@testing-library/user-event": "13.5.0",
"@web3-react/core": "6.1.9",
"framer-motion": "7.2.1",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1",
"web-vitals": "2.1.4",
"web3-react": "5.0.5"
},
Sera por alguna actualización pero como estaban colocando a traves de la instancia de web3 , requestAccounts me aparece como que el método no existe.
Al final por internet encontre que se tenia que hacer de la siguiente manera:
const web3 = new Web3(window.ethereum);
const requestAccounts = async () => {
try {
// Request account access if needed
await window.ethereum.enable();
// Acccounts now exposed
web3.eth.getAccounts(console.log);
} catch (error) {
// User denied account access...
}
}
useEffect(() => {
requestAccounts();
}, []);
No necesariamente con el useEffect pero los métodos serian esos.
si estan usando vite y les arroja un problema, aqui les dejo una solucion:
agregan esto en el index.html , hasta arriba en el body
<script>
window.global = window;
</script>
<script type="module">
import process from 'process';
import { Buffer } from 'buffer';
import EventEmitter from 'events';
window.Buffer = Buffer;
window.process = process;
window.EventEmitter = EventEmitter;
</script>
y el archivo vite.config.js debe quedar asi
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
process: "process/browser",
stream: "stream-browserify",
zlib: "browserify-zlib",
util: 'util'
}
},
})
y listo, con eso deberia de funcionar
Solucion completa para poder usar web3 con create-react-app
https://github.com/ChainSafe/web3.js#web3-and-create-react-app
Creo que la tarea falla porque el curso tiene mas de dos años y al actualizar las versiones de react cambian algunas cosas, les dejo aquí un Código básico para conectar la billetera de Metamask (espero sea de utilidad):
import { useEffect, useState } from ‘react’;
import { Route, Routes } from ‘react-router-dom’;
import Home from ‘./views/home/index.js’;
import ‘./App.css’;
import Web3 from ‘web3’;
function App() {
const [userAddress, setUserAddress] = useState(’’);
useEffect(() => {
connectWeb3();
}, []);
const connectWeb3 = async () => {
if (window.ethereum) {
// Crear una instancia de Web3 usando MetaMask
const web3 = new Web3(window.ethereum);
try {
// Solicitar acceso a la cuenta del usuario en MetaMask
await window.ethereum.enable();
// Obtener la dirección de la cuenta del usuario
const accounts = await web3.eth.getAccounts();
const address = accounts[0];
// Actualizar el estado con la dirección de la cuenta del usuario
setUserAddress(address);
} catch (error) {
console.error('Error al conectar con MetaMask:', error);
}
} else {
console.error('MetaMask no está instalado');
}
};
const renderMessage = () => {
if (!window.ethereum) {
// Mensaje si MetaMask no está instalado
return (
<div>
<p>
MetaMask no está instalado en tu navegador. Por favor,
<a
href="https://metamask.io/“
target=”_blank"
rel=“noopener noreferrer”
>
instálalo aquí
</a>
.
</p>
</div>
);
} else if (userAddress) {
// Mensaje si MetaMask está instalado y conectado
const truncatedAddress = userAddress.substring(0, 8);
return (
<div>
<p>
Conectado con MetaMask. Dirección de la cuenta: {truncatedAddress}…
</p>
</div>
);
} else {
// Mensaje mientras se está conectando con MetaMask
return (
<div>
<p>Conectando con MetaMask…</p>
</div>
);
}
};
return (
<>
{renderMessage()}
<Routes>
<Route path="/" element={<Home />} />
</Routes>
</>
);
}
export default App;
Siempre vuelvo a esta clase cuando necesito integrar Metamask a un proyecto 😃
Una clase clara y didáctica.
Genio total Ernesto!
Los proveedores se rigen por el stándar eip 1193.
Injected provider, se inyecta dentro del navegador.
El eip 1102, los usuarios primero deben aceptar el conectar su aplicación con el proveedor.
El stándar eip 2255 ( Wallet permissions system ) reemplaza al standar 1102.
Si están usando typescript, window.ethereum les va a dar error, pueden usar lo siguiente:
Web3.givenProvider
Te devuelve null si no existe un proveedor y en el caso de existir sirve para hacer:
const web3 = new Web3(Web3.givenProvider);
El injected provider me recuerda a context api de react
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?