Ruka hadi kwenye maudhui makuu

Uhamisho na uidhinishaji wa tokeni za ERC-20 kutoka kwa mkataba-erevu wa solidity

mikataba erevu
tokeni
uimara
erc-20
Wastani
jdourlens
7 Aprili 2020
7 soma ndani ya dakika

Katika somo lililopita tulijifunza anatomia ya tokeni ya ERC-20 katika Solidity kwenye mnyororo wa bloku wa Ethereum. Katika makala hii tutaona jinsi tunavyoweza kutumia mkataba-erevu kuingiliana na tokeni kwa kutumia lugha ya Solidity.

Kwa ajili ya mkataba-erevu huu, tutaunda mfumo halisi wa majaribio wa kubadilishana uliogatuliwa ambapo mtumiaji anaweza kubadilisha ether kwa tokeni yetu mpya ya ERC-20 iliyotumwa.

Kwa somo hili tutatumia msimbo tuliouandika katika somo lililopita kama msingi. DEX yetu itaanzisha mfano wa mkataba katika kiunda chake na kufanya shughuli za:

  • kubadilishana tokeni kwa ether
  • kubadilishana ether kwa tokeni

Tutaanzisha msimbo wetu wa kubadilishana uliogatuliwa kwa kuongeza msimbo wetu rahisi wa ERC20:

Mkataba-erevu wetu mpya wa DEX utatumia ERC-20 na kupata yote yaliyotolewa:

Kwa hiyo sasa tuna DEX yetu na ina hifadhi yote ya tokeni inayopatikana. Mkataba una vipengele viwili:

  • nunua: Mtumiaji anaweza kutuma ether na kupata tokeni badala yake
  • uza: Mtumiaji anaweza kuamua kutuma tokeni ili kurudishiwa ether

Kipengele cha kununua

Tuandike msimbo wa kipengele cha kununua. Kwanza tutahitaji kuangalia kiasi cha ether kilichomo kwenye ujumbe na kuthibitisha kuwa mikataba inamiliki tokeni za kutosha na kwamba ujumbe una kiasi fulani cha ether ndani yake. Ikiwa mkataba unamiliki tokeni za kutosha, utamtumia mtumiaji idadi ya tokeni na kutoa tukio la Bought.

Kumbuka kwamba tukiita kipengele cha require katika kisa cha kosa ether iliyotumwa itarejeshwa moja kwa moja na kurudishwa kwa mtumiaji.

Ili kurahisisha mambo, tunabadilishana tokeni 1 kwa Wei 1.

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "Unahitaji kutuma kiasi fulani cha ether");
    require(amountTobuy <= dexBalance, "Hakuna tokeni za kutosha katika hifadhi");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

Katika hali ambapo ununuzi unafanikiwa tunapaswa kuona matukio mawili katika muamala: Transfer ya tokeni na tukio la Bought.

Matukio mawili katika muamala: Transfer na Bought

Kipengele cha kuuza

Kipengele kinachohusika na uuzaji kwanza kitahitaji mtumiaji awe ameidhinisha kiasi kwa kuita kipengele cha approve kabla. Kuidhinisha uhamisho kunahitaji tokeni ya ERC20Basic iliyoanzishwa na DEX iitwe na mtumiaji. Hii inaweza kufikiwa kwa kwanza kuita kipengele cha token() cha mkataba wa DEX ili kupata anwani ambapo DEX ilituma mkataba wa ERC20Basic unaoitwa token. Kisha tunaunda mfano wa mkataba huo katika kipindi chetu na kuita kipengele chake cha approve. Kisha tunaweza kuita kipengele cha sell cha DEX na kubadilisha tokeni zetu na kupata ether. Kwa mfano, hivi ndivyo inavyoonekana katika kipindi cha maingiliano cha brownie:

Kisha kipengele cha sell kinapoitwa, tutaangalia kama uhamisho kutoka kwa anwani ya mpigaji kwenda kwa anwani ya mkataba ulifanikiwa na kisha tutatuma Ethers kurudi kwa anwani ya mpigaji.

function sell(uint256 amount) public {
    require(amount > 0, "Unahitaji kuuza angalau tokeni kadhaa");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "Angalia ruhusa ya tokeni");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

Ikiwa kila kitu kitafanya kazi unapaswa kuona matukio 2 (Transfer na Sold) katika muamala na salio lako la tokeni na salio la ether likisasishwa.

Matukio mawili katika muamala: Transfer na Sold

Kutoka kwa somo hili tumeona jinsi ya kuangalia salio na ruhusa ya tokeni ya ERC-20 na pia jinsi ya kuita Transfer na TransferFrom ya mkataba-erevu wa ERC20 kwa kutumia kiolesura.

Mara tu unapofanya muamala tuna somo la JavaScript la kusubiri na kupata maelezo kuhusu miamala (opens in a new tab) ambayo ilifanywa kwa mkataba wako na somo la kusimbua matukio yaliyotokana na uhamisho wa tokeni au matukio mengine yoyote (opens in a new tab) mradi tu una ABI.

Huu hapa msimbo kamili wa somo:

Ukurasa ulisasishwa mwisho: 3 Machi 2026

Je, mafunzo haya yalikuwa ya msaada?