20 个版本 (11 个重大更新)
0.17.1 | 2023年1月26日 |
---|---|
0.16.0 | 2022年12月16日 |
0.15.1 | 2022年9月22日 |
0.13.0 | 2022年7月26日 |
0.8.1 | 2022年3月29日 |
#2231 in 魔法豆
每月下载量 53 次
在 4 个crate中 使用 4 次(直接使用3次)
60KB
959 行
TG3 规范:多签/投票合约
TG3 是一个基于CosmWasm的投票合约规范。它是CW1(作为1/N多签的即时1)的扩展。这也是与TG3特定API对齐的CW1镜像。在这种情况下,没有任何密钥可以立即执行,只能提出一组执行消息。提案、后续批准和签名聚合都在链上完成。在这个规范中,我们至少要涵盖以下3种不同的情况
- K of N不可变多签。一个密钥提出一组消息,在K-1个其他密钥批准后,可以用多签地址执行。
- K of N灵活可变多签。与上面类似,但使用多个合约。一个合约存储组,该组被多个多签合约引用(这些多签合约反过来实现tg3)。一个tg3合约可以更新组内容(可能需要67%的投票)。其他tg3合约可能持有代币、质押权等,具有各种执行阈值,所有这些都由一个组控制。(组接口和更新它们在tg4规范中定义)。
这应该适用于此接口(可能需要一些扩展,但外部使用方式应相同)
- 加权投票。人们拥有一些由点数表示的任意投票权。存在一个执行消息的投票阈值。投票集是动态的。这有一个类似的“提议、批准、执行”流程,但我们需要支持明确的YES/NO投票和否决权,而不仅仅是绝对阈值。
它们的共同点是允许您将任意的CosmosMsg
提议给一个合约,并允许一系列的投票/批准来决定是否可以执行,以及一个最终步骤来执行任何批准的提议。
基础
以下接口必须为所有tg3合约实现。请注意,更新投票合约的成员不包含在此处(一种方法定义在cw4中)。此外,如何更改阈值规则(如果有的话)尚未标准化。这些被视为管理任务,而通用API是为了标准化使用而设计的,因为这是我们能够标准化的工具最多的地方,而不限制更复杂的治理控制。
消息
Propose{title, description, msgs, earliest, latest}
- 这接受Vec<CosmosMsg>
并创建一个新的提议。这将在Data
字段(以及日志)中返回一个自动生成的ID,可用于稍后引用该提议。
如果提议者是提议上的有效投票者,这将被视为提议者对提议的YES投票,以便更快的工作流程,这在例如2个中的3个或5个中的3个多重签名中特别有用,我们不需要在一个区块中提议,得到结果,然后在另一个区块中投票。
最早和最晚是可选的,可以请求我们尝试Execute
的第一个和最后一个高度/时间。对于投票,我们可能需要至少2天的时间,但不超过7天。这是可选的,即使设置了,也可能被合约(覆盖或仅强制执行最小/最大/默认值)修改。
许多实现将希望限制谁可以提议。可能只有投票集中的成员可以。可能需要与提议一起支付一定的押金。这不在规范中,但留给实现。
Vote{proposal_id, vote}
- 给定一个提议ID,您可以投票赞成、反对、弃权或否决。每个已签名的投票者可能有不同的“点数”在投票中,并将他们的全部点数应用于投票。
许多合约(如典型的绝对阈值的典型多重签名)可能会将否决权和弃权视为反对,并仅计算赞成票。有quora的合约可能会将弃权计入quora,但不会计入赞成或反对的阈值。某些合约可能会给否决权额外的点数,而不仅仅是简单的反对,但这可能只是像正常的反对投票一样。
Execute{proposal_id}
- 这将检查给定提议的投票条件是否已通过。如果已成功,则提议被标记为Executed
,并派发消息。如果消息失败(例如,超出gas限制),则所有这些都会回滚,可以在稍后用更多gas再次尝试。
Close{proposal_id}
- 这将检查给定提议的投票条件是否失败。如果是(例如,时间已过且投票不足),则提议将被标记为Failed
。这不是严格必要的,因为只有在合同永远无法执行的情况下才会起作用,但可以被触发以提供更好的UI。
查询
阈值{}
- 返回声明合同成功所需的规则信息。得票率和投票如何统计。
提案{proposal_id}
- 返回创建提案时设置的信息以及当前状态。
ListProposals{start_after, limit}
- 返回与 提案
相同的信息,但对于所有提案以及分页。从 proposal_id 1 开始,按升序。
ReverseProposals{start_before, limit}
- 返回与 提案
相同的信息,但对于所有提案以及分页。从最新的 proposal_id 开始,按降序。(这通常是您在 UI 中想要的)
Vote{proposal_id, voter}
- 返回给定投票者(HumanAddr)如何对提案进行投票。 (可能为 null)
ListVotes{proposal_id, start_after, limit}
- 返回与 Vote
相同的信息,但对于所有投票以及分页。按投票者地址的字典顺序排序返回投票者。
投票者信息
可以投票的信息取决于合同。但我们将努力实现一个通用的 API 来显示一些这些信息。
Voter { address }
- 返回此地址的投票权(分数),如果有的话
ListVoters { start_after, limit }
- 列出所有有资格的投票者
依赖项
~4.5–6.5MB
~139K SLoC