Skip to content

ccinv/ZJU-blockchain-course-2022

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Wevote

如何运行

  1. 在本地启动ganache应用。

  2. ./contracts 中安装需要的依赖,运行如下的命令:

    npm install
  3. ./contracts 中编译并且部署合约,运行如下的命令:

    npx hardhat run scripts/deploy.ts --network ganache
  4. 将输出的合约地址填到./frontend/src/utils/contracts/contract-addresses.json中,并在./contracts/scripts 中运行以下命令

    ./deployabi.sh
  5. ./frontend 中启动前端程序,运行如下的命令:

    npm run start

功能实现分析

  • 空投 每个学生初始可以拥有或领取一些通证积分 。通过 ERC20 标准中的_mint实现,并通过一张mapping记录已经领过的地址,防止重复领取。
  • 发起提案 每个学生可以使用一定数量通证积分,发起关于该社团进行活动或制定规则的提案。通过实现一个newProposal,给定输入 token 数,提议内容和持续时间,实现在链上创建并记录这一条提案的具体信息。发起提案本身需要一定 token,剩下输入的 token 会按比例转化成赞成票。其中输入的 token 会通过 ERC20 的approvetransferFrom打入合约地址,提案会被记录在一个 mapping中。
  • 投票 提案发起后一定支出时间内,使用一定数量通证积分可以对提案进行投票(赞成或反对,限制投票次数)。实现了一个vote函数,它会在函数开始时对各项条件进行审查,比如是否超时,是否投票次数过多。然后就和发起提案类似,在合约内的mapping中记录相应的数据,并且把代币打进合约账户。
  • 结算 提案投票时间截止后,赞成数大于反对数的提案通过,提案发起者作为贡献者可以领取一定的积分奖励。实现了一个conclude函数,它首先会检查发起地址是不是管理员,然后检查这项提案是否已经过期,可以关闭,并且检查提案是否已经关闭过了。如果都满足条件,则会在这项提案中打上conculded = true标签,并且把之前打进的代币奖励给提案发起者,具体分配是把所有票数一半对应的 token(发起提案本身不算)交给提案发起者,另一半(包含发起提案部分)打入空地址0x0000dead
  • 纪念品 发起提案并通过3次的学生,可以领取社团颁发的纪念品。这部分也是在结算函数内完成的,在合约内另建了一张mapping用来存放每个地址发起提案成功次数,并且每三次成功合约就会用ERC721标准中的_mint铸造一个随机 NFT 给提案者做纪念。

项目运行截图

  • 未连接钱包时

  • 连接钱包后

  • 领取空投后

  • 提出建议的界面

  • 成功提出建议

  • 成功投票

  • 截止时间到,进入待结算状态

  • 结算后,返还了一部分代币

  • 三次成功的提案,获赠一个 NFT(一个数字)

参考内容

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages