No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Compilando y desplegando contratos inteligentes

17/27
Recursos

El proceso de desarrollo de un contrato, pasando por las configuraciones necesarias y pruebas del mismo, finaliza con el despliegue del contrato a la blockchain deseada.

Despliegue de contrato con Hardhat

Para desplegar tu contrato, deberás compilar el mismo. Hardhat también nos ayuda con eso gracias al comando npx hardhat compile. Verás que el mismo crea varios directorios en tu proyecto con el bytecode del contrato desarrollado. Recuerda que la EVM no entiende nada de Solidity, los contratos deben compilarse para que sean interpretados correctamente con la red de Ethereum.

Además del bytecode del contrato, encontrarás un archivo denominado Application Binary Interface o ABI. El ABI, es un JSON que podemos utilizar desde cualquier cliente para saber cómo interactuar con el contrato. Qué métodos posee, qué parámetros recibe, etc. En próximas clases, utilizaremos el mismo para tipar la información y comunicarnos con el smart contract desplegado en la blockchain.

Luego de compilar tu contrato, de haber configurado el archivo hardhat.config.js y desarrollado el script de despliegue con Hardhat, el comando npx hardhat run scripts/deploy.js --network goerli será el encargado de desplegar el contrato, en este caso, en Goerli.

Observarás en la consola de desarrollo que, luego del lanzamiento exitoso del contrato, este entrega una dirección totalmente única que utilizarás para localizar tu smart contract en la blockchain en cuestión donde haya sido desplegado.

Cada blockchain, sea la mainnet o una red de prueba, tendrá su propio explorador que te permitirá visualizar y obtener más información sobre lo que está ocurriendo en la red. Haciendo uso del explorador de Goerli, más la dirección del contrato, podrás visualizar el estado de este y corroborar su correcto despliegue y todas las transacciones que interactúan con el mismo.

Saber utilizar los exploradores de blockchain será clave para convertirte en un gran desarrollador web3.

Hasta este punto, solo queda felicitarte por haber desarrollado y desplegado tu primer smart contract con Hardhat.


Contribución creada por: Kevin Fiorentino (Platzi Contributor).

Aportes 14

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En las ultimas versiones de hardhat con el código de despliegue que dan en este capitulo saca error. TypeError: no matching function (argument=“key”, value=“address”, code=INVALID_ARGUMENT, version=6.6.1)

Para arreglarlo hay que cambiar en deploy.js en la linea 9 counter.address por counter.getAddress()

Tomar en cuenta que la red de Goerli esta deprecada al dia de hoy (marzo 2023), por lo que se recomienda utilizar la red de Sepolia que funciona de la misma manera.

npx hardhat compile
npx hardhat run scripts/deploy.js --network sepolia

Cuando te devuelva la dirección del contrato, puedes validarlo en etherscan:
https://sepolia.etherscan.io/

Comandos importantes de esta clase:

  • npx hardhat compile

  • npx hardhat run scripts/deploy.js --network goerli

Si obtienes el error:

TypeError: (intermediate value) is not iterable
at main (/Users/…/scripts/deploy.js:4:22)
at processTicksAndRejections (node:internal/process/task_queues:95:5)

.

El error es en el archivo deploy.js, en la línea const [deployer] = await ethers.getSigner()

Se debe cambiar por const deployer = await ethers.getSigner()

Espero puedan agregar una clase usando Sepolia

Dejo mis apuntes, más el codigo de la clase.

Deploy en TS: ```js import { ethers } from 'hardhat' async function main() { const [ deployer ] = await ethers.getSigners() console.log('deployer', deployer) const Counter = await ethers.getContractFactory("Counter") const counter = await Counter.deploy(0) const contractAddress = await counter.getAddress() console.log('Counter Contract Address:', contractAddress) } main() .then(() => process.exit(0)) .catch((error) => { console.error(error) process.exit(1) } ) ```
Agosto 2024: Es necesario agregar en deploy.js una promera de esperar la direccion para que no quede <\<pending>> agrego el codigo como debe quedar: ```js const { ethers } = require('hardhat'); async function main() { const [deployer] = await ethers.getSigners(); console.log('Deployer', deployer); const Counter = await ethers.getContractFactory('Counter'); const counter = await Counter.deploy(0); const contractAddress = await counter.getAddress(); console.log('Counter Contract Address:', contractAddress); } main() .then(() => process.exit(0)) .catch(error => { console.error(error); process.exit(1) }); ```const { ethers } = require('hardhat'); async function main() {    const \[deployer] = await ethers.getSigners();    console.log('Deployer', deployer);     const Counter = await ethers.getContractFactory('Counter');    const counter = await Counter.deploy(0);     const contractAddress = await counter.getAddress();    console.log('Counter Contract Address:', contractAddress);} main()    .then(() => process.exit(0))    .catch(error => {        console.error(error);        process.exit(1)    });
A dia de hoy es mas complicado conseguir eth en sepolia :(
Una pregunta en cuanto a la parte del testing. No estoy seguro de en qué parte entre la compilación y el despliegue, se ejecuta el código de la carpeta test. Fui a buscar la documentación pero salí aún más confundido.
Buenos dias, se puede especificar un address en la configuracion de hardhat? Estoy intentando desplegar a testnet de celo pero me sale que la dir que despliega es otra que no tiene para pagar gas, también hice pruebas con ganache y si despliega bien pero me gustaría especificarle con cual address de todas debe desplegar. Es posible esto? Saludos.

Para los que usan ubuntu y les da error por la versión de node que usan les dejo este enlace para que puedan actualizarla

https://www.stewright.me/2023/04/install-nodejs-18-on-ubuntu-22-04/

En sepolia:

require("@nomicfoundation/hardhat-toolbox");

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.18",
  networks: {
    sepolia: {
      url: " TU URL ",
      accounts: [" TU LLAVE PRIVADA "],
    }
  },
};