同质化代币

同质化代币代表着每个单元都是相同且可互换的资产,例如货币、商品或实用代币。在 Stellar 上,您可以创建同质化代币,其中每个代币都具有相同的价值和属性,余额和所有权通过 Soroban 智能合约进行跟踪。

概述

fungible 模块提供了三种不同的同质化代币变体,它们在某些功能(如代币转移和批准)的处理方式上有所不同:

该模块提供了几个实现选项,以适应不同的用例:

  1. 基础实现 (FungibleToken,具有 Base 合约类型): 适用于大多数标准代币用例。

  2. 允许列表扩展 (FungibleToken,具有 AllowList 合约类型): 对于需要允许列表机制来控制谁可以转移代币的代币。

  3. 阻止列表扩展 (FungibleToken,具有 BlockList 合约类型): 对于需要阻止特定地址转移代币的代币。

这些实现共享核心功能和一个通用接口,公开相同的合约函数作为入口点。但是,这些扩展通过覆盖某些函数来实现其特定需求,从而提供专门的行为。

用法

我们将为一个游戏的内部货币创建一个简单的代币。玩家可以通过完成任务来赚取代币,并且可以花费代币来购买游戏中的物品。合约所有者可以根据需要铸造新的代币,并且玩家可以在帐户之间转移代币。

以下是一个基本的同质化代币合约的样子:

use soroban_sdk::{contract, contractimpl, Address, Env, String};
use stellar_tokens::fungible::{burnable::FungibleBurnable, Base, ContractOverrides, FungibleToken};
use stellar_access::ownable::{self as ownable, Ownable};
use stellar_macros::{default_impl, only_owner};

#[contract]
pub struct GameCurrency;

#[contractimpl]
impl GameCurrency {
    pub fn __constructor(e: &Env, initial_owner: Address) {
        // Set token metadata
        // 设置代币元数据
        Base::set_metadata(
            e,
            8, // 8 decimals
               // 8 位小数
            String::from_str(e, "Game Currency"),
            String::from_str(e, "GCUR"),
        );

        // Set the contract owner
        // 设置合约所有者
        ownable::set_owner(e, &initial_owner);
    }

    #[only_owner]
    pub fn mint_tokens(e: &Env, to: Address, amount: i128) {
        // Mint tokens to the recipient
        // 将代币铸造给接收者
        Base::mint(e, &to, amount);
    }
}

#[default_impl]
#[contractimpl]
impl FungibleToken for GameCurrency {
    type ContractType = Base;
}

#[default_impl]
#[contractimpl]
impl FungibleBurnable for GameCurrency {}

扩展

提供以下可选扩展:

- 可销毁

FungibleBurnable trait 扩展了 FungibleToken trait,以提供销毁代币的功能。为了完全符合 SEP-41 规范,合约必须同时实现 FungibleTokenFungibleBurnable trait。

- 设有上限

与其他扩展不同,设有上限的扩展不公开单独的 trait。相反,它提供了旨在协助实现 mint 函数的辅助函数,从而强制执行供应上限。

- 允许列表

FungibleAllowList trait 扩展了 FungibleToken trait,以提供一个可由授权帐户管理的允许列表机制。此扩展确保只有允许的帐户才能转移/接收代币或批准代币转移。

- 阻止列表

FungibleBlockList trait 扩展了 FungibleToken trait,以提供一个可由授权帐户管理的阻止列表机制。此扩展确保被阻止的帐户无法转移/接收代币或批准代币转移。

TokenInterface 宏

对于同时实现 FungibleTokenFungibleBurnable 并且还需要实现 soroban_sdk::token::TokenInterface 的合约,我们提供了 impl_token_interface! 宏。此宏会自动生成所需的样板代码,从而简化了实现过程。

实用工具模块

该软件包包含实用工具模块,可帮助实现常见的代币实现模式:

- SAC 管理员通用

提供类似于 Stellar Asset Contract (SAC) 的通用管理功能。此方法利用 __check_auth 函数来处理身份验证和授权逻辑,同时保持统一的接口。

有关详细文档,请参见 SAC 管理员通用

- SAC 管理员包装器

提供 SAC 管理员功能的包装器,以便于集成。此方法为每个管理员函数定义特定的入口点,并将调用转发到相应的 SAC 函数。

有关详细文档,请参见 SAC 管理员包装器

兼容性和合规性

该模块旨在确保与 SEP-0041 完全兼容。它还密切镜像 Ethereum ERC-20 标准,从而促进跨生态系统的熟悉度和易用性。

为了符合 SEP-41 规范,合约必须同时实现 FungibleTokenFungibleBurnable trait。这些 trait 一起提供了符合 soroban_sdk::token::TokenInterface 所需的所有方法。

TTL 管理

该库仅处理由该库声明的 temporarypersistent 存储条目的 TTL(生存时间)。由于灵活性,instance TTL 管理留给实现者。该库公开了用于延长 TTL 的默认值:INSTANCE_TTL_THRESHOLDINSTANCE_EXTEND_AMOUNT