54 个版本 (重大变更)

39.0.0 2024年7月18日
37.0.0 2024年7月12日
36.0.0 2024年6月21日
35.0.0 2024年5月23日
2.0.0-alpha.52020年3月24日

#3 in #pallet

Download history 1326/week @ 2024-05-06 1192/week @ 2024-05-13 1308/week @ 2024-05-20 1178/week @ 2024-05-27 1501/week @ 2024-06-03 1217/week @ 2024-06-10 1051/week @ 2024-06-17 1536/week @ 2024-06-24 830/week @ 2024-07-01 1026/week @ 2024-07-08 1923/week @ 2024-07-15 1014/week @ 2024-07-22 1256/week @ 2024-07-29 1089/week @ 2024-08-05 1355/week @ 2024-08-12 1462/week @ 2024-08-19

5,215 每月下载量
用于 45 个包(20 个直接使用)

Apache-2.0

2.5MB
47K SLoC

资产模块

一个简单、安全的处理可互换资产的模块。

概述

资产模块提供对具有固定供应量的可互换资产类别的资产管理功能,包括

  • 资产发行
  • 资产转移
  • 资产销毁

要在您的运行时中使用它,您需要实现资产的 assets::Config

支持的调度函数在 assets::Call 枚举中进行了文档说明。

术语

  • 资产发行:创建一个新资产,其总供应量将属于发行该资产的账户。
  • 资产转移:将资产从一个账户转移到另一个账户的操作。
  • 资产销毁:账户销毁其持有的所有资产的过程。
  • 可互换资产:其单位可以互换的资产。
  • 非同质化资产:每个单位具有独特特征的资产。

目标

Substrate中的资产系统旨在实现以下功能:

  • 向其创作者的账户发行独特的资产。
  • 在账户之间转移资产。
  • 当账户所有者请求时,移除账户的资产余额并更新资产的总供应量。

接口

可调用的函数

  • issue - 向调用该函数的账户发行新同质化资产的总供应量。
  • transfer - 将同质化资产idamount单位从调用者账户(origin)转移到目标账户target
  • destroy - 销毁与调用该函数的账户关联的同质化资产id的全部持有量。

请参阅Call枚举及其相关变体以获取每个函数的文档。

公共函数

  • balance - 获取账户who的资产id余额。
  • total_supply - 获取资产id的总供应量。

请参阅Pallet结构以获取有关公共函数的详细信息。

使用方法

以下示例展示了如何通过公开函数在您的运行时中使用资产模块:

  • 为代币分发事件(空投)发行新的同质化资产。
  • 查询账户的同质化资产持有余额。
  • 查询已发行的同质化资产的总供应量。

先决条件

导入资产模块和类型,并从资产模块特征派生您的运行时配置特征。

简单的代码片段

use pallet_assets as assets;
use sp_runtime::ArithmeticError;

#[frame_support::pallet]
pub mod pallet {
    use super::*;
    use frame_support::pallet_prelude::*;
    use frame_system::pallet_prelude::*;

    #[pallet::pallet]
    pub struct Pallet<T>(_);

    #[pallet::config]
    pub trait Config: frame_system::Config + assets::Config {}

    #[pallet::call]
    impl<T: Config> Pallet<T> {
        pub fn issue_token_airdrop(origin: OriginFor<T>) -> DispatchResult {
            let sender = ensure_signed(origin)?;

            const ACCOUNT_ALICE: u64 = 1;
            const ACCOUNT_BOB: u64 = 2;
            const COUNT_AIRDROP_RECIPIENTS: u64 = 2;
            const TOKENS_FIXED_SUPPLY: u64 = 100;

            ensure!(!COUNT_AIRDROP_RECIPIENTS.is_zero(), ArithmeticError::DivisionByZero);

            let asset_id = Self::next_asset_id();

            <NextAssetId<T>>::mutate(|asset_id| *asset_id += 1);
            <Balances<T>>::insert((asset_id, &ACCOUNT_ALICE), TOKENS_FIXED_SUPPLY / COUNT_AIRDROP_RECIPIENTS);
            <Balances<T>>::insert((asset_id, &ACCOUNT_BOB), TOKENS_FIXED_SUPPLY / COUNT_AIRDROP_RECIPIENTS);
            <TotalSupply<T>>::insert(asset_id, TOKENS_FIXED_SUPPLY);

            Self::deposit_event(Event::Issued(asset_id, sender, TOKENS_FIXED_SUPPLY));
            Ok(())
        }
    }
}

假设

以下是在使用此模块时必须持有的假设。如果其中任何一个被违反,则此模块的行为是未定义的。

  • 资产的总数应小于Config::AssetId::max_value()

许可证:Apache-2.0

依赖关系

~17–32MB
~536K SLoC