Python ile Merkeziyetsiz Piyasalarda Borç Alıp Borç Verme II

Solidity Programming Language
4 min readJun 24, 2021

--

https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/

İ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.

https://kovan.etherscan.io/tx/0xd248a13296422f101598e66a26fd0e85bfec4eb1ffc4d2ec8e866ca07707645a
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!

https://kovan.etherscan.io/tx/0x27ed12e206c2965203bb3fe5bb823ec211da1315c4f44bd39f2b32bd5b7dd3dc

Şimdi Kovan üzerinden bakalım.

https://kovan.etherscan.io/tx/0x27ed12e206c2965203bb3fe5bb823ec211da1315c4f44bd39f2b32bd5b7dd3dc
  • İ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.

https://kovan.etherscan.io/token/0xd0a1e359811322d97991e03f863a0c30c2cf029c?a=0x87b1f4cf9bd63f7bbd3ee1ad04e8f52540349347

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?

Health Factor Equation

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.

terminal

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 .

terminal

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}")
terminal

Şimdi Kovan’a bakalım!

https://kovan.etherscan.io/tx/0x0a0c2c693c311615e5a952a988d1cf6d2125e4664e84d98ed7aced684f5994eb

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.
terminal

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!")
https://kovan.etherscan.io/tx/0xd8947029ba929ca2713562c12ccead0118aba1d5fb15e32ccdc210bd6b8cd231

25.06.2021

Dr. Engin YILMAZ

Ankara

--

--

Solidity Programming Language
Solidity Programming Language

Written by Solidity Programming Language

Solidity basics for beginners: Learn the fundamentals of smart contract development and build your first DApp! #Solidity #Foundry #Ethereum #Opcodes #DApps

No responses yet