关于构建 dYdX 社区资金库支出提案的技术指南
本分步技术指南说明如何创建提案,将 ethDYDX 从社区资金库转至目标地址。
Reverie 已编制一份综合性技术指南,通过拉取请求 (PR) 提交治理提案,将 $ethDYDX 从“社区资金库”转至 dYdX _治理合约_储存库。
要创建此提案,dYdX 社区成员必须拥有至少 500 万治理代币 _(总供应的 0.5%)_的提案权(短时间锁投票的提案阈值)。
初步要求
须在完成拉取请求 (PR) 之前完成以下步骤:
**提案生命周期:**须按照提案模板发布 DRC,并且必须有成功的快照投票。
目标地址: 目标地址必须提前生成。如果目标地址是多重签名,则必须创建多重签名钱包。
GitHub 账户: 用于分叉储存库的 GitHub 账户。
转移金额(可选): 请求的转移金额最好是已在 PR 之前确定。但是,如果使用名义金额,可在审批前的最后一步设置该金额。
DIP IPFS 哈希(可选): 如果转账金额已知,则应最终确定 DIP 并将其推送到 IPFS 以生成哈希。然而,如果金额尚未确定,可以在审批前的最后一步确定。
建立提案
将 dYdX 治理合约储存库 分叉到您的 GitHub 账户。

2. **克隆储存库,**将 [username] 改为您自己的名称。
git clone https://github.com/[username]/governance-contracts.git3. 配置变量
在 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 并填充以下两个测试:
我们使用 DIP_NUMBER_IPFS_HASH,从 lib 导入 IPFS Hash
我们使用 ProposalNameId,对下一个 proposalId 编号进行硬编码
我们用常量哈希检查提案哈希
我们检查 PROPOSAL_NAME_ADDRESS,以确定其是否有 PROPOSAL_FUNDING_AMOUNT 的预期余额。
注:如果该地址已经有 DYDX,则需要硬编码到余额中才能通过测试
7. 提交 PR
我们完成所有代码修改并保存在本地后,就可以提交到分叉储存库,并向 dYdX 储存库提交 PR 以供审查:
a. 通过命令行提交更改
b. 向 dYdX 储存库提交 PR

c. 等待储存库经理的审批
Last updated
Was this helpful?