1 个不稳定版本

0.2.4 2022 年 5 月 5 日

#5#deposit

GPL-3.0-or-later

230KB
2.5K SLoC

包含 (ELF 库, 1MB) tests/fixtures/spl_governance.so

描述

Voter-stake-registry 是 Solana 的 spl-governance 程序 的投票权重插件。

启用插件后,治理领域管理员可以

  • 控制哪些代币可以用于投票,以及其缩放因子。

    这意味着除了治理代币之外,其他代币也可以用于投票,并且可以设置其相对权重。

  • 从用户存款中回收用户已启用的锁定代币。

    这主要用于代币奖励。用户不会为正常存款启用回收。

用户可以

  • 存入和提取所选代币以获得投票权重。

    当启用插件时,在 spl-governance 中禁用了治理代币的默认存取流程。插件添加了无需锁定的存取能力。

  • 以不同的归属计划锁定代币。

    代币只有在归属完成后或锁定期结束后才能提取。锁定代币可能有额外的投票权重。

  • 使用他们的投票权重来投票 spl-governance 提案。

开发

Rust

  • 使用 rust stable 版本(rustc 1.57.0 (f1edd0429 2021-11-29))构建和开发
  • 运行基于 rust 的测试 - cargo test-sbf
  • run-generate-anchor-types.sh 生成最新的锚点类型文件,并写入到 ./voter_stake_registry.ts
  • 要安装 TypeScript 客户端,请执行 - yarn add @blockworks-foundation/voter-stake-registry-client
  • 用法

Node/TypeScript

  • 使用 node (v16.13.1) 构建
  • 用法
import { Provider, Wallet } from '@project-serum/anchor';
import { Connection, Keypair } from '@solana/web3.js';
import { VsrClient } from '@blockworks-foundation/voter-stake-registry-client';

async function main() {
  const options = Provider.defaultOptions();
  const connection = new Connection('https://api.devnet.solana.com', options);
  const wallet = new Wallet(Keypair.generate());
  const provider = new Provider(connection, wallet, options);
  const client = await VsrClient.connect(provider, true);
image

部署

用户可能会想要编译自己的 voter-stake-registry 并将其部署到他们控制的地址。

在编译之前,请查看

  • Registrar::voting_mints:此数组长度定义了可配置的投票铸币数量。根据需要调整。

开发网络

出于测试目的,voter-stake-registry 的一个实例已部署在开发网络中

voter-stake-registry:  4Q6WW2ouZ6V3iaNm56MTd5n2tnTm4C5fiH8miFHnAFHo
spl-governance master: i7BqPFNUvB7yqwVeCRJHrtZVwRsZZNUJTdBm7Vg2cDb

使用场景

设置

要开始使用插件,请使用 spl-governance 实域权限提出治理提案。

  1. 部署 voter-stake-registry 的一个实例。
  2. 使用 CreateRegistrar 指令为实域创建一个注册器。
  3. 根据需要多次调用 ConfigureVotingMint 指令将投票令牌铸币添加到注册器。
  4. 在 spl-governance 上调用 SetRealmConfig 指令,设置投票权重插件程序 ID,从而启用插件。

无需锁定即可存款和投票

  1. 在插件上调用 CreateVoter(首次使用)。使用用于与 spl-governance 注册相同的 voter_authority。

  2. 为投票者调用 CreateDepositEntry,指定 LockupKind::None 以及要存入的令牌铸币。(首次使用)

    这创建了一个新的存款条目,可用于无需锁定存入和提取资金。

  3. 为投票者调用 Deposit,并使用相同的存款条目 ID 存入资金。

  4. 要投票,请在插件上调用 UpdateVoterWeightRecord,然后在同一交易中在 spl-governance 上调用 CastVote,将投票者权重记录传递给两者。

  5. 提案解决后,使用 Withdraw 提取资金。

授予锁定令牌的赠款

  1. 向收款人询问他们希望使用的地址。
  2. 提出一项提案,调用 Grant,将令牌存入为该地址创建的新锁定存款条目。使用实域权限或令牌铸币的赠款权限进行治理。
  3. 如果需要,以后可以提出一项提案,调用 Clawback,从他们的存款中提取所有剩余的锁定令牌。

管理恒定到期存款

当有锁定令牌的投票权重奖金时,恒定到期存款很有用:具有悬崖或每日/每月到期的锁定存款,剩余锁定期在到期时间临近时减少,因此投票权重也会随时间减少。

恒定到期锁定保持令牌在固定的到期时间。这保证了固定的投票权重,但这也意味着在最终可以提取之前,它们需要手动过渡到不同的锁定类型。

设置恒定到期锁定很简单

  1. 创建一个 Constant 锁定类型的存款条目,并选择天数。
  2. 将其存入 Deposit
  3. 使用它来投票。

如果您想要再次访问令牌,您需要通过以下方式启动解锁过程:

  • 将整个存款条目更改为Cliff,并使用ResetLockup,或者
  • 创建一个新的Cliff存款条目,并使用InternalTransferLocked将一些锁定代币从您的Constant存款条目中转移过来。

在这两种情况下,您需要等待 cliff 到达后才能再次访问这些代币。

指令概述

设置

用法

  • CreateVoter

    为用户创建一个新的投票者账户。

  • CreateDepositEntry

    在投票者上创建一个存款条目。存款条目是投票铸币中代币的存放地,可能包含锁定期和归属计划。

    每个投票者可以拥有多个存款条目。

  • 存款

    将代币添加到存款条目。

  • 取款

    从存款条目中取出代币,可以是未解锁或已归属的。

  • ResetLockup

    重新锁定已过期的锁定代币,或增加锁定期限或更改锁定类型。

  • InternalTransferLocked

    将锁定代币从一个存款条目转移到另一个存款条目。这对于将“固定”锁定存款条目的一部分拆分出来以开始解锁过程很有用。

  • InternalTransferUnocked

    将未锁定代币从一个存款条目转移到另一个存款条目。这对于将一部分代币拆分出来以在另一个存款条目中重新锁定很有用,而不必进行取款和重新存入。

  • UpdateVoterWeightRecord

    将当前投票者权重写入 spl-governance 可以读取的账户,为投票做准备。

  • CloseDepositEntry

    关闭一个空存款条目,以便它可以用于不同的铸币或锁定类型。

  • CloseVoter

    关闭一个空投票者,收回租金。

特殊

  • Grant

    作为领域权威或铸币的授权:如果需要,创建一个投票者,创建一个新的存款并为其提供资金。此指令旨在与 DAO 提案一起使用。

  • Clawback

    作为回收权威,从已选择加入回收的投票者的存款条目中回收锁定代币。

  • UpdateMaxVoteWeight

    用于告知 spl-governance 总最大投票权重的未完成指令。

  • SetTimeOffset

    用于在测试中推进时间的调试指令。不可使用。

许可

此代码目前处于开发阶段,不可免费使用。

参考

依赖项

~20–33MB
~555K SLoC