# 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.](https://hardhat.org/)

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+**&#x20;

Esta guía requiere que tengas instalada la versión [18+ de Node.](https://nodejs.org/en/download/)

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

**Billetera Coinbase**&#x20;

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](https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad?hl=en)

**Fondos en la billetera**

&#x20;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](https://www.coinbase.com/faucets/base-ethereum-goerli-faucet) [Grifos de Billetera Coinbase](https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad) Para pasos más detallados sobre cómo financiar tu billetera con ETH de Base Goerli, consulta [Grifos de Red (Network Faucets).](https://docs.base.org/tools/network-faucets)

**Creación de un proyecto**&#x20;

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:

```csharp
csharpCopy code
npm init --y

```

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

Para instalar Hardhat, ejecuta:

```css
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: agrega`r un .gitignore` y cargar el proyecto de muestra. Tomará un momento completar el proceso de configuración del proyecto.

**Configurando Hardhat con Base**&#x20;

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:

```tsx
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**

&#x20;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:

```css
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:

```css
cssCopy code
npm install --save-dev dotenv

```

Una vez que hayas instalado [dotenv](https://www.npmjs.com/package/dotenv), puedes crear un archivo .env con el siguiente contenido:

```makefile
makefileCopy code
WALLET_KEY=<YOUR_PRIVATE_KEY>

```

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

**PRECAUCIÓN**&#x20;

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](https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings#show-private-key). Es fundamental que NO la subas a un repositorio público.

**Redes locales**&#x20;

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.](https://github.com/base-org/node)

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**

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

```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](https://docs.openzeppelin.com/contracts/4.x/) 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:

```css
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:

```python
pythonCopy code
npx hardhat compile

```

**Desplegando el smart contract**&#x20;

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:

```tsx
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](https://docs.base.org/guides/deploy-smart-contracts#prerequisites) si aún no lo has hecho. De lo contrario, el intento de despliegue fallará.

Finalmente, ejecuta:

```arduino
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**&#x20;

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

```arduino
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**

&#x20;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:

```tsx
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**&#x20;

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:

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

```

Deberías ver una salida similar a:

```vbnet
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**

&#x20;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:

```scss
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](https://base-goerli.blockscout.com/) o [Basescan](https://goerli.basescan.org/) para confirmar que se verificó.

**Interactuando con el Smart Contract**&#x20;

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.**


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://base-es.gitbook.io/base/overview/guias/deployando-un-contrato-inteligente/usando-hardhat.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
