同质化代币
同质化代币代表着每个单元都是相同且可互换的资产,例如货币、商品或实用代币。在 Stellar 上,您可以创建同质化代币,其中每个代币都具有相同的价值和属性,余额和所有权通过 Soroban 智能合约进行跟踪。
概述
fungible 模块提供了三种不同的同质化代币变体,它们在某些功能(如代币转移和批准)的处理方式上有所不同:
该模块提供了几个实现选项,以适应不同的用例:
-
基础实现 (
FungibleToken
,具有Base
合约类型): 适用于大多数标准代币用例。 -
允许列表扩展 (
FungibleToken
,具有AllowList
合约类型): 对于需要允许列表机制来控制谁可以转移代币的代币。 -
阻止列表扩展 (
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 规范,合约必须同时实现 FungibleToken
和 FungibleBurnable
trait。
- 允许列表
FungibleAllowList
trait 扩展了 FungibleToken
trait,以提供一个可由授权帐户管理的允许列表机制。此扩展确保只有允许的帐户才能转移/接收代币或批准代币转移。
实用工具模块
该软件包包含实用工具模块,可帮助实现常见的代币实现模式:
- SAC 管理员通用
提供类似于 Stellar Asset Contract (SAC) 的通用管理功能。此方法利用 __check_auth
函数来处理身份验证和授权逻辑,同时保持统一的接口。
有关详细文档,请参见 SAC 管理员通用。