Usando Hardhat

Esta sección te guiará a través del despliegue de un contrato inteligente NFT (ERC-721) en la red de prueba Base utilizando Hardhat.

Hardhat es una herramienta para desarrolladores que ofrece una forma sencilla de desplegar, probar y depurar contratos inteligentes.

Objetivos Al final de esta guía deberías ser capaz de:

  • Configurar Hardhat para Base

  • Crear un contrato inteligente NFT para Base

  • Compilar un contrato inteligente para Base

  • Desplegar un contrato inteligente en Base

  • Interactuar con un contrato inteligente desplegado en Base

Prerrequisitos

Node v18+

Esta guía requiere que tengas instalada la versión 18+ de Node.

Descargar Node v18+ Si estás usando nvm para gestionar tus versiones de Node, simplemente puedes ejecutar nvm install 18.

Billetera Coinbase

Para desplegar un contrato inteligente, primero necesitarás una billetera web3. Puedes crear una billetera descargando la extensión de navegador de Coinbase Wallet.

Descargar Coinbase Wallet

Fondos en la billetera

Desplegar contratos en la cadena de bloques requiere una tarifa de gas. Por lo tanto, necesitarás financiar tu billetera con ETH para cubrir esas tarifas de gas.

Para esta guía, estarás desplegando un contrato en la red de prueba Base Goerli. Puedes financiar tu billetera con ETH de Base Goerli utilizando las siguientes opciones:

Grifo Coinbase | Base Goerli Grifos de Billetera Coinbase Para pasos más detallados sobre cómo financiar tu billetera con ETH de Base Goerli, consulta Grifos de Red (Network Faucets).

Creación de un proyecto

Antes de comenzar a desplegar smart contracts en Base, necesitas configurar tu entorno de desarrollo creando un proyecto en Node.js.

Para crear un nuevo proyecto en Node.js, ejecuta:

csharpCopy code
npm init --y

A continuación, necesitarás instalar Hardhat y crear un nuevo proyecto Hardhat.

Para instalar Hardhat, ejecuta:

cssCopy code
npm install --save-dev hardhat

Para crear un nuevo proyecto Hardhat, ejecuta:

Copy code
npx hardhat

Selecciona "Create a TypeScript project" y luego presiona enter para confirmar la raíz del proyecto.

Selecciona "y" para ambas opciones: agregar un .gitignore y cargar el proyecto de muestra. Tomará un momento completar el proceso de configuración del proyecto.

Configurando Hardhat con Base

Para desplegar smart contracts en la red Base, necesitarás configurar tu proyecto Hardhat y agregar la red Base.

Para configurar Hardhat para usar Base, añade Base como una red en el archivo hardhat.config.ts de tu proyecto:

typescriptCopy code
import { HardhatUserConfig } from 'hardhat/config';
import '@nomicfoundation/hardhat-toolbox';

require('dotenv').config();

const config: HardhatUserConfig = {
  solidity: {
    version: '0.8.17',
  },
  networks: {
    // para mainnet
    'base-mainnet': {
      url: '<https://mainnet.base.org>',
      accounts: [process.env.WALLET_KEY as string],
      gasPrice: 1000000000,
    },
    // para testnet
    'base-goerli': {
      url: '<https://goerli.base.org>',
      accounts: [process.env.WALLET_KEY as string],
      gasPrice: 1000000000,
    },
    // para entorno de desarrollo local
    'base-local': {
      url: '<http://localhost:8545>',
      accounts: [process.env.WALLET_KEY as string],
      gasPrice: 1000000000,
    },
  },
  defaultNetwork: 'hardhat',
};

export default config;

Instalar Hardhat toolbox

La configuración anterior utiliza el plugin @nomicfoundation/hardhat-toolbox para agrupar todos los paquetes y plugins de Hardhat comúnmente utilizados recomendados para comenzar a desarrollar con Hardhat.

Para instalar @nomicfoundation/hardhat-toolbox, ejecuta:

cssCopy code
npm install --save-dev @nomicfoundation/hardhat-toolbox

Cargando variables de entorno La configuración anterior también utiliza dotenv para cargar la variable de entorno WALLET_KEY desde un archivo .env a process.env.WALLET_KEY. Deberías usar un método similar para evitar codificar tus claves privadas dentro de tu código fuente.

Para instalar dotenv, ejecuta:

cssCopy code
npm install --save-dev dotenv

Una vez que hayas instalado dotenv, puedes crear un archivo .env con el siguiente contenido:

makefileCopy code
WALLET_KEY=<YOUR_PRIVATE_KEY>

Sustituyendo <YOUR_PRIVATE_KEY> con la clave privada de tu billetera.

PRECAUCIÓN

WALLET_KEY es la clave privada de la billetera que se utilizará al desplegar un contrato. Para obtener instrucciones sobre cómo obtener tu clave privada de Coinbase Wallet, visita la documentación de Coinbase Wallet. Es fundamental que NO la subas a un repositorio público.

Redes locales

Puedes ejecutar la red Base localmente y desplegar usando la misma. Si esto es lo que buscas hacer, consulta el repositorio que contiene las construcciones relevantes de Docker.

Tomará mucho tiempo para que tu nodo se sincronice con la red. Si obtienes errores que indican que el nonce ya ha sido utilizado al intentar desplegar, aún no estás sincronizado.

Para pruebas rápidas, como si deseas agregar pruebas unitarias al contrato NFT a continuación, es posible que desees dejar la defaultNetwork como 'hardhat'.

Compilando el smart contract

A continuación, se presenta un simple smart contract NFT (ERC-721) escrito en el lenguaje de programación Solidity:

solidityCopy code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract NFT is ERC721 {
    using Counters for Counters.Counter;
    Counters.Counter private currentTokenId;

    constructor() ERC721("NFT Name", "NFT") {}

    function mint(address recipient)
        public
        returns (uint256)
    {
        currentTokenId.increment();
        uint256 tokenId = currentTokenId.current();
        _safeMint(recipient, tokenId);
        return tokenId;
    }
}

El código Solidity anterior define un smart contract llamado NFT. El código utiliza la interfaz ERC721 proporcionada por la biblioteca OpenZeppelin Contracts para crear un smart contract NFT. OpenZeppelin permite a los desarrolladores aprovechar implementaciones de smart contracts probadas en batalla que se adhieren a los estándares ERC oficiales.

Para agregar la biblioteca OpenZeppelin Contracts a tu proyecto, ejecuta:

cssCopy code
npm install --save @openzeppelin/contracts

En tu proyecto, elimina el contrato contracts/Lock.sol que se generó con el proyecto y agrega el código anterior en un nuevo archivo llamado contracts/NFT.sol. (¡También puedes eliminar el archivo de prueba test/Lock.ts, pero deberías agregar tus propias pruebas lo antes posible!).

Para compilar el contrato usando Hardhat, ejecuta:

pythonCopy code
npx hardhat compile

Desplegando el smart contract

Una vez que tu contrato haya sido compilado con éxito, puedes desplegar el contrato en la red de prueba Base Goerli.

Para desplegar el contrato en la red de prueba Base Goerli, necesitarás modificar el scripts/deploy.ts en tu proyecto:

typescriptCopy code
import { ethers } from 'hardhat';

async function main() {
  const nft = await ethers.deployContract('NFT');

  await nft.waitForDeployment();

  console.log('NFT Contract Deployed at ' + nft.target);
}

// Recomendamos este patrón para poder usar async/await en todas partes
// y manejar adecuadamente los errores.
main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

También necesitarás ETH de testnet en tu billetera. Consulta los requisitos previos si aún no lo has hecho. De lo contrario, el intento de despliegue fallará.

Finalmente, ejecuta:

arduinoCopy code
npx hardhat run scripts/deploy.ts --network base-goerli

El contrato se desplegará en la red de prueba Base Goerli. Puedes ver el estado del despliegue y el contrato utilizando un explorador de bloques y buscando la dirección devuelta por tu script de despliegue. Si has desplegado una copia exacta del contrato NFT anterior, ya estará verificado y podrás leer y escribir en el contrato usando la interfaz web.

INFO

Si deseas desplegar en mainnet, modificarás el comando de la siguiente manera:

arduinoCopy code
npx hardhat run scripts/deploy.ts --network base-mainnet

Independientemente de la red a la que estés desplegando, si estás desplegando un contrato nuevo o modificado, primero deberás verificarlo.

Verificando el Smart Contract

Si deseas interactuar con tu contrato en el explorador de bloques, tú o alguien más, necesita verificarlo primero. El contrato anterior ya ha sido verificado, por lo que deberías poder ver tu versión en un explorador de bloques ya. Por el resto de esta guía, te guiaremos sobre cómo verificar tu contrato en la testnet Base Goerli.

En hardhat.config.ts, configura Base Goerli como una red personalizada. Agrega lo siguiente a tu HardhatUserConfig:

typescriptCopy code
Basescan
Blockscout
etherscan: {
   apiKey: {
    "base-goerli": "PLACEHOLDER_STRING"
   },
   customChains: [
     {
       network: "base-goerli",
       chainId: 84531,
       urls: {
        apiURL: "<https://api-goerli.basescan.org/api>",
        browserURL: "<https://goerli.basescan.org>"
       }
     }
   ]
 },

INFO

Al verificar un contrato con Basescan en testnet (Goerli), no se requiere una clave API. Puedes dejar el valor como PLACEHOLDER_STRING. En mainnet, puedes obtener tu clave API de Basescan desde aquí después de registrarte para obtener una cuenta.

Ahora, puedes verificar tu contrato. Toma la dirección desplegada y ejecuta:

cssCopy code
npx hardhat verify --network base-goerli <deployed address>

Deberías ver una salida similar a:

vbnetCopy code
Basescan
Blockscout
Nothing to compile
No need to generate any newer typings.
Successfully submitted source code for contract
contracts/NFT.sol:NFT at 0x6527E5052de5521fE370AE5ec0aFCC6cD5a221de
for verification on the block explorer. Waiting for verification result...

Successfully verified contract NFT on Etherscan.
<https://goerli.basescan.org/address/0x6527E5052de5521fE370AE5ec0aFCC6cD5a221de#code>

INFO

No puedes volver a verificar un contrato idéntico a uno que ya ha sido verificado. Si intentas hacerlo, como verificar el contrato anterior, obtendrás un error similar a:

scssCopy code
Error in plugin @nomiclabs/hardhat-etherscan: The API responded with an unexpected message.
Contract verification may have succeeded and should be checked manually.
Message: Already Verified

Busca tu contrato en Blockscout o Basescan para confirmar que se verificó.

Interactuando con el Smart Contract

Si verificaste en Basescan, puedes usar las pestañas Read Contract y Write Contract para interactuar con el contrato desplegado. Necesitarás conectar tu billetera primero, haciendo clic en el botón Conectar.

Last updated