Python ile Merkeziyetsiz Piyasalarda Borç Alıp Borç Verme II
İkinci bölüme hoş geldiniz! Kaldığımız yerden devam edelim.
Dizin üzerinde aşağıdaki kodu çalıştırın.
brownie run scripts/aave_borrow.py --network kovan
Burada hata alırsanız, şuraya gidip benim yöntemi uygulayın. İlk kod ile başlayalım.
def main():
account = get_account()
erc20_address = config["networks"][network.show_active()]["weth_token"]
if network.show_active() in ["mainnet-fork"]:
get_weth(account=account)
lending_pool = get_lending_pool()
WETH token kontrat adresine ulaşıyoruz. WETH bakiyemizi görüyoruz.
Sonrasında borç verme kontratına (lending_pool) bağlanıyoruz.
Şimdi get_lending_pool fonksiyonuna bakalım.
def get_lending_pool():
lending_pool_addresses_provider = interface.ILendingPoolAddressesProvider(
config["networks"][network.show_active(
)]["lending_poll_addresses_provider"]
)
lending_pool_address = lending_pool_addresses_provider.getLendingPool()
lending_pool = interface.ILendingPool(lending_pool_address)
return lending_pool
Smart kontratlarda 2 şeyi unutmuyoruz.
1-ABI/Interfaces
2-Adres
Borç verme havuzunun interfacesi, interfaces klasörünün içindedir.
Adresleri ise,getLendingPool dan çekiyoruz.
Şimdi işin mantığına dönelim.
WETH leri sisteme teminat olarak vereceğiz.
- Bundan Likidite Sağlayıcılarının kazandığı gibi fee kazanacağız
- Hem de bu teminat karşılığında kredi alacağız.(Teminatınızın miktarı>Alacağınız kredi)
- Duruma göre AAVE tokenı, verdiğimiz teminat ölçüsünde bize verilecek.
approve_erc20
fonksiyonunu çağırıyoruz.
def approve_erc20(amount, lending_pool_address, erc20_address, account):
print("Approving ERC20...")
erc20 = interface.IERC20(erc20_address)
tx_hash = erc20.approve(lending_pool_address, amount, {"from": account})
tx_hash.wait(1)
account: Bizim adresimiz
erc20_address: Token adresimiz
lending_pool_address: Borç verme havuzun adresi
amount: Göndermek istediğimiz tutar
erc20 değişkenine erc20'nin interfaceni atayıp, havuzdan onay alacağız.Terminalden yada kovandan işlem sırasını kontrol ettiğiniz ilk olarak WETH kontratına gittiğimizi göreceksiniz.
print("Approved!")
Şimdi lending havuzundan onay aldık.
lending_pool.deposit(erc20_address, amount, account.address, 0, {“from”: account})
print(“Deposited!”)
Teminatımızı havuza yatırdık. Deposited!
Şimdi Kovan üzerinden bakalım.
- İlk işlemde yatıracağımız weth için sistemde atoken yaratıldı.
- İkinci işlemde 0.1 WETH’i, AAVE’nin havuzuna(aWETH) yolladık.
- Son işlemde bize yatırdığımız WETH kadar atoken (aWETH) verildi.
Burada eğer ikinci işlemdeki linke tıklarsanız (0x87b….) AAVE’nin aWETH havuzuna gönderdiğimiz weth i göreceksiniz. Linke tıkladığımızda Method “deposit” olarak görülüyor. Quantity 0.1.
Dikkat bu atoken, bizim paramız burada olduğu sürece bize ait. Bu sistemden çıktığımızda bu para geri alınacak(burn).
Metamask üzerinde jeton ekleye basarak, şu adresi girin 0x87b1f4cf9bd63f7bbd3ee1ad04e8f52540349347
elinizdeki atoken miktarını göreceksiniz.
BORÇ ALIYORUZ?
Bu denklem şunu anlatıyor. Threshold 1 iken; teminat verdiğiniz ETH, borçlandığınız ETH kadar yada daha fazla olmalı . Health katsayısı >1.
get_borrowable_data
fonksiyonunu çağırıyoruz. Tüm hesaplamalar bunun içinde.
def get_borrowable_data(lending_pool, account):
(
total_collateral_eth,
total_debt_eth,
available_borrow_eth,
current_liquidation_threshold,
tlv,
health_factor,
) = lending_pool.getUserAccountData(account.address)
available_borrow_eth = Web3.fromWei(available_borrow_eth, "ether")
total_collateral_eth = Web3.fromWei(total_collateral_eth, "ether")
total_debt_eth = Web3.fromWei(total_debt_eth, "ether")
print(f"You have {total_collateral_eth} worth of ETH deposited.")
print(f"You have {total_debt_eth} worth of ETH borrowed.")
print(f"You can borrow {available_borrow_eth} worth of ETH.")
return (float(available_borrow_eth), float(total_debt_eth))
Benim terminaldeki sonucu şu şekilde.
Artık borçlanalım, tüm rasyolar hesaplandı.
borrowable_eth, total_debt_eth = get_borrowable_data(lending_pool, account)
print(f"LETS BORROW IT ALL")
erc20_eth_price = get_asset_price()
amount_erc20_to_borrow = (1 / erc20_eth_price) * (borrowable_eth * 0.95)
print(f"We are going to borrow {amount_erc20_to_borrow} DAI")
borrow_erc20(lending_pool, amount_erc20_to_borrow, account)
Görüldüğü üzere DAI borçlanacağız. Fakat ETH/DAI kurunu nereden çekiyoruz?
def get_asset_price():
# For mainnet we can just do:
# return Contract(f"{pair}.data.eth").latestAnswer() / 1e8
dai_eth_price_feed = interface.AggregatorV3Interface(
config["networks"][network.show_active()]["dai_eth_price_feed"]
)
latest_price = Web3.fromWei(dai_eth_price_feed.latestRoundData()[1], "ether")
print(f"The DAI/ETH price is {latest_price}")
return float(latest_price)
Benim terminalde kur ve eth karşılığı şu şekilde .
Artık borçlanalım !
def borrow_erc20(lending_pool, amount, account, erc20_address=None):
erc20_address = (
erc20_address
if erc20_address
else config["networks"][network.show_active()]["aave_dai_token"]
)
# 1 is stable interest rate
# 0 is the referral code
transaction = lending_pool.borrow(
erc20_address,
Web3.toWei(amount, "ether"),
1,
0,
account.address,
{"from": account},
)
transaction.wait(1)
print(f"Congratulations! We have just borrowed {amount}")
Şimdi Kovan’a bakalım!
Neler oldu?
- AAVE, aDAI token’ı yarattı. aWETH gibi düşünün.
- Aave Stable Debt Bearing DAI yaratıldı
- Aave Stable Debt Bearing DAI son işlemde DAI’ye dönüştürülerek bize verildi.
BORCU KAPATIYORUZ?
def repay_all(amount, lending_pool, account):
approve_erc20(
Web3.toWei(amount, "ether"),
lending_pool,
config["networks"][network.show_active()]["aave_dai_token"],
account,
)
tx = lending_pool.repay(
config["networks"][network.show_active()]["aave_dai_token"],
Web3.toWei(amount, "ether"),
1,
account.address,
{"from": account},
)
tx.wait(1)
print("Repaid!")
25.06.2021
Dr. Engin YILMAZ
Ankara