Desempaquetando NFTs y FTs. Llegan los MEGA-PACKS! (y 2)

Marcos DK
eosbarcelona
Published in
4 min readAug 25, 2020

En el artículo anterior vimos cómo podíamos empaquetar varios tokens NFT y/o FT en un token NFT que iba a hacer de contenedor. Algo así como un cofre de regalos o un mega-pack de contenido múltiple y visible.

Nos encontramos con un primer problema debido a que, actualmente, los exploradores de bloques y los interfaces de los markets más populares no muestran el contenido empaquetado dentro de un NFT. Entonces, ¿Cómo podemos saber qué hay dentro del cofre del tesoro?

Consultando el contenido del contenedor

Como hemos visto, un smart contract cuenta con dos elementos muy importantes y diferenciados; las acciones y los datos que almacena en tablas.

Gracias a las tablas de datos podremos consultar los tokens que posee una cuenta, filtrar por autores, ver la información de los autores y, entre otras cosas más, consultar el contenido de los contenedores que una cuenta haya creado.

Para obtener esta información debemos consultar la tabla “sassets” del contract “simpleassets” de Cryptolions.

Utilizando https://wax.bloks.io para escudriñar la tabla podremos percatarnos de que en la parte inferior, debajo de la información del token NFT que aparece listado, la barra de desplazamiento advierte de que hay mucho texto que consultar si nos desplazamos hacia la derecha. Recordemos que hemos adjuntado 5 NFT y 3 FT diferentes y en los campos “container” y “containerf” se almacena toda la información de cada uno de esos tokens adjuntos.

Para que podamos verlo mejor vamos a crear en nuestra librearía simpleassets.js una función en JavaScrip que consulte esa tabla y nos muestre de forma más legible el resultado.

Ya habíamos utilizado la función “get_table_rows” en el artículo “Leyendo tablas del contract SimpleAssets desde JavaScript”. En esta ocasión utilizamos el parámetro “lower_bound”, el cual permite realizar comparaciones con la clave primaria de la tabla. Si nos fijamos en la captura anterior podemos ver que el campo “id” es el que está marcado como campo clave (key). El campo “id” es clave única, ya que no puede haber dos tokens con la misma id, así que podemos limitar la búsqueda a la primera ocurrencia con el parámetro “limit” a 1.

Para más información sobre consulta de tablas: https://developers.eos.io/manuals/eosjs/latest/how-to-guides/how-to-get-table-information

En el archivo principal index.js realizamos la llamada (conocemos el ID del contenedor)

Este es el resultado que obtenemos:

Pero lo que realmente nos importa es el contenido de “container” y “containerf”, por lo que vamos a extraer la información a partir del resultado de nuestra llamada.

Y, en nuestro ejemplo, obtendríamos un listado en formato JSON con el contenido de ambos campos que, más adelante, podremos gestionar como nuestro proyecto requiera:

Seguro que el lector se ha dado cuenta de que cada NFT que ha sido empaquetado cuenta, a su vez, con sendos campos “container” y “containerf” y, por si se lo está preguntando, sí; es posible empaquetar paquetes dentro de paquetes, como las muñecas rusas.

Desempaquetando el Mega-Pack

Ahora ya conocemos el contenido de nuestro cofre del tesoro y hemos podido extraer la información necesaria para su desempaquetado: los IDs de los NFT y la cantidad, símbolo y autor de cada uno de los FT que tuviera empaquetado.

El procedimiento para extraer el contenido es prácticamente idéntico al que hicimos para empaquetar ya que lo único que cambia es el nombre de la acción del contract a la que vamos a llamar.

Si para empaquetar NFT utilizamos la acción “attach”, para desempaquetar será “detach”; y para los FT, “attachf” para empaquetar y “detachf” para desempaquetar.

Declaramos la función detachMegaPackNFT en nuestra librería simpleassets.js

Y llamamos a la función desde index.js almacenando previamente los IDs de los NFT en un array para simplificar las cosas. Para nuestro ejemplo, la llamada podría hacerse de esta manera:

Ahora vamos a extraer los FT pero vamos a cambiar el método. Hasta ahora, para facilitar la asimilación de los conceptos, cada vez que solicitábamos una acción a un contract lo hemos estado haciendo mediante transacciones independientes con una única acción. Sin embargo, el primer parámetro del método api.transact no es la acción a ejecutar, sino un array de acciones. Esta vez, en lugar de ejecutar 3 transacciones para desempaquetar los 3 FT, vamos a hacerlo con una sola transacción.

Para facilitar la lectura del ejemplo, en lugar de utilizar parámetros voy a definir las acciones con todos sus datos correspondientes. Una vez entendido el concepto, cada desarrollador encontrará su fórmula para optimizar y reutilizar este tipo de transacciones con llamadas a varias acciones.

Ahora tenemos que el parámetro actions de api.transact es un array con 3 acciones; que no tienen por qué ser la misma acción, ni siquiera del mismo contract.

La llamada a esta función desde index.js en nuestro ejemplo se podría parecer al siguiente código:

Resultado

Si todo ha salido bien, deberíamos ver algo así en el explorador de bloques:

Y todos esos assets estarán en nuestro wallet para que podamos disfrutar de ellos.

¡Nos vemos en la próxima entrega!

--

--

Marcos DK
eosbarcelona

Programador y creador de contenidos digitales. Profesor de informática, game dev y líder de 3DK Render, WAX Guild.