多个创建者
我们从前面的课程中看到,创建者(通常是模块部署者)可以拥有多种权限:
- 创建者可以拥有集合对象,用于添加、更新或删除属性。
- 创建者可以拥有集合中NFT的显示对象,以控制它们在用户界面中的显示方式。
- 创建者可以在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 提供了一个简单的创建者模块接口,允许添加多个创建者。这可以用于:
- 向集合添加一个创建者属性,以跟踪所有创建者的地址。
- 按指定百分比将版税支付拆分给这些不同的创建者账户。
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);
}
创建者也可以通过控制集合对象(无论是作为拥有对象还是共享对象)进行添加或删除。