不可替代的 Token 的可枚举扩展允许枚举合约中的所有 token ID 以及每个账户拥有的所有 token ID。这对于需要列出或迭代 token 的应用程序非常有用,例如市场或钱包。
用法
我们将基于 示例,来自 不可替代的 Token,并修改合约,以便可以列出地址拥有的所有 token。请注意,任何账户都可以调用 award_item
,我们可能需要实现访问控制来限制谁可以铸造。
use soroban_sdk::{contract, contractimpl, Address, Env, String};
use stellar_macros::default_impl;
use stellar_tokens::non_fungible::{
enumerable::{Enumerable, NonFungibleEnumerable},
Base, ContractOverrides, NonFungibleToken,
};
#[contract]
pub struct GameItem;
#[contractimpl]
impl GameItem {
pub fn __constructor(e: &Env) {
Base::set_metadata(
e,
String::from_str(e, "www.mygame.com"),
String::from_str(e, "My Game Items Collection"),
String::from_str(e, "MGMC"),
);
}
pub fn award_item(e: &Env, to: Address) -> u32 {
// access control might be needed
// 可能需要访问控制
Enumerable::sequential_mint(e, &to)
}
pub fn burn(e: &Env, from: Address, token_id: u32) {
Enumerable::sequential_burn(e, &from, token_id);
}
}
#[default_impl]
#[contractimpl]
impl NonFungibleToken for GameItem {
type ContractType = Enumerable;
}
#[default_impl]
#[contractimpl]
impl NonFungibleEnumerable for GameItem {}
该扩展还公开了以下入口点函数,由 #[default_impl]
自动实现:
fn total_supply(e: &Env) -> u32;
fn get_owner_token_id(e: &Env, owner: Address, index: u32) -> u32;
fn get_token_id(e: &Env, index: u32) -> u32;