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.