转至元数据结尾
转至元数据起始

You are viewing an old version of this content. View the current version.

与当前比较 View Version History

« 上一页 版本 15 当前的 »

DAO和插件的关系

  • DAO是主体,可以安装插件和使用插件

  • 插件来完成具体的功能的扩展

分几部分来描述插件

第一部分,插件功能,如何使用,以及插件API文档

1. 插件的功能

1.1 Grant插件

Grant 插件提供 :

  • 创建/执行颁发 Grant 的提案

  • 创建/执行修改 Grant 的提案

  • 创建/执行收回 Grant 的提案

  • 创建安装 Grant 插件的提案

1.2 Member插件

1.3 Stake插件

主要功能:根据质押时长和质押额度来质押Token以获得相应的SBT,例如: 在Token和SBT为1:1的DAO中来质押,质押10个Token 10分钟,可得100SBT

用户可以做什么:

  • 根据时间和质押额度来质押Token以获得相应的SBT

  • 查询当前质押Token的列表

  • 质押到期之后退回相应的Token

  • 针对插件中的一些参数进行投票,参数有:接收的Token类型,质押Token转成SBT的权重

DAO安装插件后可以做什么:

  • 初始化时指定接收Token的类型,质押Token转成SBT的权重

  • 执行投票结果

2. 场景:描述StarcoinDAO下插件的使用和对接

2.1 Grant插件

在Starcoin DAO 中其他项目可以创建 颁发 Grant 的提案,来为申请人获得 Grant 奖励

当 申请人拥有 Grant 时,任意成员可以提案要求撤销/修改 申请人的 Grant 奖励,当提案通过后,申请人的 Grant 将被撤销/修改

2.2 Member插件

2.3 Stake插件

StarcoinDAO中用户可以通过StakeToSBT插件来增加用户在DAO中的SBT

第二部分:在DAO里如何install插件,以及如何使用插件

1. 如何安装插件

插件的安装方式有两种:

  • 当 DAO 被创建时安装 (静态安装)

  • 当 DAO 已经创建好后通过 “安装插件的插件”提案 安装(动态安装)

插件被安装后暂时没有卸载方法

1.1 静态安装

DAO 初始化创建(合约 Write 接口)

在一个DAO被实例化创建时,需要先上传该 DAO 的 合约模块后执行 DAO 的 初始化函数(对应下方create_dao

参数

  • voting_delay

投票多久后开始

  • voting_period

投票的时间区间

  • voting_quorum_rate

投票成功的比例

  • min_action_delay

多久后可以执行提案

  • min_proposal_deposit

最小的提案质押 Token 数

public(script) fun create_dao(
        sender: signer,           
        voting_delay: u64,
        voting_period: u64,
        voting_quorum_rate: u8,
        min_action_delay: u64,
        min_proposal_deposit: u128,
)

安装插件

DAOSpace::install_plugin_with_root_cap 调用此函数可以在 DAO 创建的同时 安装插件,无需投票安装

DAOSpace::install_plugin_with_root_cap<X, InstallPluginProposalPlugin>(&dao_root_cap, InstallPluginProposalPlugin::required_caps());

例子XDAO

module creator::XDAO {
    use StarcoinFramework::DAOAccount;
    use StarcoinFramework::DAOSpace;
    use StarcoinFramework::MemberProposalPlugin::{Self, MemberProposalPlugin};
    use StarcoinFramework::InstallPluginProposalPlugin::{Self, InstallPluginProposalPlugin};

    struct X has store{}
    
    const NAME: vector<u8> = b"X";

    /// directly upgrade the sender account to DAOAccount and create DAO
    public(script) fun create_dao(
        sender: signer, 
        voting_delay: u64,
        voting_period: u64,
        voting_quorum_rate: u8,
        min_action_delay: u64,
        min_proposal_deposit: u128,
    ){
        let dao_account_cap = DAOAccount::upgrade_to_dao(sender);
        let config = DAOSpace::new_dao_config(
            voting_delay,
            voting_period,
            voting_quorum_rate,
            min_action_delay,
            min_proposal_deposit,
        );
        let dao_root_cap = DAOSpace::create_dao<X>(dao_account_cap, *&NAME, b"ipfs://description", X{}, config);
        
        DAOSpace::install_plugin_with_root_cap<X, InstallPluginProposalPlugin>(&dao_root_cap, InstallPluginProposalPlugin::required_caps()); 
        DAOSpace::install_plugin_with_root_cap<X, MemberProposalPlugin>(&dao_root_cap, MemberProposalPlugin::required_caps());
        
        DAOSpace::burn_root_cap(dao_root_cap);
    }
}

1.2 动态安装(合约 Write 接口

动态安装适用于 DAO 已经创建好后 ,想要安装其他插件

需要被安装插件提供install_plugin_proposal 接口,或者其他类似功能的接口

public(script) fun install_plugin_proposal<DAOT: store>(sender: signer, description:vector<u8>, action_delay: u64)

参数

  • description:vector<u8>

要安装插件提案的描述

  • action_delay:u64

多久后可以执行提案

StakeToSBT安装插件时

备注:插件的安装和插件的配置是否需要分两个界面。应该有一个插件列表,用户选择插件后安装。

2. 使用插件

2.1 Grant 插件

Grant 授予:

合约接口:

  public (script) fun create_grant_proposal<DAOT: store, TokenT:store>(sender: signer, description: vector<u8>,grantee: address, total: u128, start_time:u64, period: u64, action_delay:u64)

Grant 销毁:

合约接口:

public (script) fun create_grant_revoke_proposal<DAOT: store, TokenT:store>(sender: signer, description: vector<u8>, grantee:address, action_delay:u64)

Grant 修改:

合约接口:

public (script) fun create_grant_config_proposal<DAOT: store, TokenT:store>(sender: signer, description: vector<u8>, old_grantee: address, new_grantee: address, total: u128, period: u64,start_time:u64, action_delay:u64)

2.2 StakeToSBT插件

发起提案,接口:

/// 发起质押类型的提案
/// 模板参数:
/// 1. DAOT,DAO类型
/// 2. TokenT,Token类型
/// 普通参数:
/// 1. sender 发起者签名
/// 2. description 描述信息
/// 3. action_delay,投票成功后多长时间才可以执行动作
fun StakeToSBT::create_token_accept_proposal<DAOT: store, TokenT: store>(
  sender: signer,
  description:vector<u8>,
  action_delay: u64);
  
/// 发起质押参数的提案
/// 模板参数:
/// 1. DAOT,DAO类型
/// 2. TokenT,Token类型
/// 普通参数:
/// 1. sender 发起者签名
/// 2. description 描述信息
/// 3. lock_time 锁仓时长
/// 4. weight 倍率
/// 5. action_delay,投票成功后多长时间才可以执行动作
fun StakeToSBT::create_weight_proposal<DAOT: store, TokenT: store>(
  sender: signer,
  description:vector<u8>,
  lock_time: u64,
  weight: u64,
  action_delay: u64);

用户查看质押列表

左侧为按Token类型汇总,(接口Jiefeng Yang 提供),点进去则是右侧的列表(接口Jiefeng Yang 提供),即当前用户所质押的列表

  1. 赎回按钮未到时间不可点击

  2. 点击➕,则弹出“新增质押”界面

/// 查询单个质押的信息
/// 模板参数:
/// 1. DAOT,DAO类型
/// 2. TokenT,Token类型
///
/// 普通参数:
/// 1. member 查询的用户
/// 2. id 质押的id
///
/// 返回参数:
/// 1. 质押开始时间
/// 2. 锁仓时间
/// 3. 倍率权重
/// 4. SBT的额度
/// 5. 质押的额度
fun StakeToSBT::query_stake<DAOT: store, TokenT: store>(
  member: address, 
  id: u64) : (u64, u64, u64, u128, u128);
  
/// 赎回质押(未到锁仓时间不可赎回)
/// 模板参数:
/// 1. DAOT,DAO类型
/// 2. TokenT,Token类型
///
/// 普通参数:
/// 1. member 查询的用户
/// 2. id 质押的id
fun StakeToSBT::unstake_by_id<DAOT: store, TokenT: store>(member: address, id: u64);

新增质押界面

/// 质押
/// 模板参数:
/// 1. DAOT,DAO类型
/// 2. TokenT,Token类型
///
/// 普通参数:
/// 1. sender 发起的用户
/// 2. token 质押的Token
/// 3. lock_time 锁仓的时间
fun stake<DAOT: store, TokenT: store>(
  sender: &signer,
  token: Token::Token<TokenT>,
  lock_time: u64);

  • 无标签