https://market.sandbox.immutable.com/inventory/assets/0xefe9ce25073e6cbb6deaa9c1b8dca8ade73b31b6/1
Introducción al desarrollo en Capa 2
Desarrollando en capa 2
Introducción al desarrollo en capa 2
Desarrollo en Optimistic Rollups
Obteniendo fondos en un tesnet de capa 2
Lanzando un token en Arbitrum
Frontend para DApps
Intercomunicación entre capas
Desarrollo en zkRollups
Lanzamiento de NFTs en Immutable X
Smart Contracts con Cairo en Starknet
Utilizando el SDK de zkSync 2.0
Desafíos técnicos de los zkRollups
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
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.
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.
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 “una 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.
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.
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.
.env
con base en .env.examples
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 2src/onboarding/2-create-project.ts
para establecer las variables name
, company_name
y contact_email
npm run onboarding:create-project
Nota: recuerda guardar de forma segura la clave privada de tu wallet y no compartirla con nadie
COLLECTION_PROJECT_ID
en el archivo .env
con el ID otorgado luego de ejecutar el comando anteriorname
, description
, icon_url
, metadata_api_url
, collection_image_url
en el archivo src/onboarding/3-create-collection.ts
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.
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.
npm run onboarding:add-metadata-schema
.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 2wallet
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 mintearnpm run bulk-mint
para mintear tu primer NFT con Immutable XSi 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.
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
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.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.