多个创建者

我们从前面的课程中看到,创建者(通常是模块部署者)可以拥有多种权限:

  1. 创建者可以拥有集合对象,用于添加、更新或删除属性。
  2. 创建者可以拥有集合中NFT的显示对象,以控制它们在用户界面中的显示方式。
  3. 创建者可以在NFT在市场上交易时接收版税付款。
use nft_protocol::royalty;
use nft_protocol::royalty_strategy_bps;
use ob_permissions::witness;
use std::string::{Self, String};
use sui::package;

/// 可用于创建后授权其他操作。至关重要的是,这个结构体不能随意提供给任何合约,因为它充当授权令牌。
public struct Witness has drop {}

fun init(otw: KITE, ctx: &mut TxContext) {
    let (collection, mint_cap) =
        collection::create_with_mint_cap<KITE, KiteNFT>(&otw, option::none(), ctx);
    let delegated_witness = witness::from_witness(Witness {});
     collection::add_domain(
        delegated_witness,
        &mut collection,
        display_info::new(
            string::utf8(b"Kites"),
            string::utf8(b"A NFT collection of Kites on Sui"),
        ),
    );
 
    // 单个创建者获取所有版税
    let shares = vector[100];
    let creator = tx_context::sender(ctx);
    let shares = utils::from_vec_to_map(creator, shares);
    // 100 BPS (Basis points) == 1%
    royalty_strategy_bps::create_domain_and_add_strategy(
        delegated_witness, &mut collection, royalty::from_shares(shares, ctx), 100, ctx,
    );    

    // 确保版税能轻易被执行
    let publisher = package::claim(otw, ctx);
    let (transfer_policy, transfer_policy_cap) =
        transfer_request::init_policy<KiteNFT>(&publisher, ctx);
    royalty_strategy_bps::enforce(&mut transfer_policy, &transfer_policy_cap);
}

对于某些集合,特别是在游戏中,可能会有多个创建者,这可能是因为有多个不同的人参与,或者只是为了将版税支付拆分到多个账户中以提高安全性。 OriginByte 提供了一个简单的创建者模块接口,允许添加多个创建者。这可以用于:

  1. 向集合添加一个创建者属性,以跟踪所有创建者的地址。
  2. 按指定百分比将版税支付拆分给这些不同的创建者账户。
use nft_protocol::creators;
use ob_utils::utils;

fun init(otw: KITE, ctx: &mut TxContext) {
    let (collection, mint_cap) =
        collection::create_with_mint_cap<KITE, KiteNFT>(&otw, option::none(), ctx);
    let delegated_witness = witness::from_witness(Witness {});
     collection::add_domain(
        delegated_witness,
        &mut collection,
        display_info::new(
            string::utf8(b"Kites"),
            string::utf8(b"A NFT collection of Kites on Sui"),
        ),
    );
    
    // 列出所有创建者
    let creators = vector[
        @0xA01, @0xA05, @0xA06, @0xA07, @0x08
    ];
    collection::add_domain(
        delegated_witness,
        &mut collection,
        creators::new(utils::vec_set_from_vec(&creators)),
    );
 
    // 版税支付在5个账户之间按每个20%进行拆分。
    let shares = vector[2_000, 2_000, 2_000, 2_000, 2_000];
    let shares = utils::from_vec_to_map(creator, shares);
    // 100 BPS (Basis points) == 1%
    royalty_strategy_bps::create_domain_and_add_strategy(
        delegated_witness, &mut collection, royalty::from_shares(shares, ctx), 100, ctx,
    );    

    // 确保版税能轻易被执行
    let publisher = package::claim(otw, ctx);
    let (transfer_policy, transfer_policy_cap) =
        transfer_request::init_policy<KiteNFT>(&publisher, ctx);
    royalty_strategy_bps::enforce(&mut transfer_policy, &transfer_policy_cap);
}

创建者也可以通过控制集合对象(无论是作为拥有对象还是共享对象)进行添加或删除。