✨ Ayer iniciamos a explorar el ecosistema de Sui, fuiste capaz de analizar tu primer Move Package y de iniciar a interactuar con programas desarrollados con Move.

Hoy iremos mas allá y conoceremos un Move Package completo en Sui Move.

<aside> ❓ Recuerda que en el discord de Zona Tres resolvemos tus dudas en el canal de #preguntas. No dudes de utilizar este espacio para avanzar

</aside>

🧠 Objetivos de aprendizaje del día

El día de hoy deberás ser capaz de lo siguiente:


Iniciando a desarrollar en Sui Move

Pensemos en objetos dentro de la blockchain de Sui

Definamos un objeto como un data type, este representará un Sui object type el cual puede ser usado para crear objetos y eventualmente ser almacenados en la red de Sui.

use sui::object::UID;

struct ColorObject has key {
    id: UID,
    red: u8,
    green: u8,
    blue: u8,
}

Crear objeto a partir de su definición

Una vez definido nuestro objeto es tiempo de instanciarlo para poder utilizarlo. Para esto debemos asegurarnos de crear un valor ID unico a nuestro objeto ya que se almacenara en el global storage. Es por esto que se utiliza el contexto de la transacción TxContext para crear el ID.

// Utilizamos el modulo object que nos permitira hacer llamadas a funciones
// dentro del modulo como el "new" function ej. sui::object::new
use sui::object;
// el modulo tx_context::TxContext nos permitira al crear el constructor crear el ID
// a partir de el contexto de la transacción
use sui::tx_context::TxContext;

// Constructor del objeto
fun new(red: u8, green: u8, blue: u8, ctx: &mut TxContext): ColorObject {
    ColorObject {
				// ID unico generado a través del contexto unico de la transacción
        id: object::new(ctx),
        red,
        green,
        blue,
    }
}

Almacenar un objeto

Una vez creado el objeto es normal que lo almacenemos en una variable local, pasarlo a otras funciones o incluirlo en otro struct. Este puede estar tambien en un persistant globa storage para ser leido y consultado.

Lo mas comun es que una vez creado sea transferido al owner o signer de la transacción.

use sui::transfer;

// Una vez creado el objeto es transferido hacia el signer de la transacción 
// esto recuerda mucho a un NFT mint y en efecto podriamos ver a cada objeto como uno 
public entry fun create(red: u8, green: u8, blue: u8, ctx: &mut TxContext) {
    let color_object = new(red, green, blue, ctx);
    transfer::transfer(color_object, tx_context::sender(ctx))
}