Přejít na hlavní obsah

Převody a schválení tokenů ERC-20 z chytrého kontraktu v Solidity

smart kontrakt účty
tokeny
solidity
erc-20
Středně pokročilý
jdourlens
7. dubna 2020
6 minuta čtení

V předchozím tutoriálu jsme prostudovali anatomii tokenu ERC-20 v Solidity na blockchainu Etherea. V tomto článku si ukážeme, jak můžeme použít chytrý kontrakt k interakci s tokenem pomocí jazyka Solidity.

Pro tento chytrý kontrakt vytvoříme skutečnou zkušební decentralizovanou burzu, kde může uživatel směňovat ether za náš nově nasazený token ERC-20.

Pro tento tutoriál použijeme kód, který jsme napsali v předchozím tutoriálu, jako základ. Naše DEX vytvoří instanci kontraktu ve svém konstruktoru a provede následující operace:

  • směna tokenů za ether
  • směna etheru za tokeny

Začneme s kódem naší decentralizované burzy přidáním naší jednoduché kódové základny ERC20:

Náš nový chytrý kontrakt DEX nasadí ERC-20 a získá všechny dodané:

Takže nyní máme naši DEX a ta má k dispozici celou rezervu tokenů. Kontrakt má dvě funkce:

  • buy: Uživatel může poslat ether a na oplátku dostat tokeny
  • sell: Uživatel se může rozhodnout poslat tokeny, aby dostal zpět ether

Funkce buy

Naprogramujme funkci buy. Nejprve budeme muset zkontrolovat množství etheru, které zpráva obsahuje, a ověřit, že kontrakt vlastní dostatek tokenů a že zpráva obsahuje nějaký ether. Pokud kontrakt vlastní dostatek tokenů, pošle počet tokenů uživateli a vyšle událost Bought.

Všimněte si, že pokud v případě chyby zavoláme funkci require, zaslaný ether bude přímo vrácen a navrácen uživateli.

Pro zjednodušení směníme 1 token za 1 wei.

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "Musíte poslat nějaký ether");
    require(amountTobuy <= dexBalance, "Nedostatek tokenů v rezervě");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

V případě, že je nákup úspěšný, měli bychom v transakci vidět dvě události: událost Transfer tokenu a událost Bought.

Dvě události v transakci: Transfer a Bought

Funkce sell

Funkce zodpovědná za prodej bude nejprve vyžadovat, aby uživatel schválil částku tím, že předem zavolá funkci approve. Schválení převodu vyžaduje, aby uživatel zavolal token ERC20Basic, který byl vytvořen DEXem. Toho lze dosáhnout tím, že nejprve zavoláte funkci token() kontraktu DEX, abyste získali adresu, kam DEX nasadila kontrakt ERC20Basic nazvaný token. Poté v naší relaci vytvoříme instanci tohoto kontraktu a zavoláme jeho funkci approve. Poté jsme schopni zavolat funkci sell DEXu a směnit naše tokeny zpět za ether. Například takhle to vypadá v interaktivní relaci brownie:

Poté, když je zavolána funkce sell, zkontrolujeme, zda byl převod z adresy volajícího na adresu kontraktu úspěšný, a poté pošleme ether zpět na adresu volajícího.

function sell(uint256 amount) public {
    require(amount > 0, "Musíte prodat alespoň nějaké tokeny");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "Zkontrolujte povolenou částku tokenu");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

Pokud vše funguje, měli byste v transakci vidět 2 události (Transfer a Sold) a váš zůstatek tokenů a etheru by měl být aktualizován.

Dvě události v transakci: Transfer a Sold

V tomto tutoriálu jsme viděli, jak zkontrolovat zůstatek a povolenou částku tokenu ERC-20 a také jak volat Transfer a TransferFrom chytrého kontraktu ERC20 pomocí rozhraní.

Jakmile provedete transakci, máme JavaScriptový tutoriál, jak počkat a získat podrobnosti o transakcích (opens in a new tab), které byly provedeny na vašem kontraktu, a tutoriál pro dekódování událostí generovaných převody tokenů nebo jinými událostmi (opens in a new tab), pokud máte ABI.

Zde je kompletní kód k tutoriálu:

Poslední aktualizace stránky: 3. března 2026

Byl tento návod užitečný?