dYdX Topluluk Hazinesi Harcama Teklifi Oluşturmak için Teknik Kılavuz

Topluluk hazinesinden bir hedef adrese ethDYDX aktarmak için bir teklifin nasıl oluşturulacağına dair teknik, adım adım bir kılavuz.

Reverie, Topluluk Hazinesinden $ethDYDX aktarmak amacıyla, dYdX yönetişim sözleşmeleri repository'sine bir Çekme İsteği (PR) yaparak bir yönetişim teklifi gönderilmesi hakkında kapsamlı, teknik bir kılavuz hazırladı.

Bu teklifi oluşturabilmesi için bir dYdX topluluğu üyesinin teklif gücünün en az, short timelock oylama için teklif eşiği olan 5 milyon Yönetişim Token'ına (toplam arzın %0,5'i) sahip olması gerekir.

Ön Koşullar

Çekme Talebi (PR) tamamlanmadan önce aşağıdaki adımlar tamamlanmalıdır:

  1. Teklif Yaşam Döngüsü: Teklif şablonunun ardından DRC gönderilmeli ve başarılı bir Snapshot oylaması gerçekleştirilmelidir.

  2. Hedef Adresi: Hedef adresi, zamanı gelmeden oluşturulmalıdır. Hedef adresi bir multi-sig (çok imzalı adres) ise, multi-sig cüzdanı oluşturulmalıdır.

  3. GitHub hesabı: Repository'yi fork etmek için bir GitHub hesabı.

  4. Transfer Miktarı (İsteğe Bağlı): Tercihen PR öncesinde istenen transfer miktarı belirlenmelidir. Ancak bu, itibari (notional) bir miktar kullanılıyorsa onay öncesinde son adım olarak belirlenebilir.

  5. DIP IPFS Karması (İsteğe Bağlı): Transfer miktarı biliniyorsa DIP kesinleştirilip IPFS'ye push edilerek karması (hash) oluşturulmalıdır. Bununla birlikte, miktar henüz belirlenmemişse, onay öncesinde son adımda belirlenebilir.

Teklifin Oluşturulması

  1. dYdX yönetişim-sözleşmeleri repository'sini GitHub hesabınıza fork edin.

2. Repository'yi klonlayın ve [kullanıcı adı] kısmını kendi kullanıcı adınızla değiştirin.

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

3. Yapılandırma Değişkenleri

src/config/index.ts dosyasında test amaçları için kullanılacak configSchema sabitine iki yeni değişken ekleyin. Aşağıdaki kod bloklarında 'PROPOSAL_NAME' ve 'PROPOSAL' alanlarını gönderilecek teklifin adı olarak değiştirin.

src/deploy-config/base-config.ts dosyasında, config sabitine iki yeni değişken olarak hedef adresini ve transfer miktarını ekleyin:

Not: ERC20 standardı gereğince fonlama miktarının 10^18 ile çarpılması gerekecektir. Miktar henüz bilinmiyorsa, geçici bir miktar kullanılabilir (ör. 10 → 10000000000000000000)

src/lib/constants.ts dosyasına, diğer repository'de onaylanan DIP'ye referans verecek IPFS karma değişkenini ekleyin:

Not: DIP henüz yayınlanmadıysa test için geçici bir değer kullanılabilir (ör. ‘0x0000000000000000000000000000000000000000000000000000000000000000’)\

4. Teklif kodu

src/migrations dizininde teklifin adını taşıyan yeni bir dosya oluşturun → teklifin-adı.ts ve bu dosyaya aşağıdaki kodu ekleyin:

a. En üste gereken importları ekleyin:

b. İmportların altında teklifin adını kullanarak yeni bir fonksiyon oluşturun ve şu iki benzersiz değişkeni içeren aşağıdaki kodu ekleyin:

  • destinationAddress → bu, varlığı (parayı, fonu) alan adres olacaktır

  • deployConfig.PROPOSAL_FUNDING_AMOUNT → bu, daha önce oluşturduğumuz ve aktarılacak miktarı belirleyecek değişkendir

5. Deployment (Devreye Alma) Görevi

Teklif oluşturulduktan sonra teklifin gönderilmesi için gereken işlemi ve çağrı verilerini (calldata) oluşturacak deployment'ı yazabiliriz.

tasks/deployment dizininde teklif kodu için kullanılanla aynı adı taşıyan yeni bir dosya oluşturun → teklifin-adı.ts ve içine aşağıdaki kodu ekleyin:

a. Aşağıdaki değişkenlerle beraber gereken importları ekleyin:

DIP_NUMBER_IPFS_HASH → bu, lib/constants içine eklediğimiz değişkendir

createProposalNameProposal → bu, /src/migrations/teklifin-adı içinde oluşturduğumuz fonksiyondur

b. Hardhat görevini oluşturun ve içine görev açılış satırındaki teklif bilgilerini ekleyin. ‘deploy:proposal-name:‘in yerine teklifin adını girin ve ‘Proposal Description’ın yerine kısa bir açıklama girin.

Son satırda, teklif kodundan import ettiğiniz fonksiyon çağrılır, bu nedenle bunun da değiştirilmesi gerekir.

6. Testlerin hazırlanması

Kod devreye alıma (deployment) hazır olduğuna göre, artık teklif üzerinde bazı testler oluşturma zamanı geldi. Testler hem yerel olarak yapılır, hem de zincir üzerinde yürütülen bir teklifi simüle etmek için bir mainnet forku kullanılarak yapılır.

a. Teklif Testleri Ekleyin

test/migrations dizininde teklifin adını taşıyan yeni bir dosya oluşturun → teklifin-adı.ts ve içine aşağıdaki kodu ekleyin:

  • Teklif fonksiyonları dahil olmak üzere gereken importları ekleyin:

createProposalNameProposal → bu, /src/migrations/teklifin-adı içinde oluşturduğumuz fonksiyondur. \

MOCK_PROPOSAL_IPFS_HASH → test için bir sahte (mock) karma (hash) kullanacağız

  • Test fonksiyonlarını aşağıdaki adımlarla ekleyin:

    • fundProposalNameViaProposal → bu fonksiyonu oluşturun ve adını teklifin adına uyacak şekilde değiştirin.

    • destinationAddress → hedefin adına uyacak şekilde adını değiştirin

    • deployConfig.PROPOSAL_FUNDING_AMOUNT → bu, base-config dosyasındaki değişkenle değiştirilmelidir

    • FUND_PROPOSAL_NAME_PROPOSAL_ID → bu, config/index.ts içinde oluşturduğumuz değişkendir

    • createProposalNameProposal → bu fonksiyonu, kullanılması için yukarıda import etmiştik

    • fundProposalNameViaNoProposal → bu fonksiyonu oluşturun ve adını teklifin adına uyacak şekilde değiştirin

Aşağıdaki kodu gözden geçirin ve buradaki tüm değişkenleri, teklifin adıyla ve yukarıda oluşturulmuş mevcut değişkenler ile değiştirin:

b. Test Komut Dizisine (Test Script) Test Fonksiyonlarını Ekleyin

test/migrations/deploy-contracts-for-test.ts dosyasının içine yukarıda oluşturulan fonksiyonları ekleyerek testlerimize dahil edeceğiz:

  • Oluşturulan fonksiyonları import edin

  • Genel bir test fonksiyonu oluşturarak her iki fonksiyon için de testler ekleyin → executeProposalNameProposalForTest; bu fonksiyonun adını teklif adı ile uyacak şekilde değiştirin

  • Ayrıca daha önce oluşturulan config değişkeni TEST_PROPOSAL_NAME_TRUST_WITH_PROPOSAL'ı ve deployConfig'den PROPOSAL_NAME_ADDRESS'i çağıracağız

c. Test yardımcılarına sözleşme ekleyin

test/helpers/get-deployed-contracts-for-test.ts dosyasına yukarıda oluşturulan fonksiyonu ekleyerek testlerin mainnet fork testinde çalıştırılmasını sağlayın:

  • migrations dosyasından executeProposalNameProposalForTest fonksiyonunu import edin:

  • Bu fonksiyonu son else döngüsünün dışında, getDeployedContractsForTest() fonksiyonuna ekleyin:

d. En Son Test dosyası

Son olarak, her şeyin beklendiği gibi sonuçlanmasını sağlamak için sahte (mock) tekliften sonra hem IPFS karması hem de multisig bakiyesi (balance) için bir test ekliyoruz.

test/misc dizinine teklifin adı ile etiketlenmiş yeni bir dosya ekleyin → teklifin-adı-proposal.spec.ts ve dosya içine aşağıdaki iki testi ekleyin:

  1. DIP_NUMBER_IPFS_HASH üzerinden lib'deki IPFS Hash'i import ediyoruz

  2. ProposalNameId'yi kullanarak bir sonraki proposalId numarasını doğrudan kodun içine ekliyoruz

  3. teklif karmasının sabit Karma'ya eşit olup olmadığını kontrol ediyoruz

  4. PROPOSAL_NAME_ADDRESS içindeki bakiyenin (balance) beklendiği gibi PROPOSAL_FUNDING_AMOUNT bakiyesine (balance) eşit olup olmadığını kontrol ediyoruz

Not: Bu adreste zaten DYDX varsa testten geçmek için bakiyeye (balance) doğrudan kodun içine eklemeniz gerekecektir

7. PR (Pull Request) gönderilmesi

Tüm bu kod değişiklikleri yapılıp yerel olarak kaydedildikten sonra, fork edilen repository'ye commit yapabilir ve gözden geçirilmesi için dYdX repository'sine bir PR gönderebiliriz:

a. Değişiklikleri komut satırından commit edin

b. dYdX repository'sine bir PR gönderin

c. Repository yöneticisinin kontrol ve onayını bekleyin

Last updated