Inicio / Blockchain / Blockchain: De Cero a Desarrollador / Desarrollo con Hardhat

Desarrollo con Hardhat

Setup, compilación, scripts de deploy, console y plugins.

Intermedio
🔒 Solo lectura
📖

Estás en modo lectura

Puedes leer toda la lección, pero para marcar progreso, hacer ejercicios y ganar XP necesitas una cuenta Pro.

Desbloquear por $9/mes

Desarrollo con Hardhat

Hardhat es el entorno de desarrollo más popular para Ethereum. Proporciona compilación, testing, debugging y deploy de smart contracts con una experiencia de desarrollo moderna y profesional.

Instalación y Setup

# Crear un nuevo proyecto
mkdir mi-proyecto-blockchain
cd mi-proyecto-blockchain
npm init -y

# Instalar Hardhat
npm install --save-dev hardhat

# Inicializar proyecto Hardhat
npx hardhat init
# Seleccionar: "Create a JavaScript project"

# Instalar dependencias comunes
npm install --save-dev @nomicfoundation/hardhat-toolbox
npm install @openzeppelin/contracts

Estructura del proyecto

mi-proyecto/
├── contracts/          ← Smart contracts (.sol)
│   └── Lock.sol
├── scripts/            ← Scripts de deploy
│   └── deploy.js
├── test/               ← Tests
│   └── Lock.js
├── hardhat.config.js   ← Configuración
├── package.json
└── node_modules/

Configuración

// hardhat.config.js
require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

module.exports = {
    solidity: {
        version: "0.8.20",
        settings: {
            optimizer: {
                enabled: true,
                runs: 200
            }
        }
    },
    networks: {
        hardhat: {
            // Red local por defecto
        },
        sepolia: {
            url: process.env.SEPOLIA_RPC_URL,
            accounts: [process.env.PRIVATE_KEY]
        },
        mainnet: {
            url: process.env.MAINNET_RPC_URL,
            accounts: [process.env.PRIVATE_KEY]
        }
    },
    etherscan: {
        apiKey: process.env.ETHERSCAN_API_KEY
    }
};

Compilación

# Compilar todos los contratos
npx hardhat compile

# Salida:
# Compiled 1 Solidity file successfully
# Artifacts generados en artifacts/

Los artifacts contienen el ABI y bytecode necesarios para interactuar con el contrato:

artifacts/
└── contracts/
    └── MiContrato.sol/
        ├── MiContrato.json       ← ABI + bytecode
        └── MiContrato.dbg.json   ← Debug info

Scripts de Deploy

// scripts/deploy.js
const { ethers } = require("hardhat");

async function main() {
    const [deployer] = await ethers.getSigners();
    console.log("Deploying con cuenta:", deployer.address);

    const balance = await ethers.provider.getBalance(deployer.address);
    console.log("Balance:", ethers.formatEther(balance), "ETH");

    // Deploy del contrato
    const MiToken = await ethers.getContractFactory("MiToken");
    const token = await MiToken.deploy("Mi Token", "MTK", 1000000);
    await token.waitForDeployment();

    const address = await token.getAddress();
    console.log("Token desplegado en:", address);

    // Verificar en Etherscan (si no es localhost)
    if (network.name !== "hardhat" && network.name !== "localhost") {
        console.log("Esperando confirmaciones...");
        await token.deploymentTransaction().wait(6);

        await hre.run("verify:verify", {
            address: address,
            constructorArguments: ["Mi Token", "MTK", 1000000],
        });
    }
}

main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
});
# Deploy en red local
npx hardhat run scripts/deploy.js

# Deploy en Sepolia testnet
npx hardhat run scripts/deploy.js --network sepolia

Hardhat Console

# Abrir consola interactiva
npx hardhat console --network localhost

# En la consola:
> const Token = await ethers.getContractFactory("MiToken")
> const token = await Token.deploy("Test", "TST", 1000)
> await token.waitForDeployment()
> await token.name()
# 'Test'
> await token.balanceOf(deployer.address)
# 1000000000000000000000n

Hardhat Network

Hardhat incluye una blockchain local para desarrollo:

# Iniciar nodo local (mantener corriendo)
npx hardhat node

# Output:
# Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/
# Account #0: 0xf39F... (10000 ETH)
# Private Key: 0xac0974...
# Account #1: 0x7099... (10000 ETH)
# ...20 cuentas pre-funded

Forking de Mainnet

Puedes testear contra el estado real de mainnet:

// hardhat.config.js
module.exports = {
    networks: {
        hardhat: {
            forking: {
                url: "https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY",
                blockNumber: 19000000 // Pin para reproducibilidad
            }
        }
    }
};

Tasks Personalizados

// hardhat.config.js
task("balance", "Muestra el balance de una cuenta")
    .addParam("account", "La dirección")
    .setAction(async (taskArgs) => {
        const balance = await ethers.provider.getBalance(taskArgs.account);
        console.log(ethers.formatEther(balance), "ETH");
    });

// Uso: npx hardhat balance --account 0xf39F...

Plugins Populares

Plugin                              Uso
────────────────────────────────────────────────────
hardhat-toolbox                     Suite completa (ethers, chai, etc.)
hardhat-gas-reporter                Reporte de costos de gas
hardhat-contract-sizer              Tamaño de contratos
solidity-coverage                   Cobertura de tests
hardhat-deploy                      Deploy avanzado con tags
hardhat-etherscan                   Verificación en Etherscan

Gas Reporter

// hardhat.config.js
module.exports = {
    gasReporter: {
        enabled: true,
        currency: "USD",
        coinmarketcap: process.env.COINMARKETCAP_API_KEY
    }
};
·····················|·····················|·············
|  Contract          |  Method             |  Gas        |
·····················|·····················|·············
|  MiToken           |  transfer           |  51,234     |
|  MiToken           |  approve            |  46,098     |
|  MiToken           |  mint               |  68,432     |
|  MiNFT             |  mint               |  146,789    |
·····················|·····················|·············

Resumen

Hardhat es el estándar de la industria para desarrollo en Ethereum. Proporciona compilación, red local, scripts de deploy, consola interactiva, forking de mainnet y un ecosistema de plugins robusto. La combinación de Hardhat con OpenZeppelin ofrece un flujo de desarrollo profesional y seguro para smart contracts.

🔒

Ejercicio práctico disponible

Script de deploy con Hardhat

Desbloquear ejercicios
// Script de deploy con Hardhat
// Desbloquea Pro para acceder a este ejercicio
// y ganar +50 XP al completarlo

function ejemplo() {
    // Tu código aquí...
}

¿Te gustó esta lección?

Con Pro puedes marcar progreso, hacer ejercicios, tomar quizzes, ganar XP y obtener tu constancia.

Ver planes desde $9/mes