Ana içeriğe atla

Bir Solidity akıllı sözleşmesinden ERC-20 Token transferleri ve onayları

akıllı sözleşmeler
token'lar
Solidity
erc-20
Orta
jdourlens
7 Nisan 2020
6 dakikalık okuma

Önceki eğitimde Ethereum Blokzincir üzerinde Solidity'de bir ERC-20 Token'ının anatomisini incelemiştik. Bu makalede, Solidity dilini kullanarak bir Token ile etkileşime girmek için bir akıllı sözleşmeyi nasıl kullanabileceğimizi göreceğiz.

Bu akıllı sözleşme için, bir kullanıcının yeni dağıttığımız ERC-20 Token'ı karşılığında Ether takas edebileceği gerçek bir sahte merkeziyetsiz borsa (DEX) oluşturacağız.

Bu eğitim için önceki eğitimde yazdığımız kodu temel olarak kullanacağız. DEX'imiz, kurucu (constructor) içinde sözleşmenin bir örneğini oluşturacak ve şu işlemleri gerçekleştirecektir:

  • Token'ları Ether ile takas etmek
  • Ether'i Token'lar ile takas etmek

Basit ERC20 kod tabanımızı ekleyerek Merkeziyetsiz borsa kodumuza başlayacağız:

Yeni DEX akıllı sözleşmemiz ERC-20'yi dağıtacak ve sağlanan tüm arzı alacaktır:

Böylece artık DEX'imize sahibiz ve tüm Token rezervi mevcut. Sözleşmenin iki işlevi vardır:

  • buy: Kullanıcı Ether gönderip karşılığında Token alabilir
  • sell: Kullanıcı Ether'i geri almak için Token göndermeye karar verebilir

Satın alma (buy) işlevi

Satın alma işlevini kodlayalım. İlk olarak mesajın içerdiği Ether miktarını kontrol etmemiz, sözleşmelerin yeterli Token'a sahip olduğunu ve mesajın bir miktar Ether içerdiğini doğrulamamız gerekecek. Sözleşme yeterli Token'a sahipse, kullanıcıya Token miktarını gönderecek ve Bought olayını (event) yayınlayacaktır.

Bir hata durumunda require işlevini çağırırsak, gönderilen Ether'in doğrudan geri alınacağını (revert) ve kullanıcıya geri verileceğini unutmayın.

İşleri basit tutmak için, sadece 1 Token'ı 1 Wei ile takas ediyoruz.

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "You need to send some ether");
    require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

Satın alma işleminin başarılı olması durumunda işlemde iki olay görmeliyiz: Token Transfer ve Bought olayı.

Two events in the transaction: Transfer and Bought

Satış (sell) işlevi

Satıştan sorumlu işlev, ilk olarak kullanıcının önceden approve işlevini çağırarak miktarı onaylamasını gerektirecektir. Transferi onaylamak, DEX tarafından örneği oluşturulan ERC20Basic Token'ının kullanıcı tarafından çağrılmasını gerektirir. Bu, DEX'in token adlı ERC20Basic sözleşmesini dağıttığı Adresi almak için önce DEX sözleşmesinin token() işlevini çağırarak elde edilebilir. Ardından oturumumuzda bu sözleşmenin bir örneğini oluştururuz ve onun approve işlevini çağırırız. Daha sonra DEX'in sell işlevini çağırabilir ve Token'larımızı tekrar Ether ile takas edebiliriz. Örneğin, etkileşimli bir Brownie oturumunda bu şu şekilde görünür:

Ardından satış işlevi çağrıldığında, çağıran Adresten sözleşme Adresine yapılan transferin başarılı olup olmadığını kontrol edeceğiz ve ardından Ether'leri çağıran Adrese geri göndereceğiz.

function sell(uint256 amount) public {
    require(amount > 0, "You need to sell at least some tokens");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "Check the token allowance");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

Her şey çalışırsa, işlemde 2 olay (bir Transfer ve Sold) görmelisiniz ve Token bakiyeniz ile Ether bakiyeniz güncellenmiş olmalıdır.

Two events in the transaction: Transfer and Sold


Bu eğitimden, bir ERC-20 Token'ının bakiyesini ve harcama iznini (allowance) nasıl kontrol edeceğimizi ve ayrıca arayüzü kullanarak bir ERC20 akıllı sözleşmesinin Transfer ve TransferFrom işlevlerini nasıl çağıracağımızı gördük.

Bir işlem yaptıktan sonra, sözleşmenize yapılan işlemleri beklemek ve bunlar hakkında ayrıntılı bilgi almak (opens in a new tab) için bir JavaScript eğitimimiz ve ABI'ye sahip olduğunuz sürece Token transferleri veya diğer olaylar tarafından oluşturulan olayları çözmek için bir eğitimimiz (opens in a new tab) bulunmaktadır.

İşte eğitimin tam kodu: