不可替代的 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;