Hardhat Tasks


En este artículo, exploraremos una de las características más potentes de Hardhat: las tareas (tasks). Descubriremos cómo pueden mejorar nuestra productividad, permitiéndonos personalizar y automatizar nuestro flujo de trabajo. Desde la integración de herramientas de seguridad hasta la automatización de tareas comunes.

¿Qué son las ‘tasks’ de Hardhat?

Las tasks en Hardhat son scripts personalizables que permiten a los desarrolladores ejecutar acciones específicas dentro del proyecto. Estas acciones pueden abarcar desde tareas simples, como compilar contratos o ejecutar pruebas, hasta acciones más complejas, como desplegar contratos en redes de prueba o principales. Las tareas ofrecen una forma flexible y conveniente de automatizar procesos repetitivos y mejorar la eficiencia del flujo de trabajo de desarrollo de contratos inteligentes en Ethereum. Además, estas tienen acceso al Hardhat Runtime Environment (HRE).

Crear una task

Para conocer tener un listado de las tasks disponibles en nuestro proyecto, realizamos el comando npx hardhat.

Esta task la crearemos dentro de hardhat.config.ts. Se podría hacer un import para tenerlo en un archivo distinto.

task("saludar", "Imprime un mensaje de saludo en la consola")
 .setAction(async () => { console.log('Hola')});

Este ejemplo al realizar npx hardhat saludar pintará el mensaje.

Añadir parámetros

Si queremos añadir parámetros, simplemente tenemos que agregar la función addParam() o addOptionalParam() según queramos que sea obligatorio o no.

task("saludar", "Imprime un mensaje de saludo en la consola")
 .addParam('nombre', 'nombre que será saludado')
 .setAction(async (taskArgs) => { 
  console.log(`Hola ${taskArgs.nombre}`) 
 });

Si realizamos el comando npx hardhat saludar, dará error ya que hemos puesto como obligatorio el parámetro --nombre. Por lo que npx hardhat saludar --nombre AyudaBlockchain devolverá el mensaje “Hola AyudaBlockchain”.

Existe la posibilidad de que queramos que los parámetros sean posicionales, es decir, que no tengamos que añadir el -- a los parámetros.

Para eso se utilizan las funciones addPositionalParam() o addOptionalPositionalParam()

task("saludar", "Imprime un mensaje de saludo en la consola")
 .addPositionalParam('nombre', 'nombre que será saludado')
 .setAction(async (taskArgs) => {
  console.log(`Hola ${taskArgs.nombre}`)
 });

También podemos añadir valores por defecto o validar el tipo de dato que introduzca el usuario como parámetro.

const { types } = require("hardhat/config")
task("saludar", "Imprime un mensaje de saludo en la consola")
 .addParam(
  'nombre', 
  'nombre que será saludado'
  'AyudaBlockchain',
  types.string,
 )
 .setAction(async (taskArgs) => {
  console.log(`Hola ${taskArgs.nombre}`)
 });

Interactuar con la DLT

Sin embargo, hasta ahora, solo hemos añadido código JS sin interactuar con la DLT.

task("balance", "Prints an account's balance")
 .addParam("account", "The account's address")
 .setAction(async (taskArgs, hre) => {
  const ethers = hre.ethers
  const balance = await ethers.provider.getBalance(taskArgs.account);
  console.log(ethers.formatEther(balance), "ETH");
 });

Al tener acceso al HRE, podemos utilizar ethers y poder interactuar con la DLT.

Esto se vuelve más potente cuando utilizamos también las opciones globales que tienen las tasks como --network.

Con el comando npx hardhat balance --account 0x..... --network ropsten ,podríamos obtener el balance de cualquier cuenta que esté en la red.

Agrupar task

Puede que tengamos una task genérica que queremos luego especificar más. Para eso, Hardhat ha creado los scopes, que nos sirven para agrupar estas tasks.

const myScope = scope("my-scope", "Scope description");

myScope.task("my-task", "Do something")
  .setAction(async () => { ... });

myScope.task("my-other-task", "Do something else")
  .setAction(async () => { ... });

Para llamar a estas tareas sería npx hardhat my-scope my-task o npx hardhat my-scope my-other-task.