No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Lanzamiento de NFTs en Immutable X

7/10
Recursos

Interactuar con un zkRollup de uso espec铆fico nos demandar谩 conocer cu谩l es ese caso de uso que satisface. Basarnos en su documentaci贸n y herramientas que provee su comunidad y ecosistema para lograr interactuar con este tipo de L2.

Interactuando con un zkRollup de uso espec铆fico

Immutable X es un zkRollup de uso espec铆fico que no permitir谩 mintear colecciones de NFT y hacer trading con los mismos. Es una plataforma ideal para lanzar videojuegos web3.

Paso 1: Registro en Immutable X

El primer paso ser谩 registrar tu wallet en este zkRollup. Para esto, utilizaremos la testnet de Immutable X para crear una cuenta.

Al decir que necesitar谩s 鈥渦na cuenta鈥, no nos referimos al tradicional usuario y contrase帽a. El proyecto es descentralizado, podr谩s crear dicha cuenta conectando tu wallet a la plataforma simplemente. La misma te solicitar谩 una serie de firmas, sin costo alguno, para que los smart contract tengan acceso a tu wallet y finalizar el registro.

Paso 2: Lanzar contrato ERC721 en L1

El contrato ERC721 debe ser lanzado en L1 y el mismo tiene que ser programado espec铆ficamente para comunicarse con los bridges de Immutable X y permitir mintear los NFTs.

Para esto, lanzaremos el siguiente contrato en Goerli utilizando Remix. Se trata de un t铆pico contrato ERC721 con algunas particularidades importantes a remarcar.

La documentaci贸n oficial de Immutable X especifica c贸mo debe desarrollarse nuestro contrato. El mismo debe importar una interfaz llamada Mintable que posee toda la l贸gica de ownership a trav茅s de OpenZeppelin y el minteo de los NFTs.

import "@openzeppelin/contracts/access/Ownable.sol";

interface IMintable {
    function mintFor(
        address to,
        uint256 quantity,
        bytes calldata mintingBlob
    ) external;
}

abstract contract Mintable is Ownable, IMintable {
    address public imx;
    mapping(uint256 => bytes) public blueprints;

    event AssetMinted(address to, uint256 id, bytes blueprint);

    constructor(address _owner, address _imx) {
        imx = _imx;
        require(_owner != address(0), "Owner must not be empty");
        transferOwnership(_owner);
    }

    modifier onlyOwnerOrIMX() {
        require(msg.sender == imx || msg.sender == owner(), "Function can only be called by owner or IMX");
        _;
    }

    function mintFor(address user, uint256 quantity, bytes calldata mintingBlob) external override onlyOwnerOrIMX {
        require(quantity == 1, "Mintable: invalid quantity");
        (uint256 id, bytes memory blueprint) = Minting.split(mintingBlob);
        _mintFor(user, id, blueprint);
        blueprints[id] = blueprint;
        emit AssetMinted(user, id, blueprint);
    }

    function _mintFor(address to, uint256 id, bytes memory blueprint) internal virtual;
}

Que bien podr铆amos importar con import "@imtbl/imx-contracts/contracts/Mintable.sol";, haciendo uso de los propios contratos del Immutable X.

Dicha interfaz, a su vez, hace uso de una librer铆a necesaria para manipular los bytes de la imagen del NFT.

library Bytes {
    function indexOf(bytes memory _base, string memory _value, uint256 _offset) internal pure returns (int256) {
        bytes memory _valueBytes = bytes(_value);
        assert(_valueBytes.length == 1);
        for (uint256 i = _offset; i < _base.length; i++) {
            if (_base[i] == _valueBytes[0]) {
                return int256(i);
            }
        }
        return -1;
    }

    function toUint(bytes memory b) internal pure returns (uint256) {
        uint256 result = 0;
        for (uint256 i = 0; i < b.length; i++) {
            uint256 val = uint256(uint8(b[i]));
            if (val >= 48 && val <= 57) {
                result = result * 10 + (val - 48);
            } else {
                revert("invalid input, only numbers allowed");
            }
        }
        return result;
    }
}

Finalmente, nuestro contrato. Implementamos el est谩ndar ERC721 desde OpenZeppelin, adem谩s de implementar tambi茅n la interfaz Mintable de Immutable X.

contract MyImmutableXCollectionDemo is ERC721, Mintable {
    constructor() ERC721("My IMX Collection Demo", "MIMXNFT") Mintable(msg.sender, 0x7917eDb51ecD6CdB3F9854c3cc593F33de10c623) {}

    function _mintFor(address user, uint256 id, bytes memory) internal override {
        _safeMint(user, id);
    }
}

La interfaz de Immutable X recibe como par谩metro la direcci贸n del bridge en Goerli, en este caso 0x7917...c623.

Es com煤n denominar a los entornos de testeo de cualquier software como Sandbox. Tal vez te topes con ese nombre al inspeccionar el ecosistema de Immutable X.

Despliega este contrato utilizando Remix, o tu ambiente de desarrollo web3 preferido, y estaremos listos para configurar el cliente que crear谩 tu primer NFT en Immutable X.

Paso 3: Preparar cliente de Immutable X

Es momento de preparar el cliente que utilizaremos para crear NFTs en Immutable X. Para esto, puedes utilizar este repositorio como setup para ya disponer de un ambiente listo para ser configurado y ejecutar los scripts que interactuar谩n con el contrato y el protocolo de segunda capa.

Debemos configurar unas cuantas variables de entorno en el proyecto y realizar una serie de pasos.

3.1: Creaci贸n del proyecto

  • Crea un archivo .env con base en .env.examples
  • Edita OWNER_ACCOUNT_PRIVATE_KEY y COLLECTION_CONTRACT_ADDRESS con la clave privada de tu wallet (podr谩s exportarla desde Metamask) y la direcci贸n del contrato desplegado en el Paso 2
  • Edita src/onboarding/2-create-project.ts para establecer las variables name, company_name y contact_email
  • Ejecuta npm run onboarding:create-project

Nota: recuerda guardar de forma segura la clave privada de tu wallet y no compartirla con nadie

3.2: Creaci贸n de la colecci贸n de NFTs

  • Edita COLLECTION_PROJECT_ID en el archivo .env con el ID otorgado luego de ejecutar el comando anterior
  • Edita el name, description, icon_url, metadata_api_url, collection_image_url en el archivo src/onboarding/3-create-collection.ts
  • Ejectua npm run onboarding:create-collection

Los NFTs en Immutable X se basan en colecciones. La misma tendr谩 un nombre, una descripci贸n, la URL hacia un 铆cono, la metadata y una imagen de la propia colecci贸n. Todas estas URLs es aconsejable obtenerles de servicios descentralizados como IPFS.

3.3: Crear schema de metadata

  • Edita la metadata en src/onboarding/4-add-metadata-schema.ts, la misma puede tener un schema como el siguiente:
{
  name: 'name',
  type: MetadataTypes.Text
},
{
  name: 'image_url',
  type: MetadataTypes.Text
},
{
  name: 'description',
  type: MetadataTypes.Text
},
{
  name: 'attack',
  type: MetadataTypes.Discrete,
  filterable: true
}

El nombre, imagen y la descripci贸n deben coincidir con los campos en la metadata de cada NFT. Luego podr谩s agregar campos custom como attack, dicho campo tambi茅n debe existir en la metadata.

  • Ejecuta npm run onboarding:add-metadata-schema

3.4: Minteo de NFT

  • En el archivo .env, edita PRIVATE_KEY1 nuevamente con la clave privada de tu wallet, TOKEN_ID con el n煤mero de a partir de qu茅 NFT quieres mintear, y TOKEN_ADDRESS con la direcci贸n del contrato desplegado en el Paso 2
  • Edita wallet y number en el archivo src/bulk-mint.ts con la clave p煤blica de tu wallet y el n煤mero del NFT que quiere mintear
  • Finalmente, ejecutar npm run bulk-mint para mintear tu primer NFT con Immutable X

Si todo ha ido bien, dir铆gete al marketplace Sandbox de Immutable X, ingresa con tu wallet y deber铆as poder visualizar el NFT recientemente creado.

Conclusi贸n

Este tipo Rollups de uso espec铆fico te permitir谩 lanzar grandes colecciones de NFTs. Puede parecer algo confuso, solo debes prestar atenci贸n a la l贸gica del contrato y a la correcta configuraci贸n del cliente con los datos pertinentes que necesitas.

Dominar este tipo de protocolos puede darte nuevas habilidades como desarrollador blockchain para cumplir con ciertos casos de uso en un trabajo o simplemente para realizar investigaciones de c贸mo se encuentra en evoluci贸n el ecosistema de los NFTs.


Contribuci贸n creada por: Kevin Fiorentino.

Aportes 3

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Immutable X me record贸 bastante a Metaplex y a como se pueden lanzar colecciones de NFT con Candy Machine en la blockchain de Solana. Aunque en Solana es algo m谩s sencillo, tiene menos pasos y configuraciones.