Module 0x4::royalty
This defines an object-based Royalty. The royalty can be applied to either a collection or a token. Applications should read the royalty from the token, as it will read the appropriate royalty.
- Resource
Royalty - Struct
MutatorRef - Constants
- Function
init - Function
update - Function
create - Function
generate_mutator_ref - Function
exists_at - Function
delete - Function
get - Function
denominator - Function
numerator - Function
payee_address
use 0x1::error;
use 0x1::object;
use 0x1::option;
Resource Royalty
The royalty of a token within this collection
Royalties are optional for a collection. Royalty percentage is calculated by (numerator / denominator) * 100%
#[resource_group_member(#[group = 0x1::object::ObjectGroup])]
struct Royalty has copy, drop, key
Fields
-
numerator: u64 -
denominator: u64 -
payee_address: address -
The recipient of royalty payments. See the
shared_accountfor how to handle multiple creators.
Struct MutatorRef
This enables creating or overwriting a MutatorRef.
struct MutatorRef has drop, store
Fields
-
inner: object::ExtendRef
Constants
The royalty denominator cannot be 0
const EROYALTY_DENOMINATOR_IS_ZERO: u64 = 3;
Royalty does not exist
const EROYALTY_DOES_NOT_EXIST: u64 = 1;
The royalty cannot be greater than 100%
const EROYALTY_EXCEEDS_MAXIMUM: u64 = 2;
Function init
Add a royalty, given a ConstructorRef.
public fun init(ref: &object::ConstructorRef, royalty: royalty::Royalty)
Implementation
public fun init(ref: &ConstructorRef, royalty: Royalty) {
let signer = ref.generate_signer();
move_to(&signer, royalty);
}
Function update
Set the royalty if it does not exist, replace it otherwise.
public fun update(mutator_ref: &royalty::MutatorRef, royalty: royalty::Royalty)
Implementation
public fun update(mutator_ref: &MutatorRef, royalty: Royalty) acquires Royalty {
let addr = mutator_ref.inner.address_from_extend_ref();
if (exists<Royalty>(addr)) {
move_from<Royalty>(addr);
};
let signer = mutator_ref.inner.generate_signer_for_extending();
move_to(&signer, royalty);
}
Function create
Creates a new royalty, verifying that it is a valid percentage
public fun create(numerator: u64, denominator: u64, payee_address: address): royalty::Royalty
Implementation
public fun create(numerator: u64, denominator: u64, payee_address: address): Royalty {
assert!(denominator != 0, error::out_of_range(EROYALTY_DENOMINATOR_IS_ZERO));
assert!(numerator <= denominator, error::out_of_range(EROYALTY_EXCEEDS_MAXIMUM));
Royalty { numerator, denominator, payee_address }
}
Function generate_mutator_ref
public fun generate_mutator_ref(ref: object::ExtendRef): royalty::MutatorRef
Implementation
public fun generate_mutator_ref(ref: ExtendRef): MutatorRef {
MutatorRef { inner: ref }
}
Function exists_at
public fun exists_at(addr: address): bool
Function delete
public(friend) fun delete(addr: address)
Implementation
friend fun delete(addr: address) acquires Royalty {
assert!(exists<Royalty>(addr), error::not_found(EROYALTY_DOES_NOT_EXIST));
move_from<Royalty>(addr);
}
Function get
public fun get<T: key>(maybe_royalty: object::Object<T>): option::Option<royalty::Royalty>
Implementation
public fun get<T: key>(maybe_royalty: Object<T>): Option<Royalty> acquires Royalty {
let obj_addr = maybe_royalty.object_address();
if (exists<Royalty>(obj_addr)) {
option::some(Royalty[obj_addr])
} else {
option::none()
}
}
Function denominator
public fun denominator(royalty: &royalty::Royalty): u64
Implementation
public fun denominator(royalty: &Royalty): u64 {
royalty.denominator
}
Function numerator
public fun numerator(royalty: &royalty::Royalty): u64
Function payee_address
public fun payee_address(royalty: &royalty::Royalty): address
Implementation
public fun payee_address(royalty: &Royalty): address {
royalty.payee_address
}