Mediante el lenguaje Solidity, crear un contrato inteligente de Ethereum para generar Pokemones, con sus habilidades, tipos y debilidades.
Este reto se lo dedico a mi hermano Luis Enrique Ramirez (QEPD), el niño eterno, quien fue alto fan de la saga, y me enseñó el término Entrenamiento Pokemón. Su Pokemón favorito siempre fué Pikachu.
Estos recursos suministran datos para crear los Pokemones en el contrato inteligente.
- Lista de Pokemones
- Tipos de Pokemones
- Ejemplo de Pokemón: Pikachu
- Habilidades de Pikachu
- Tipo y Debilidad de Pikachu
- Imagen de ejemplo de Pokemón Pikachu
Para los datos tipo
(_type) y debilidad
(_weakness) en cada Pokemón, utilizar los valores numéricos de la sigiente tabla:
0 = No Weakness
1 = Normal
2 = Fire
3 = Water
4 = Grass
5 = Electric
6 = Ice
7 = Fighting
8 = Poison
9 = Ground
10 = Flying
11 = Psychic
12 = Bug
13 = Rock
14 = Ghost
15 = Dark
16 = Dragon
17 = Steel
18 = Fairy
- Hacer el curso de Desarrollo de Smart Contracts de Platzi
- Hacer fork del repositorio original
- Analizar bien los requerimientos
- Crear estructura de habilidades
- Crear tipos de pokemones con
enum
- Agregar habilidades, debilidades y tipo a las variables de estado Pokemon
- Investigar sobre
events
y agregar el event al crear los Pokemones - Investigar sobre
require
y agregar validaciones al crear los Pokemones - Investigar cómo eliminar elementos de arrays
- Verificar si es posible hacer return de estructuras
- Si no es posible hacer return de estructuras, verificar return de multiples valores
- Traer los archivos locales a Remix con el
remixd
daemon - Cargar el contrato en Remix
- Compilar y hacer Deploy del contrato en Remix
- Cargar el primer Pokemón en el contrato
- Deployment en una Testnet
- Cargar el contrato en Remix.
- Ir a la pestaña SOLIDITY COMPILER y hacer clic en el botón
Compile PokemonFactory.sol
. - Ir a la pestaña DEPLOY & RUN TRANSACTIONS y hacer clic en el botón
Deploy
. - Bajar a la sección
Deployed Contracts
, abrir el elementoPOKEMONFACTORY AT ...
. - Buscar el elemento
createPokemon
y abrirlo. - Especificar los siguientes datos:
- _name: Pikachu
- _id: 1
- _abilityName: Static
- _abilityDescription: Can cause paralysis in battle if hit by a physical move
- _type: 5
- _weakness: 9
- _image: https://static.wikia.nocookie.net/pokemon/images/0/0d/025Pikachu.png
- Hacer clic en el botón
Transact
. - En la franja inferior derecha de la pantalla, hacer clic en el botón
Debug
, abrirlo haciendo clic en / y verificar la información de la transacción. - Enjoy!
- Seguir las instrucciones de la clase de Deploy Cómo desplegar nuestro contrato en Ropsten en el curso Desarrollo de Smart Contracts de Platzi.
- Básicamente se resume a:
- Crear una Wallet en Metamask.
- Crear una cuenta en alguna Testnet:
- Debido a que en agosto de 2022 la Testnet Ropsten estaba ya cerrada, utilice la de Paradigm: https://faucet.paradigm.xyz, que da ETH, WETH, DAI y algunos NFTs en 8 Testnets (Ropsten, Kovan, Rinkeby, Optimistic Kovan, Arbitrum Rinkeby, Avalanche Fuji, Göerli y Polygon Mumbai).
- También su puede utilizar la Faucet de Metamask: https://faucet.metamask.io.
- Copiar y pegar la direccion de la Wallet de Metamask en la cuenta de la Faucet.
- Esperar los fondos.
- Compilar el contrato en Remix (se puede hacer presionando
Ctrl-S
uOption-S
). - Conectar Remix con la Wallet. En este blog de Paul McAviney hay unas instrucciones interesantes para realizar este paso en una red Ropsten, y en este otro enlace para hacerlo en Celo.
- Confirmar la conexión de Remix en la Wallet Metamask.
- Hacer clic en el botoón
Deploy
. - Confirmar la operación de Despliegue en la Wallet Metamask.
- El resto del seguimiento de las transacciones se puede hacer en Metamask.
- Alli estarán los enlaces para ver el contrato en Etherscan. Al entrar en el contrato se podrá ver sus datos y la transacción que le dió origen.
- Si se desea poder ver el código fuente del contrato en Etherscan, es necesario:
- Anotar la versión exacta que se usó en la compilación del contrato en Remix (pestaña
SOLIDITY COMPILER
, secciónCOMPILER
). En mi caso fué la0.8.7+commit.e28d00a7
. - Anotar la Licencia utilizada en el contrato. En mi caso fué
GPL-3.0
porque puse la línea// SPDX-License-Identifier: GPL-3.0
al principio del archivo PokemonFactory.sol. - Ir al registro del contrato en Etherscan.
- Seguir las instrucciones para confirmar el byte code.
- Si todos los datos concuerdan (version del compilador, licencia y código fuente exacto que se usó), al cabo de un rato se podrá ver el código fuente en Etherscan.
- Anotar la versión exacta que se usó en la compilación del contrato en Remix (pestaña
- Para ejecutar las funciones públicas del contrato, hacer clic en la pestaña
Contract
y luego clic en el botónWrite Contract
. - Para consultar las variables de estado públicas del contrato, hacer clic en la pestaña
Contract
y luego clic en el botónRead Contract
.
La versión post-Merge fué desplegada en en la Goerli Testnet Network. Lo puedes ver haciendo clic aquí.
La primera versión de este contrato fué desplegada en en la Rosten Testnet Network. Lo puedes ver haciendo clic aquí.
Luego implementé el deploy (despliegue) con Hardhat.
Algunos comandos de Hardhat:
npx hardhat help
npx hardhat test
REPORT_GAS=true npx hardhat test
npx hardhat node
npx hardhat run scripts/deploy.js
Para agregar Hardhat a un proyecto web3 que no lo tenga:
npm init
npm install -D hardhat dotenv
npx hardhat
En el directorio raíz del proyecto, crear el archivo hardhat.config.js:
require("@nomicfoundation/hardhat-toolbox");
require("@nomiclabs/hardhat-ethers");
require('dotenv').config({ path: __dirname + '/.env' });
const GOERLI_RPC_URL = process.env.GOERLI_RPC_URL;
const PRIVATE_KEY = process.env.PRIVATE_KEY;
const ETHERSCAN_KEY = process.env.ETHERSCAN_KEY;
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.17",
defaultNetwork: "hardhat",
networks: {
localhost: {
chainId: 31337,
},
goerli: {
url: GOERLI_RPC_URL,
accounts: PRIVATE_KEY ? [PRIVATE_KEY] : [],
chainId: 5,
},
},
etherscan: {
apiKey: ETHERSCAN_KEY,
},
};
En el directorio scripts
, modificar el archivo deploy.js
con el siguiente contenido:
// We require the Hardhat Runtime Environment explicitly here. This is optional
// but useful for running the script in a standalone fashion through `node <script>`.
//
// You can also run a script with `npx hardhat run <script>`. If you do that, Hardhat
// will compile your contracts, add the Hardhat Runtime Environment's members to the
// global scope, and execute the script.
const hre = require("hardhat");
async function main() {
const PokemonFactory = await hre.ethers.getContractFactory("PokemonFactory");
const pokemonFactory = await PokemonFactory.deploy();
await pokemonFactory.deployed();
console.log(
`PokemonFactory deployed to ${pokemonFactory.address}`
);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
1.- Clonar o descargar el repositorio:
git clone https://github.com/tomkat-cr/solidity-eth-challenge.git
2.- Cambiarse al directorio:
cd solidity-eth-challenge
3.- Ejecutar el comando:
npm install
Para configurar los parámetros:
1.- GOERLI_RPC_URL: será necesario crear una cuenta en Infura, Alchemy u otro Web3 Development Platform.
2.- PRIVATE_KEY: será necesario crear una Wallet y obtener su llave privada, por ejemplo en Metamask
3.- ETHERSCAN_KEY: será necesario crear una cuenta en Etherscan y una API Key en My API Keys
Luego:
4.- Crear el archivo .env copiando desde el modelo con el comando:
cp .env.example .env
5.- Asignar los valores a los parámetros en el archivo .env:
vi .env
Para ejecutar las pruebas:
1.- Ejecute el nodo local:
npm run node
o
npx hardhat node
2.- Ejecutar los tests:
npm run test
o
npx hardhat test
1.- Para hacer el deploy en la Testnet Goerli, usar el comando:
npm run deploy
1.- Para hacer el deploy en la Testnet Local, usar el comando:
npm run dev:deploy