对象包装 - 将 SuiFren 包装在GiftBox中

我们创建了一个包含 SuiFren 的新对象类型 GiftBox。但是如何将 SuiFren 放入其中呢?这里有两种选择:

  1. 在 sui_fren 模块中创建一个新的函数 create,用于创建一个 SuiFren 对象并返回它,而不是像 mint 函数那样立即将其转移给发送者。
  2. 先铸造 SuiFren。一旦在 mint 中完成转移,我们无法在同一交易中检索 SuiFren,需要在后续交易中显式地将该 SuiFren 作为参数传递。 我们可以在 fren_summer 模块中添加一个 包装函数,允许发送者将现有的 SuiFren 包装成一个礼品盒,然后可以将其发送给朋友。

在第二种情况下,将 SuiFren 放入 GiftBox 称为对象包装。这不仅仅是你想的那样——它会将被包装的对象从对象存储中取出。 这意味着,如果你有一个可以显示用户所拥有的所有 SuiFren 的界面,那么被包装的 SuiFren 将从列表中消失。

public struct Box has key {
    id: UID,
    thing: Thing,
}

public struct Thing has key, store {
    id: UID,
}

public fun wrap(thing: Thing, ctx: &mut TxContext) {
    let box = Box { id: object::new(ctx), thing };
    transfer::transfer(box, tx_context::sender(ctx));
}

请注意,wrap 函数接受的是值,而不是引用!我们在前面的课程中已经介绍了按值传递对象的方式以及如何将对象从存储中移除。