Skip to content

Instantly share code, notes, and snippets.

@algolog
Created December 12, 2024 16:27
Show Gist options
  • Save algolog/ada96d7c53dc19187a4e5b2987f7065a to your computer and use it in GitHub Desktop.
Save algolog/ada96d7c53dc19187a4e5b2987f7065a to your computer and use it in GitHub Desktop.
from dotenv import dotenv_values
from algosdk import mnemonic, account
from algosdk.v2client.algod import AlgodClient
from algosdk.v2client.indexer import IndexerClient
from algofipy.algofi_client import AlgofiClient
from algofipy.globals import Network
from algofipy.transaction_utils import TransactionGroup
# load user account
env_vars = dotenv_values(".env")
sender = env_vars["address"]
key = mnemonic.to_private_key(env_vars["mnemonic"])
signing_address = account.address_from_private_key(key)
print(f"User address: {sender}")
print(f"Signing address: {signing_address}")
# initialize clients
algod = AlgodClient("", "https://mainnet-api.algonode.cloud")
indexer = IndexerClient("", "https://mainnet-idx.algonode.cloud")
client = AlgofiClient(Network.MAINNET, algod, indexer)
user = client.get_user(sender)
repay_txns = TransactionGroup([])
withdraw_txns = TransactionGroup([])
# report markets state and construct transactions
print("~" * 80)
print("Asset Collateral_usd Collateral_underlying Borrowed_underlying")
print("~" * 80)
for market_app_id in user.lending.opted_in_markets:
market = client.lending.markets[market_app_id]
user_market_state = user.lending.user_market_states[market_app_id]
collateral_usd = user_market_state.b_asset_collateral_underlying.usd
withdraw_amount = user_market_state.b_asset_collateral_underlying.underlying
borrowed_amount = user_market_state.borrowed_underlying.underlying
print(f"{market.name:14} {collateral_usd:10.2f} {withdraw_amount:24_} {borrowed_amount:24_}")
if borrowed_amount > 0:
repay_txns += market.get_repay_borrow_txns(user.lending, borrowed_amount)
# check if there is enough balance to repay
if user.balances.get(market.underlying_asset_id, 0) < borrowed_amount:
print(f"!!! Not enough balance to repay {market.name} !!!")
if withdraw_amount > 0:
withdraw_txns += market.get_remove_underlying_collateral_txns(user.lending, withdraw_amount)
print("~" * 80)
txn_group = repay_txns + withdraw_txns
print(f"Repay and withdraw everything: {len(txn_group.transactions)} transactions in total.")
if input("Sign and send (y/N)?: ").lower() in ["y", "yes"]:
txn_group.sign_with_private_key(key)
txn_group.submit(client.algod, wait=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment