sui move开发实战-dao(2)

引言

经过之前的学习,我准备进行实战开发一个简单的dao项目demo,实现一个去中心化自治组织,用于管理共享资金、社区任务、提案和投票等功能,本篇文章分享了初始化模块,权限和社区任务模块。

初始化

    fun init(witness: DAO, ctx: &mut TxContext) {//1. create dao token and mint supplylet (treasury_cap,metadata) = coin::create_currency<DAO>(witness,18,b"DAO",b"dao",b"Dao token.",option::none(),ctx);transfer::public_freeze_object(metadata);let total_balance = coin::mint_balance<DAO>(&mut treasury_cap, TOTAL_SUPPLY);//2. move supply to treasury and share treasurylet treasury = Treasury<DAO> {id: object::new(ctx),supply: total_balance,};transfer::share_object(treasury);//3.create dao metadata and share metadatalet total_supply = coin::treasury_into_supply<DAO>(treasury_cap);let dao = Dao{id: object::new(ctx),total_members: 1,total_supply: total_supply,};transfer::share_object(dao);//4. mint Cap to msg.senderlet msg_sender = tx_context::sender(ctx);let init_core_cap = InitCoreCap{id: object::new(ctx),role_address: msg_sender,};let core_cap = CoreCap{id: object::new(ctx),role_address: msg_sender,};let member_cap = MemberCap{id: object::new(ctx),role_address: msg_sender,};transfer::transfer(member_cap,msg_sender);transfer::transfer(core_cap, msg_sender);transfer::transfer(init_core_cap, msg_sender);}

dao组织初始化有以下几个步骤:

  1. 创建dao代币,将代币数据转换为share obj,铸造确定供应量的dao代币
  2. 创建金库,将dao代币全部储存在金库中
  3. 创建dao组织元数据,并转化为share obj
  4. 为交易发起者铸造所有权限凭证

权限管理

初始核心成员权限
    public fun distribute_corecap(init_core_cap:& InitCoreCap, receiver:address, ctx:&mut TxContext){check_init_corecap_role(init_core_cap,ctx);let core_cap = CoreCap{id: object::new(ctx),role_address: receiver,};transfer::transfer(core_cap,receiver);}public fun distribute_init_corecap(init_core_cap:& InitCoreCap, receiver:address, ctx:&mut TxContext){check_init_corecap_role(init_core_cap,ctx);let init_core_cap = InitCoreCap{id: object::new(ctx),role_address: receiver,};transfer::transfer(init_core_cap,receiver);}

初始核心成员可以向任意地址颁发初始核心成员和核心成员的权限凭证。

核心成员权限
    public fun distribute_membercap(core_cap:& CoreCap, receiver:address, dao:&mut Dao<DAO>, ctx:&mut TxContext){check_corecap_role(core_cap,ctx);let total_members =& dao.total_members;dao.total_members = *total_members + 1;let member_cap = MemberCap{id: object::new(ctx),role_address: receiver,};transfer::transfer(member_cap,receiver);}

核心成员可以颁发普通成员权限凭证,可以发布社区任务,改变提案等级,关闭提案。

成员权限

成员可以发布提案,获取提案奖励,进行投票,收回票据。

社区任务

  1. 核心成员可以发布社区任务,将他设置为share obj
    public fun set_community_task(core_cap:& CoreCap, describe:String, reward_amount:u64, ctx:&mut TxContext){check_corecap_role(core_cap,ctx);let new_task = CommunityTask{id: object::new(ctx),describe:describe,reward_amount:reward_amount,distribute_ended: false,};transfer::share_object(new_task);}
  1. 核心成员可以对完成任务的贡献者分发奖励凭证
    public fun distribute_task_rewards(core_cap:& CoreCap, task:& CommunityTask, receiver:address, ctx:&mut TxContext,){check_corecap_role(core_cap,ctx);assert!(!task.distribute_ended, ETaskDistributeEnded);let reward_amount = task.reward_amount;let reward_cap = TaskRewardCap{id: object::new(ctx),reward_amount:reward_amount,owner:receiver,};transfer::transfer(reward_cap,receiver);}
  1. 完成任务的贡献者可以凭借奖励凭证获取dao代币, 交易中奖励凭证将会被解构,防止被二次使用
    public fun claim_reward(reward_cap:TaskRewardCap, treasury:&mut Treasury<DAO>, ctx:&mut TxContext){let TaskRewardCap {id, reward_amount, owner} = reward_cap;assert!(owner == tx_context::sender(ctx), ENotTaskCapOwner);object::delete(id);let reward_coin = take_coin_from_treasury(treasury, reward_amount,ctx);transfer::public_transfer(reward_coin,owner);}
  1. 核心成员可以关闭任务奖励分发(此项操作不可逆),删除社区任务
    public fun close_task(core_cap:&mut CoreCap, task:&mut CommunityTask,ctx:&mut TxContext){check_corecap_role(core_cap,ctx);task.distribute_ended = true;}public fun delete_task(core_cap:&mut CoreCap, task:CommunityTask,ctx:&mut TxContext){check_corecap_role(core_cap,ctx);let CommunityTask{ id,describe,reward_amount,distribute_ended} = task;object::delete(id);}

结语

我们已经实现了初始化,成员权限,社区任务模块的功能,接下来,我们将会继续实现剩余部分的设计,通过动手实践学习sui编程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【matlab】如何批量修改图片命名

【matlab】如何批量修改图片命名 (●’◡’●)先赞后看养成习惯😊 假如我的图片如下,分别是1、2、3、4、5的命名 需求一:假如现在我需要在其后面统一加上_behind字符串,并且保留原命名,同时替换掉原先的图片,也就是不copy新的一份,直接在原文件夹中处理,我们可以进行…

【TypeScript系列】Iterators 和 Generators

Iterators 和 Generators 当一个对象实现了Symbol.iterator属性时&#xff0c;我们认为它是可迭代的。 一些内置的类型如Array&#xff0c;Map&#xff0c;Set&#xff0c;String&#xff0c;Int32Array&#xff0c;Uint32Array等都已经实现了各自的Symbol.iterator。 对象上的…

基于springboot+vue的大学生兼职系统的设计与实现(源码+论文)

作者主页&#xff1a;Java程序员老张 主要内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;…

Java零基础入门-LinkedHashMap集合

一、本期教学目标 学习LinkedHashMap集合的概念及特点。学习LinkedHashMap存储结构。学习LinkedHashMap集合常用方法及示例代码演示。 二、正文 1、概述 我们学习了map接口之HashMap集合&#xff0c;今天我们要来学习map接口的另一个实现类-LinkedHashMap&#xff0c;不知道…

算法思想总结:滑动窗口算法

创作不易&#xff0c;感谢三连 一.长度最小的数组 . - 力扣&#xff08;LeetCode&#xff09;长度最小的数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int lenINT_MAX,nnums.size(),sum0;//len必须要给一个很大的数&#xf…

go rabbitmq 操作

go rabbitmq 操作 go 依赖包github.com/streadway/amqp docker快速部署 docker pull rabbitmq:management docker run -d rabbitmq:management # 先跑一个看看监听了哪些端口 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq #5672 go 程序连接&#x…

Java-并发编程--ThreadLocal、InheritableThreadLocal

1.ThreadLocal 作用 作用&#xff1a;为变量在线程中都创建副本&#xff0c;线程可访问自己内部的副本变量。该类提供了线程局部 (thread-local) 变量&#xff0c;访问这个变量&#xff08;通过其 get 或 set 方法&#xff09;的每个线程都有自己的局部变量&#xff0c;它独立…

CleanMyMac X2024免费绿色版安装包下载

在当今这个数字化时代&#xff0c;我们的生活和工作中离不开电脑&#xff0c;尤其是对于Mac用户而言&#xff0c;更是需要一个轻巧、快捷的解决方案来保持电脑的高效运转。CleanMyMac X正是为此而生&#xff0c;它将帮助您清理Mac中的垃圾文件、优化系统性能&#xff0c;让您的…

前台于后台项目

一&#xff1a;技术栈 前台&#xff1a;vue3element plus 后台&#xff1a;reactant desgin 二&#xff1a;项目中的问题&#xff1a; 多人协同开发导致样式冲突 ui框架中组件的使用 ui框架中组件样式的修改 精度缺失问题 框架的使用 三&#xff1a;解决方案&#xff1a; …

Python电梯楼层数字识别

程序示例精选 Python电梯楼层数字识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python电梯楼层数字识别》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

STM32的简单介绍

STM32是一种基于ARM Cortex-M内核的32位微控制器&#xff0c;由意法半导体公司开发和生产。STM32具有丰富的外设和功能&#xff0c;适用于各种应用场合&#xff0c;如工业控制、消费电子、物联网、人机交互等。STM32的优势包括低功耗、高性能、高可靠性、易于开发等。STM32的系…

嵌入式学习39-程序创建数据库及查找

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开 数据库文件(创建一个数据库连接) 参数: filename: …

用 C 语言模拟 Rust 的 Option 枚举类型

Rust 的 Option<i32> 类型是一个枚举类型&#xff0c;它表示可能有一个 i32 类型的值&#xff0c;或者没有值&#xff08;即 None&#xff09;。这在 Rust 中是一个常见的模式&#xff0c;用于处理可能不存在的值&#xff0c;避免了使用裸指针或引入 NULL 的概念。 在 C…

深度解析Transformer编码器:理论与实践(附代码示例)

在自然语言处理领域&#xff0c;Transformer 模型以其革命性的架构和卓越的性能&#xff0c;成为了研究和应用的热门选择。其中&#xff0c;Transformer 编码器和解码器作为其重要组成部分&#xff0c;编码器在文本表示和特征提取方面发挥着重要作用&#xff0c;而解码器将编码…

excel封装和ddt D17

1&#xff09;excel封装 openpyxl的操作 2&#xff09;ddt 数据驱动测试 ## openpyxl的操作 1.安装&#xff1a;pip install openpyxl 2.导入 openpyxl&#xff1a; import openpyxl 3.workbook对象&#xff1a;工作簿&#xff0c;openpyxl.load_workbook() 4.sheet对象&a…

【Linux】基础 IO(文件描述符)-- 详解

一、前言 1、文件的宏观理解 文件在哪呢&#xff1f; 从广义上理解&#xff0c;键盘、显示器、网卡、声卡、显卡、磁盘等几乎所有的外设都可以称之为文件&#xff0c;因为 “Linux 下&#xff0c;一切皆文件”。 从狭义上的理解&#xff0c;文件在磁盘&#xff08;硬件&#…

【博士每天一篇文献-综述】Brain network communication_ concepts, models and applications

阅读时间&#xff1a;2023-12-1 1 介绍 年份&#xff1a;2023 作者&#xff1a;Caio Seguin&#xff0c;Olaf Sporns印第安纳大学心理与脑科学系 期刊&#xff1a; nature reviews neuroscience 引用量&#xff1a;33 中文翻译参考&#xff1a;https://swarma.org/?p44524 …

深度学习pytorch——Tensor维度变换(持续更新)

view()打平函数 需要注意的是打平之后的tensor是需要有物理意义的&#xff0c;根据需要进行打平&#xff0c;并且打平后总体的大小是不发生改变的。 并且一定要谨记打平会导致维度的丢失&#xff0c;造成数据污染&#xff0c;如果想要恢复到原来的数据形式&#xff0c;是需要…

强大的开源网络爬虫框架Scrapy的基本介绍(入门级)

Scrapy 是一个强大的开源网络爬虫框架&#xff0c;用于从网站上抓取数据。它基于 Twisted 异步网络框架&#xff0c;可以高效地处理并发请求和数据处理。 以下是 Scrapy 框架的一些重要特点和功能&#xff1a; 1. **灵活的架构**&#xff1a; - Scrapy 提供了灵活的架构&a…

力扣细节题:字符串中的最大奇数

奇数只要找到第一位是奇数的即可&#xff0c;不是找单个数字 //即从最低位开始&#xff0c;找到第一位为奇数的位 //然后之前的就是需要的数字char * largestOddNumber(char * num){int i strlen(num) - 1;while(i > 0){if((num[i] - 0) % 2 1)break;i--;}//先找到低位开…