No tienes acceso a esta clase

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

¿Qué es la metadata del ERC721?

15/23
Recursos

Aportes 10

Preguntas 6

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Acá les dejo el string de la descripción para que no copien tanto 😉

"Platzi Punks are randomized Avataaars stored on chain to teach DApp development on Platzi", "image": "

Resolviendo reto:
Le agregue solo:

'"external_url": "ipfs://<hash>"',

A la metadata, un sitio donde estara alojado en IPFS todo el marketplace.
Aqui tambien se pudieran agregar los atributos para cada personaje, asi como la implementacion de Oracles para obtener numeros aleatorios y asi cada personaje garantizar que son unicos.

No sé hasta que punto pero siento que hacer test me ayuda a comprender mejor las cosas por eso les comparto los que voy logrando cualquier crítica es bienvenida.

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("PlatziPunks", function () {
  let platzi_punks;
  beforeEach(async function(){
    const PlatziPunks = await ethers.getContractFactory("PlatziPunks");
    platzi_punks = await PlatziPunks.deploy(2);
    await platzi_punks.deployed();
  })

  describe("tokenURI", async function () {
    it("Should throw an error if tokenId don't exists", async function () {
      try {
        await platzi_punks.tokenURI(0)
        expect.fail('fail with an error');
      } catch (error) {
        expect(error.message).to.contains('ERC721Metadata: URI query for nonexistent token');
      }
    });
    
    it("Should return the correct tokenURI protocol mime type", async function () {
        await platzi_punks.mint()
        expect(await platzi_punks.tokenURI(0)).to.includes("data:application/json;base64,");
    });

    it("Should name token with correct number based on tokenId", async function () {
      await platzi_punks.mint()
      await platzi_punks.mint()
      
      expect(await platzi_punks.tokenURI(0)).to.includes(Buffer.from('{ "name": "PlatziPunks #0"').toString('base64').slice(0, -1));
      expect(await platzi_punks.tokenURI(1)).to.includes(Buffer.from('{ "name": "PlatziPunks #1"').toString('base64').slice(0, -1));
    });
  })
  
});

Excelente profesor pero explica muy rápido.

Documentacion del objeto abi en solidity que no vi en los recursos.

“el reto es construir una url que sea compliant para regresarnos un archivo de JSON”

… ¿eh?

Importando con Contrato de OpenZeppelin Base64

Importamos la librería al principio del contrato

import "@openzeppelin/contracts/utils/Base64.sol";

Posteriormente solo se le hacen unos ajustes a la parte de jsonURI

bytes memory jsonURI = abi.encodePacked(
            '"name" : "Platzi Punks"', 
            tokenId,
            '", "description" : "Randomized Avatars", "image" : ", '
            "// TODO : calculate images URL",
            '"}'
        ); 

        return string (
            abi.encodePacked(
                "data:application/json;base64,",
                Base64.encode(jsonURI)
            )   
        );

Saludos

Libreria de Base64 en OpenZeppeling. aunque no se puede importar es bueno tener el recurso a la mano.

Ayuda con el reto del JSON …
No me quedo nada claro como avanzar con eso.

que significa hacer un override?