关于构建 dYdX 社区资金库支出提案的技术指南

本分步技术指南说明如何创建提案,将 ethDYDX 从社区资金库转至目标地址。

Reverie 已编制一份综合性技术指南,通过拉取请求 (PR) 提交治理提案,将 $ethDYDX 从“社区资金库”转至 dYdX _治理合约_储存库。

要创建此提案,dYdX 社区成员必须拥有至少 500 万治理代币 _(总供应的 0.5%)_的提案权(短时间锁投票提案阈值)。

初步要求

须在完成拉取请求 (PR) 之前完成以下步骤:

  1. **提案生命周期:**须按照提案模板发布 DRC,并且必须有成功的快照投票。

  2. 目标地址: 目标地址必须提前生成。如果目标地址是多重签名,则必须创建多重签名钱包。

  3. GitHub 账户: 用于分叉储存库的 GitHub 账户。

  4. 转移金额(可选): 请求的转移金额最好是已在 PR 之前确定。但是,如果使用名义金额,可在审批前的最后一步设置该金额。

  5. DIP IPFS 哈希(可选): 如果转账金额已知,则应最终确定 DIP 并将其推送到 IPFS 以生成哈希。然而,如果金额尚未确定,可以在审批前的最后一步确定。

建立提案

  1. dYdX 治理合约储存库 分叉到您的 GitHub 账户。

2. **克隆储存库,**将 [username] 改为您自己的名称。

git clone https://github.com/[username]/governance-contracts.git

3. 配置变量

在 src/config/index.ts 中,将两个新变量添加到将用于测试目的的 configSchema 常量。在以下代码块中,将 'PROPOSAL_NAME''PROPOSAL' 字段改为当前提交提案的名称。

在 src/deploy-config/base-config.ts 中,在 config 常量中添加目标地址和转移金额当作新变量:

:按照 ERC20 标准,资金金额须乘以 10^18。如果金额未知,则可使用临时金额(例如 10 → 10000000000000000000)

在 src/lib/constants.ts 中,添加 IPFS 哈希变量,此变量将引用另一储存库中批准的 DIP:

:如果 DIP 尚未发布,可以在测试中使用临时值(例如 ‘0x0000000000000000000000000000000000000000000000000000000000000000’)\

4\。提案代码

src/migrations 中,创建一个以提案命名的新文件 → proposal-name.ts 并填充以下代码:

a. 在顶部添加所需的导入:

b.使用导入下方的提案名称,创建一个新函数,并添加以下代码和两个唯一变量:

  • destinationAddress → 这将是接收资金的地址

  • deployConfig.PROPOSAL_FUNDING_AMOUNT → 这是我们之前创建的变量,它将确定要转移的金额

5. 部署任务

创建提案后,可以编写部署,以生成提交提案所需的交易和调用数据。

tasks/deployment 中,创建一个与提案代码同名的新文件 → proposal-name.ts 并填充以下代码:

a. 用以下变量添加所需的导入:

DIP_NUMBER_IPFS_HASH → 这是我们在 lib/constants 中添加的变量

createProposalNameProposal → 这是我们在 /src/migrations/proposal-name 中创建的函数

b. 创建 hardhat 任务,并在任务开始行中填充提案信息。 替换为'deploy:proposal-name:中的提案名称,并替换为'Proposal Description'中的简要描述。

最后一行调用从提案代码中导入的函数,所以需要调整。

6. 构建测试

既然已准备好部署代码,现在可以对提案构建一些测试。测试在本地执行,也使用主网分叉来模拟链上执行的提案。

a. 添加提案测试

在 test/migrations 中,再次用提案名称添加一个新文件 → proposal-name.ts,并包括以下代码:

  • 添加所需的导入,包括提案功能:

createProposalNameProposal → 这是我们在 /src/migrations/proposal-name 中创建的函数。\

MOCK_PROPOSAL_IPFS_HASH → 我们将在测试中使用模拟哈希

  • 在以下步骤添加测试函数:

    • fundProposalNameViaProposal → 创建此函数,并重命名以匹配提案名称。

    • destinationAddress → 将其重新标签,以匹配目标名称

    • deployConfig.PROPOSAL_FUNDING_AMOUNT → 这将由 base-config 文件中的变量取代

    • FUND_PROPOSAL_NAME_PROPOSAL_ID → 这是我们在 config/index.ts 中创建的变量

    • createProposalNameProposal → 导入以上函数待用

    • fundProposalNameViaNoProposal → 创建此函数,重命名以匹配提案名称

运行下面的代码,将所有这些变量替换为上面已经创建的提案名称和现有变量:

b. 将测试函数添加到测试脚本

在 test/migrations/deploy-contracts-for-test.ts 中,我们将添加上面创建的函数,以使其包含在测试中:

  • 导入创建的函数

  • 添加这两个函数的测试,创建一般测试函数 → executeProposalNameProposalForTest ,更换名称以匹配提案

  • 我们还从 deployConfig 调用配置变量 TEST_PROPOSAL_NAME_TRUST_WITH_PROPOSAL(之前创建)和 PROPOSAL_NAME_ADDRESS

c. 添加合约到测试助手

在 test/helpers/get-deployed-contracts-for-test.ts 中,添加上面创建的函数,以便测试在主网分叉测试中运行:

  • 从迁移文件中导入 executeProposalNameProposalForTest 函数:

  • 将该函数添加到 getDeployedContractsForTest() 函数中,在最后一个 else 循环之外:

d. 最终测试文件

最后,我们在模拟提案之后添加了对 IPFS 哈希和多重签名余额的测试,以确保一切按预期结束。

在 test/misc 中,添加一个标有提案名称的新文件 → proposal-name-proposal.spec.ts 并填充以下两个测试:

  1. 我们使用 DIP_NUMBER_IPFS_HASH,从 lib 导入 IPFS Hash

  2. 我们使用 ProposalNameId,对下一个 proposalId 编号进行硬编码

  3. 我们用常量哈希检查提案哈希

  4. 我们检查 PROPOSAL_NAME_ADDRESS,以确定其是否有 PROPOSAL_FUNDING_AMOUNT 的预期余额。

注:如果该地址已经有 DYDX,则需要硬编码到余额中才能通过测试

7. 提交 PR

我们完成所有代码修改并保存在本地后,就可以提交到分叉储存库,并向 dYdX 储存库提交 PR 以供审查:

a. 通过命令行提交更改

b. 向 dYdX 储存库提交 PR

c. 等待储存库经理的审批

Last updated

Was this helpful?