Ana içeriğe atla

Bir Solidity akıllı sözleşmesinden ERC-20 jetonlarının transferleri ve onaylanması

akıllı kontratlar
token'lar
solidity
erc-20
Orta düzey
jdourlens
7 Nisan 2020
6 dakikalık okuma

Önceki öğreticide, Ethereum blokzincirindeki bir ERC-20 jetonunun Solidity'deki anatomisi üzerine çalıştık. Bu makalede, bir akıllı sözleşmeyi bir jetonla etkileşime geçmek için Solidity diliyle nasıl kullanabileceğimizi göreceğiz.

Bu akıllı sözleşme için, bir kullanıcının yeni dağıtılan ERC-20 jetonumuz karşılığında ether takas edebileceği, deneme amaçlı bir merkeziyetsiz borsa oluşturacağız.

Bu öğreticide, önceki öğreticide yazdığımız kodu temel olarak kullanacağız. Merkeziyetsiz borsamız (DEX), kurucusunda sözleşmenin bir örneğini oluşturacak ve aşağıdaki işlemleri gerçekleştirecektir:

  • jetonları ether ile takas etme
  • ether'ı jetonlar ile takas etme

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

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

Böylece artık kendi DEX'imiz var ve mevcut tüm jeton rezervine sahip. Sözleşmenin iki fonksiyonu vardır:

  • buy: Kullanıcı ether gönderip karşılığında jeton alabilir
  • sell: Kullanıcı, ether'larını geri almak için jeton göndermeyi seçebilir

Satın alma fonksiyonu

buy fonksiyonunu kodlayalım. Öncelikle mesajın içerdiği ether miktarını kontrol etmemiz ve sözleşmelerin yeterli jetona sahip olduğunu ve mesajda bir miktar ether bulunduğunu doğrulamamız gerekecek. Sözleşme yeterli jetona sahipse, kullanıcıya ilgili sayıda jetonu gönderir ve Bought olayını yayar.

Bir hata durumunda require fonksiyonunu çağırırsak gönderilen ether'in doğrudan geri çevrileceğini ve kullanıcıya iade edileceğini unutmayın.

İşleri basitleştirmek için, 1 jetonu 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ı olduğu durumda, işlemde iki olay görmeliyiz: Jeton Transfer olayı ve Bought olayı.

İşlemdeki iki olay: Transfer ve Bought

Satış fonksiyonu

Satıştan sorumlu fonksiyon, öncelikle kullanıcının approve (onaylama) fonksiyonunu önceden çağırarak miktarı onaylamış olmasını gerektirecektir. Transferin onaylanması, DEX tarafından örneği oluşturulan ERC20Basic jetonunun 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() fonksiyonu çağrılarak sağlanabilir. Ardından, oturumumuzda bu sözleşmenin bir örneğini oluşturur ve approve fonksiyonunu çağırırız. Ardından DEX'in sell fonksiyonunu çağırabilir ve jetonlarımızı tekrar ether ile takas edebiliriz. Örneğin, etkileşimli bir brownie oturumunda bu şöyle görünür:

Ardından sell fonksiyonu çağrıldığında, çağıranın adresinden sözleşme adresine transferin başarılı olup olmadığını kontrol edecek ve ardından ether'i çağıranın adresine 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 yolunda giderse, işlemde 2 olay (Transfer ve Sold) görmeli ve jeton bakiyeniz ile ether bakiyenizin güncellendiğini görmelisiniz.

İşlemdeki iki olay: Transfer ve Sold

Bu öğreticide, bir ERC-20 jetonunun 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 fonksiyonlarını nasıl çağıracağımızı gördük.

Bir işlem gerçekleştirdiğinizde, sözleşmenize yapılan işlemlerin tamamlanmasını beklemek ve ayrıntılarını almak (opens in a new tab) ve ABI'niz olduğu sürece jeton transferleri veya diğer herhangi bir olay tarafından oluşturulan olayların kodunu çözmek (opens in a new tab) için bir JavaScript öğreticimiz var.

Öğreticinin tam kodu aşağıdadır:

Sayfanın son güncellenme tarihi: 3 Mart 2026

Bu eğitim faydalı oldu mu?