✨ 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>
El día de hoy deberás ser capaz de lo siguiente:
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))
}