No tienes acceso a esta clase

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

Prepárate para tu próximo empleo comprando hoy a precio especial

Antes: $249

Currency
$209
Suscríbete

Termina en:

7 Días
20 Hrs
27 Min
5 Seg

¿Qué es la metadata del ERC721?

16/24
Recursos

Aportes 13

Preguntas 6

Ordenar por:

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

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.

OpenZeppelin ya tiene su propia implementación de Base64.sol.
Realizar el import simplemente con:

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

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.

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

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

… ¿eh?

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

Aqui esta la implementacion con open zeppelin

import "@openzeppelin/contracts/utils/Base64.sol";
function tokenURI(uint256 tokenId)
        public
        pure
        override
        returns (string memory)
    {
        bytes memory dataURI = abi.encodePacked(
            '{',
                '"name": "PlatziPunks #', tokenId.toString(), '"',
               	//Aqui colocan los datos de la metadata
            '}'
        );

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

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

A Solidity le vendría bien los Backtick (``) de Javascript para concatenar.
Concatenar de esa forma es muy confuso realmente.

que significa hacer un override?