Guia técnico sobre a criação de uma proposta de gastos do Tesouro da Comunidade da dYdX
Um guia técnico e passo a passo sobre como criar uma proposta para transferir ethDYDX da tesouraria da comunidade para um endereço de destino.
A Reverie criou um guia técnico e abrangente para enviar uma proposta de governança a fim de transferir $ethDYDX do Tesouro da Comunidade por meio de uma solicitação pull (PR, na sigla em inglês) ao repositório governance-contracts da dYdX.
Para criar essa proposta, um membro da comunidade dYdX precisa ter pelo menos 5 milhões de tokens de governança (0,5% do total da oferta) em poder de proposta (limite de proposta para um voto de timelock curto).
Requisitos preliminares
As etapas a seguir devem ser concluídas antes da solicitação de pull (PR):
Ciclo de vida da proposta: a DRC deve ser postada conforme o modelo de proposta e precisa haver uma votação de Snapshot bem-sucedida.
Endereço de destino: o endereço de destino deve ser gerado com antecedência. Se o endereço de destino for uma carteira multi-sig, ela deve ser criada.
Conta do GitHub: uma conta do GitHub para fazer o fork do repositório.
Valor da transferência (opcional): de preferência, o valor da transferência solicitada precisa ser estabelecido antes do PR. No entanto, se estiver usando um valor referencial, ele poderá ser definido como uma etapa final antes da aprovação.
Hash do IPFS (opcional): se a valor da transferência for conhecido, o DIP deve ser finalizado e enviado para o IPFS a fim de gerar o hash. No entanto, isso pode ser definido em uma etapa final antes da aprovação se o valor ainda não foi determinado.
Como criar a proposta
Faça o fork do repositório governance-contracts da dYdX em sua conta do GitHub.

2. Clone o repositório e altere [username] no seu repositório.
git clone https://github.com/[username]/governance-contracts.git3. Variáveis de configuração
Em src/config/index.ts, adicione duas novas variáveis à constante configSchema que será usada para fins de teste. Nos blocos de código a seguir, altere os campos 'PROPOSAL_NAME' e 'PROPOSAL' para o nome da proposta que será enviada.
Em src/deploy-config/base-config.ts, adicione o endereço de destino e o valor da transferência como novas variáveis na constante config:
Observação: o valor de financiamento precisará ser multiplicado por 10^18 conforme a norma ERC20. Se o valor ainda não for conhecido, um valor temporário pode ser usado (por exemplo, 10 → 10000000000000000000)
Em src/lib/constants.ts, adicione a variável hash IPFS que fará referência à DIP aprovada no outro repositório:
Observação: se a DIP ainda não tiver sido publicada, um valor temporário pode ser usado para testes (por exemplo, ‘0x0000000000000000000000000000000000000000000000000000000000000000’)\
4. Código de proposta
Em src/migrations, crie um novo arquivo com o nome da proposta → proposal-name.ts e preencha o código a seguir:
a. Adicione as importações necessárias no topo:
b. Crie uma nova função usando o nome da proposta abaixo das importações e adicione o código a seguir com duas variáveis exclusivas:
destinationAddress → este será o endereço que recebe os fundos
deployConfig.PROPOSAL_FUNDING_AMOUNT → esta é a variável que criamos anteriormente que determinará valor a ser transferido
5. Tarefa de implantação
Com a proposta criada, podemos escrever a implementação que gerará a transação e os dados de chamada necessários para enviar a proposta.
Em tasks/deployment, crie um novo arquivo com o mesmo nome usado para o código da proposta → proposal-name.ts e preencha-o com o código a seguir:
a. Adicione as importações necessárias com as seguintes variáveis:
DIP_NUMBER_IPFS_HASH → esta é a variável que adicionamos em lib/constants
createProposalNameProposal → esta é a função que criamos em /src/migrations/proposal-name
b. Crie a tarefa hardhat e preencha-a com as informações da proposta na linha de abertura da tarefa. Substitua com o nome da proposta em ‘deploy:proposal-name‘ e substitua por uma breve descrição em ‘Descrição da proposta’.
A última linha chama a função que você importou do código da proposta; portanto, será preciso ajustá-la.
6. Testes de construção
Agora que o código está pronto para a implantação, é hora de fazer alguns testes na proposta. Os testes são feitos localmente usando um fork da mainnet para simular uma proposta que está sendo executada on-chain.
a. Adicionar testes de proposta
Em test/migrations, adicione novamente um novo arquivo com o nome da proposta → proposal-name.ts e inclua o código a seguir:
Adicione as importações necessárias, incluindo as funções da proposta:
createProposalNameProposal → esta é a função que criamos em /src/migrations/proposal-name \
MOCK_PROPOSAL_IPFS_HASH → usaremos um mock hash para fins de teste
Adicione as funções de teste com as etapas a seguir:
fundProposalNameViaProposal → crie esta função e a renomeie para corresponder ao nome da proposta.
destinationAddress → renomeie para corresponder ao nome de destino
deployConfig.PROPOSAL_FUNDING_AMOUNT → isso será substituído pela variável do arquivo base-config
FUND_PROPOSAL_NAME_PROPOSAL_ID → esta é a variável que criamos em config/index.ts
createProposalNameProposal → importe esta função para ser usada
fundProposalNameViaNoProposal → crie esta função e a renomeie para corresponder ao nome da proposta
Execute o código abaixo para substituir todas essas variáveis pelo nome da proposta e variáveis existentes já criadas acima:
b. Adicione funções de testes para teste de script
Em test/migrations/deploy-contracts-for-test.ts, vamos adicionar as funções criadas acima para que elas sejam incluídas em nossos testes:
Importar as funções criadas
Adicione testes para ambas as funções criando uma função de testes geral → executeProposalNameProposalForTest, substitua o nome para corresponder à proposta
Também chamamos a variável config TEST_PROPOSAL_NAME_TRUST_WITH_PROPOSAL criada anteriormente e a PROPOSAL_NAME_ADDRESS de deployConfig
c. Adicione o contrato aos assistentes de testes
Em test/helpers/get-deployed-contracts-for-test.ts, adicione a função criada acima para que os testes sejam executados nos testes do fork da mainnet:
Importe a função executeProposalNameProposalForTest do arquivo de migrações:
Adicione a função à função getDeployedContractsForTest(), fora do último else loop:
d. Arquivo de teste final
Por fim, adicionamos um teste da hash de IPFS e o saldo da carteira multisig após a proposta mock para garantir que tudo se dê conforme o esperado.
Em test/misc, adicione um novo arquivo com o nome da proposta rotulado → proposal-name-proposal.spec.ts e preencha-o com estes dois testes:
Importamos o Hash IPFS da biblioteca por meio de DIP_NUMBER_IPFS_HASH
Colocamos direto no código o número de proposalId seguinte usando ProposalNameId
Conferimos a hash da proposta com a constante Hash
Verificamos PROPOSAL_NAME_ADDRESS para conferir se há um saldo esperado em PROPOSAL_FUNDING_AMOUNT
Observação: se este endereço já tiver DYDX, você precisará colocar o saldo direto no código para que o teste passe
7. Envio do PR
Quando todas essas alterações de código forem feitas e salvas localmente, poderemos enviar o commit ao fork do repositório e abrir um PR para o repositório dYdX, para revisão:
a. Faça o commit das alterações pela linha de comando
b. Envie um PR para repositório da dYdX

c. Aguarde a análise e aprovação do gerenciador de repositórios
Last updated