Akıllı Kontratta Gelir Paylaşmı (Solidity, Openzeppelin)

Eray USTA
3 min readMar 28, 2022

--

Çoğu zaman Crypto / NFT projeleri üzerinde firmalar veya kişiler arası işbirliği yapılır. Anlaşmalar ve vaatler, sözlü kullanmak yerine, ekip projeden elde edilen geliri doğrudan akıllı sözleşmede bölerek katılan herkesi koruyabilir.

Örneğin NFT projeniz var ve mint süreci sonrası kontrattaki parayı bölüştürmek istiyorsunuz. Bu yöntem tam olarak bunu çözmeye yardımcı olacaktır.

OpenZepplin Kullanalım

Tekerleği yeniden icat etmeye gerek olmadığını düşünüyorum. Akıllı sözleşmenizde mevcut desteklenen kütüphaneleri kullanın hem daha güvenli hem de daha az iş gücü harcamış olacaksınız.

npm install @openzepplin/contracts

Kütüphaneyi Dahil Edelim

Gelir paylaşımı ve ihtiyacınız olan tüm işlevsellik : PaymentSplitter isimli sözleşmede yer alır.

PaymentSplitter, Ether ve ERC20 ödemelerinin bir grup hesap arasında bölünmesine olanak tanır. Sözleşme tarafından şeffaf bir şekilde ele alındığından, gönderenin varlıkların bu şekilde bölüneceğini bilmesine gerek yoktur. Bölünme, eşit parçalarda veya herhangi bir keyfi oranda olabilir.

PaymentSplitter sözleşmesi, payları/hisseleri cüzdanlar arasında bölmek için ihtiyaç duyduğunuz yöntemleri içerir. Tek yapmanız gereken, sözleşme oluşturulduğunda kurucuya bir dizi cüzdan ve bir dizi hisse/pay iletmektir.

İsteğe bağlı olarak, gelecekte daha fazla paylaşım eklemek isterseniz, _addPayee özel yöntemini çağıran genel yöntemler yazmanız gerekebilir.

Örnek Kontrat Yazalım

pragma solidity ^0.8.4;import "@openzeppelin/contracts/finance/PaymentSplitter.sol";contract Example is PaymentSplitter {
constructor(
address[] memory payees,
uint256[] memory shares
) PaymentSplitter(payees, shares) {}
}

PaymentSplitter sözleşmesini, akıllı sözleşmenize dahil edin ve constructor da onu çağırın. Daha sonra deploy scriptinde pay bölünecek adresleri ve paylarını yazabilirsiniz. Örneğin aşağıdaki örnekte be 3 cüzdana farklı oranlarda böldüm.

Bölünme, eşit parçalarda veya herhangi bir keyfi oranda olabilir. Bunun belirtilme şekli, her hesabı bir dizi hisseye atamaktır. Bu sözleşmenin aldığı tüm Ether’den her hesap, atandıkları toplam hisse yüzdesiyle orantılı bir miktar talep edebilecektir.

PaymentSplitter, bir çekme ödeme modelini takip eder. Bu, ödemelerin otomatik olarak hesaplara iletilmediği, ancak bu sözleşmede tutulduğu ve serbest bırakma işlevi çağrılarak fiili transferin ayrı bir adım olarak tetiklendiği anlamına gelir.

Aşağıdaki deploy kodu örneğinde 3 cüzdana yüzde 20,50 ve 10 olarak payı dağıtmış olduk. Fakat bu gelen parayı hemen bölüştürmeyecek daha sonra withdraw ile kişinin kendi payı kadar olan kısmı alabilmesini sağlayacak.

const Contract = await hre.ethers.getContractFactory('Example')const payees = [
ethers.utils.getAddress('0x...'), // 20%
ethers.utils.getAddress('0x...'), // 50%
ethers.utils.getAddress('0x...'), // 10%
]
const shares = [20, 50, 10]const Example = await Contract.deploy(payees, shares)await Example.deployed()console.log('Contract deployed to: ', Example.address)

Release, Bir cüzdan adresini alan genel bir yöntem sürümü vardır. Adresin hisseleri varsa, uygun miktar o cüzdana bırakılacaktır. Toplam hisse yüzdelerine ve önceki para çekme işlemlerine göre borçlu oldukları Ether miktarını hesaba aktarmayı tetikler. Haliyle bir hesabın sürekli kendi payını çekip kasanın içini boşaltmasının önüne geçilmiş olur.

Kaynak: https://medium.com/codex/how-to-use-openzeppelins-paymentsplitter-8ba8de09dbf

Kaynak 2: https://medium.com/cryptostars/solidity-tutorial-revenue-sharing-using-openzeppelin-380931c1eb1d

--

--