Aptos Collection & Token V2
Summary
- Aptos Collection & Token V2 provides enhanced customization and standardization for NFTs on the Aptos blockchain.
- The
aptos_token_objects::aptos_tokenmodule offers a standardized approach for creating collections and tokens. - Aptos Collections are created with two resources:
CollectionandAptosCollection, allowing for various customizable attributes. - Aptos Tokens automatically generate ability options for mutator, burn, and transfer operations, simplifying the token creation process.
- The
AptosTokenobject provides built-in functionality for burning, transferring, and mutating tokens without manual setup. - This approach offers greater flexibility and ease of use compared to manual initialization with
aptos_token_objects::token.
Overview
With the use of use aptos_token_objects::token to initialize tokens, or using use aptos_token_objects::collection and collection::create_fixed_collection to initialize collections, these are Tokens that you can customize according to your preferences. However, with aptos_framework, they also provide you with another standard to standardize aptos_tokens (token v2), making synchronization in common cases easier through aptos_token_objects::aptos_token
When initializing with collection::create_fixed_collection, we will create an object called Collection, but when you initialize an Aptos Collection through the function aptos_tokens::create_collection, you will receive 2 resources including:
#[resource_group_member(group = aptos_framework::object::ObjectGroup)]
struct Collection has key {
creator: address,
description: String,
name: String,
uri: String,
}
#[resource_group_member(group = aptos_framework::object::ObjectGroup)]
struct AptosCollection has key {
mutator_ref: Option<collection::MutatorRef>,
royalty_mutator_ref: Option<royalty::MutatorRef>,
mutable_description: bool,
mutable_uri: bool,
mutable_token_description: bool,
mutable_token_name: bool,
mutable_token_properties: bool,
mutable_token_uri: bool,
tokens_burnable_by_creator: bool,
tokens_freezable_by_creator: bool,
}
For example, when using the aptos_token::create_collection function:
module movement::nft_aptos_collection {
use aptos_token_objects::aptos_token;
use std::string;
const COLLECTION_NAME: vector<u8> = b"Movement NFT";
const COLLECTION_DESCRIPTION: vector<u8> = b"Movement NFT Descriprtion";
fun init_module(caller: &signer) {
aptos_token::create_collection(
caller, // Creator
string::utf8(b"Move Spiders are awesome"), // Collection Description
1000, // Max Supply
string::utf8(b"Move Spiders"), // Collection Name
string::utf8(b"https://movementlabs.xyz"), // Collection URI
true, // mutable_description
true, // mutable_royalty
true, // mutable_uri
true, // mutable_token_description
true, // mutable_token_name
true, // mutable_token_properties
true, // mutable_token_uri
true, // tokens_burnable_by_creator
true, // tokens_freezable_by_creator
0, // royalty_numerator
100, // royatly_denominator
);
}
}
Here you can see that with aptos_collection, you can easily customize various ability settings. These include options to modify internal fields of the token, such as description, royalty, uri, and more.
Aptos Tokens
Similar to Aptos Collection, aptos_token also provides a Mint function based on the AptosCollection you've previously created. This function is akin to create_token in aptos_token_objects::token, but with a key difference: it automatically generates various ability options for mutator, burn, or transfer operations. This eliminates the need for manual setup as we did before.
When using aptos_token::mint, we not only create a Token object but also an additional object called AptosToken:
#[resource_group_member(group = aptos_framework::object::ObjectGroup)]
struct Token has key {
collection: Object<Collection>,
description: String,
name: String,
uri: String,
}
#[resource_group_member(group = aptos_framework::object::ObjectGroup)]
struct AptosToken has key {
burn_ref: Option<token::BurnRef>,
transfer_ref: Option<object::TransferRef>,
mutator_ref: Option<token::MutatorRef>,
property_mutator_ref: property_map::MutatorRef,
}
With AptosToken already initialized and using the ability options you need without manual initialization as when using aptos_token_objects::token
fun create_movement_token(caller: &signer) {
aptos_token::mint(
caller, // creator
string::utf8(COLLECTION_NAME), // collection name
string::utf8(b"Movement Token description"), // token description
string::utf8(b"Movement Token"), // token name
string::utf8(b"https://movementlabs.xyz"), // token uri
vector[], // property_keys
vector[], // property_types
vector[], // property_values
)
}