#multisig #squads #smart-contracts #solana #program

squads-program

Squads 是一种链上程序,允许团队共同管理数字资产、创建提案等。

1 个稳定版本

2.0.1 2022年3月8日

#4#squads

LGPL-3.0

195KB
4.5K SLoC

Squads

squads-program

链上 Squads 程序

概述

Squads 是一种链上程序,允许团队共同管理数字资产、创建提案等。目前可以创建两种类型的 Squads:团队和多签。

团队

团队是一种 Squads 类型,成员由团队创建者分配的代币进行铸造。铸造的代币被锁定在分配给成员的 PDA 中。在投票提案时,用户的投票权重由其在各自 PDA 账户中的代币数量决定。代币目前是非流动性的,成员可以选择投票铸造更多代币给 Squads 成员。团队允许在 Squads 内进行复杂的投票动态。

多签

在多签 Squads 中,成员不会铸造代币,功能集中在控制保险库。成员可以添加或删除可以控制保险库的公钥,成员还可以投票调整签名阈值。

Squads 账户

Squads 有一个地址(PDA),由创建它的公钥和一个随机字符串生成,两者都保存到 Squads 状态账户中,用于在需要时用于签名。Squads 保险库也是一个 PDA,由 Squads PDA 和字符串 "!squadsol" 生成。保险库 PDA 可以用于 SOL,或作为生成其他代币 ATA 的种子。任何从保险库中提取 SOL 或其他代币的提案都必须由保险库 PDA 签名(在 Squads 状态结构中称为 sol_account)。

创建提案

所需指令数据包括一个对应提案类型的字节。然后指令将触发后续指令以相应地初始化提案账户。如果提案通过并执行,执行指令将引用提案账户的相关字段,根据指定的提案类型:提取、添加/移除成员、更新 Squads 设置等。提案账户将被创建,并通过由 Squads PDA 和每次创建提案时递增的随机数(proposal_nonce)生成的 PDA 引用。

该提案需要与标签相对应的固定字节集(可投票选择的可能选项 - 最多5个),可选描述和链接等。检查每个Init函数,以确定要解包和用于提案的预期字节。

投票

要投票,需要使用投票选择的选项索引调用指令。在创建一个基于投票者公钥和提案PDA的PDA的VoteReceipt账户后,将调用后续指令,并将投票选择索引保存到VoteReceipt账户中,同时保存一个时间戳。然后,将投票权重写入提案账户。如果达到法定人数和支持,则将提案标记为execute_ready,并将Squad当前的支持和供应的“快照”保存到提案中,以准确反映Squad在该时刻的设置状态,以防止在添加更多成员或投票通过或拒绝后更改Squad设置时重新打开提案。

执行提案

如果提案已通过,则任何有效的Squad成员都可以调用execute指令。根据提案类型,execute指令需要传递各种PDA,例如,如果执行是提取SOL/Token,则需要sol_account PDA。

指令

  • CreateSquad
  • CreateMultisig
  • AddMembersToSquad
  • CreateProposalAccount
  • CastVote
  • CastMultisigVote
  • ExecuteProposal
  • ExecuteMultisigProposal

状态

  • Squad
  • 提案
  • 投票收据

创建Squad指令

创建Squad指令需要以下序列化数据,首字节表示0。务必查看instruction.rs以了解所需的账户。

allocation_type: 1 byte, with value set to 1
vote_support: 1 byte, with value set between 1-100
vote_quorum: 1 byte, with value set between 1-100
core_threshold: 1 byte (not used yet), can be zero
squad_name: 24 bytes, including empty chars if shorter
description: 36 bytes, including empty chars if shorter
token: 6 bytes (not used yet), can be all empty chars
random_id: 10 bytes, should be 10 random ASCII chars as bytes

创建多重签名指令

创建多重签名指令需要以下序列化数据,首字节表示1。务必查看instruction.rs以了解所需的账户。

vote_quorum: 1 byte, indicating threshold, > 1 and should not exceed members_num
squad_name: 24 bytes
description: 26 bytes
random_id: 10 bytes
members_num: value of initial owner keys added

安全和责任

本软件没有任何保证;甚至没有对商誉或特定目的适用性的暗示保证。

许可证

本软件根据LGPL-3.0发布

该软件已由Neodyme审计(报告将很快提供)。

依赖关系

~22–31MB
~511K SLoC