En los últimos posts, hemos estado hablando sobre dos herramientas esenciales para el desarrollo de contratos inteligentes: Remix IDE y Truffle. En ellos, hemos explorado sus características y funcionalidades.
Sin embargo, en este post, hablaremos de otra herramienta muy útil para el desarrollo de contratos inteligentes: Hardhat. Esta herramienta ha ganado popularidad en los últimos años debido a su facilidad de uso y a la gran cantidad de características que ofrece.
En este post, exploraremos qué es Hardhat, cómo funciona y cuáles son algunas de sus características más útiles.
📰
He creado un template en Github para que podáis iniciar desde cero cualquier proyecto con toda la configuracion.
Hardhat
Hardhat es un marco de desarrollo para la EVM que se utiliza para compilar, probar y desplegar contratos inteligentes. Es una herramienta esencial para el desarrollo de aplicaciones descentralizadas, ya que permite a los desarrolladores automatizar el proceso de construcción y prueba de contratos inteligentes.
Con Hardhat, los desarrolladores podemos simular y ejecutar contratos inteligentes en una red local de Ethereum, lo cual nos permite identificar y corregir errores antes de desplegar el contrato en una red principal. Además, Hardhat proporciona una variedad de herramientas y plugins para facilitar el desarrollo de contratos inteligentes y mejorar la eficiencia del proceso de desarrollo.
Instalación
Para poder utilizar Hardhat vamos a necesitar tener instalado Node.js.
Crearemos una carpeta que será donde se encontrará el proyecto. Dentro de esa carpeta abre un terminal e inicializamos un proyecto en node:
Luego instalamos Hardhat como dependencia e inicializamos el proyecto para introducir la configuración que nosotros queramos:
npm init -y npm install --save-dev hardhat npx hardhat
Al ejecutar el último comando nos aparecerá en el terminal un wizard en donde podemos indicar la configuración que nosotros queremos tener en el proyecto. Para movernos por el wizard se usan las flechas de dirección ( 🔼 🔽 ) y el enter para seleccionar.
- Nos preguntará que tipo de proyecto vamos a realizar si JS, TS o vacío. Personalmente prefiero utilizar TypeScript ya que me ayuda a cometer menos errores al tipar las funciones.
- Cual va a ser la ruta raíz del proyecto.
- Queremos que nos cree un
.gitignore
ya con los elementos de Hardhat - Si queremos instalar además otra herramienta de ellos. Yo le he dado que sí, ya que añade herramientas como ethers.js para interactuar con los contratos, mocha y chai para testear los contratos, solcover para ver la cobertura de código que tenemos en nuestros tests, etc.

Tests
Los tests a no ser que se especifique lo contrario se realizarán en una red Ethereum local que desplegará el propio Hardhat cuando lancemos los tests, sin necesidad de configurar nada.
Para los tests como mencioné anteriormente utiliza Mocha y para interactuar con los contratos utiliza ethers.js.
Para crear un test es necesario crear un fichero dentro de la carpeta tests
.
Para ejecutar los tests nada más hay que ejecutar el comando:
npx hardhat test
Hay que tener en cuenta, que cuando ejecutamos los tests, los contratos serán compilados automáticamente si ha habido algún cambio.
Algo muy importante y a tener en cuenta cuando se realizan los tests es la cobertura de tests que tenemos. Es decir validar que los tests pasen por todas las líneas de código y que este funcione de la manera que nosotros esperamos que funcione. Hardhat como comenté previamente ya incluye solcover en la librería por lo que para realizar el test nada más tenemos que ejecutar:
npx hardhat coverage
Al ejecutar el comando se realizarán todos los tests que tengamos y luego mostrará los resultados de cobertura en una tabla indicando que lineas faltan por testear:

En otros lenguajes de programación tener un 80% de cobertura es suficiente ya que hay muchas partes que no se pueden testear o son muy complicadas, en cambio, en solidity es prácticamente imperativo tener un 100% de cobertura ya que una vez que nuestro contrato está desplegado en la blockchain es inmutable (a no ser que se realicen ciertos patrones de desarrollo).
📢
En el siguiente post explico como testear vuestros contratos.
Compilar
Los contratos se desarrollados dentro de la carpeta contracts
serán compilados cuando realicemos el comando:
npx hardhat compile
Este comando compilará todos los contratos que hayan sufrido algún cambio desde la última vez que se han compilado. Esto a veces produce algún problema por lo que para forzar la compilación de todos los contratos se ejecuta el comando:
npx hardhat compile --force
Independientemente del comando que ejecutes el comando creará dos carpetas, artifacts
y typechain-types
.
En la carpeta artifacts
podremos encontrar el ABI y el bytecode que luego ejecutará la EVM de los distintos contratos que tengamos desarrollados.
En la carpeta
tendremos los JS/TS que tendremos que importar para poder interactuar con el contrato. Esto nos facilita muchísimo la vida ya que incluye todos los métodos y atributos que hubiéramos escrito en el contrato.typechain-types
Desplegar
Ya hemos escrito un contrato, realizado los tests y ahora queremos desplegarlo en alguna red. Para ello primero tenemos que tener escrito un comando de despliegue. Normalmente se escriben dentro de la carpeta
.scripts
En este fichero añadiremos todos los pasos necesarios para desplegar el contrato, si fuera un contrato con un proxy, tenemos que ordenar los despliegues para luego asociar el contrato y demás. Este utilizará los signers que hubieras añadido en la configuración del
.hardhat.config
Para poder elegir la red en la que se ejecutará el script se le añade el parámetro --network
npx hardhat run <ruta del script> --network <network-name>
Si no añadimos el parámetro network
se ejecutará en la network que tengas por defecto seleccionado en el hardhat.config
.
Conclusión
En conclusión, Hardhat es una herramienta esencial para el desarrollo de contratos inteligentes, ya que nos permite compilar, probar y desplegar contratos inteligentes de manera automatizada. También es posible simular y ejecutar contratos inteligentes en una red local de Ethereum, lo que facilita la identificación y corrección de errores antes de desplegar el contrato en una red principal. Además proporciona una variedad de herramientas para la creación de tests, la cobertura de código y el uso de TS para añadir los tipados a los objetos. En definitiva, es una excelente opción para los desarrolladores que buscan una herramienta fácil de usar, con una amplia gama de características y funcionalidades para el desarrollo de contratos inteligentes.