Skip to content

Commit

Permalink
feat: borrowers/lenders csv export
Browse files Browse the repository at this point in the history
  • Loading branch information
tsifrer committed Jul 24, 2023
1 parent eca4912 commit 5018b74
Show file tree
Hide file tree
Showing 2 changed files with 168 additions and 1 deletion.
11 changes: 11 additions & 0 deletions ajna/v1/urls.py
Expand Up @@ -93,4 +93,15 @@
auctions.AuctionsActiveView.as_view(),
name="auctions-active",
),
# URLS that we use internally
path(
"pools/<pool_address>/borrowers-csv/",
pool.PoolBorrowersCsvView.as_view(),
name="pool-borrowers-csv",
),
path(
"pools/<pool_address>/lenders-csv/",
pool.PoolLendersCsvView.as_view(),
name="pool-lenders-csv",
),
]
158 changes: 157 additions & 1 deletion ajna/v1/views/pool.py
@@ -1,8 +1,9 @@
import csv
from datetime import datetime, timedelta
from decimal import Decimal

from django.db import connection
from django.http import Http404
from django.http import Http404, HttpResponse
from rest_framework import status
from rest_framework.response import Response

Expand Down Expand Up @@ -764,3 +765,158 @@ def get_raw_sql(self, pool_address, search_filters, query_params, **kwargs):
token_table=self.models.token._meta.db_table,
)
return sql, sql_vars


class PoolBorrowersCsvView(BaseChainView):
def get(self, request, pool_address):
sql_vars = [pool_address, pool_address]
sql = """
SELECT
y.borrower
, y.debt AS debt
, y.debt * quote_token.underlying_price AS debt_usd
, y.collateral
, y.collateral * collateral_token.underlying_price AS collateral_usd
, collateral_token.symbol AS collateral_token_symbol
, quote_token.symbol AS quote_token_symbol
, (y.collateral * collateral_token.underlying_price) /
(y.debt * quote_token.underlying_price) as health_rate
FROM (
SELECT
x.borrower
, x.pool_address
, SUM(x.debt) AS debt
, SUM(x.collateral) AS collateral
FROM (
SELECT
dd.borrower
, dd.pool_address
, dd.amount_borrowed AS debt
, dd.collateral_pledged AS collateral
FROM {draw_debt_table} AS dd
WHERE dd.pool_address = %s
UNION
SELECT
rd.borrower
, rd.pool_address
, rd.quote_repaid * -1 AS debt
, rd.collateral_pulled * -1 AS collateral
FROM {repay_debt_table} rd
WHERE pool_address = %s
) x
GROUP BY 1, 2
) y
JOIN {pool_table} pool
ON pool.address = y.pool_address
JOIN {token_table} AS collateral_token
ON pool.collateral_token_address = collateral_token.underlying_address
JOIN {token_table} AS quote_token
ON pool.quote_token_address = quote_token.underlying_address
""".format(
draw_debt_table=self.models.draw_debt._meta.db_table,
repay_debt_table=self.models.repay_debt._meta.db_table,
pool_table=self.models.pool._meta.db_table,
token_table=self.models.token._meta.db_table,
)

with connection.cursor() as cursor:
cursor.execute(sql, sql_vars)
borrowers = fetch_all(cursor)

response = HttpResponse(
content_type="text/csv",
headers={"Content-Disposition": 'attachment; filename="borrowers.csv"'},
)
fieldnames = [
"borrower",
"collateral",
"collateral_usd",
"collateral_token_symbol",
"debt",
"debt_usd",
"quote_token_symbol",
"health_rate",
]
writer = csv.DictWriter(response, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(borrowers)
return response


class PoolLendersCsvView(BaseChainView):
def get(self, request, pool_address):
sql_vars = [pool_address, pool_address]
sql = """
SELECT
y.lender
, y.bucket_index
, y.amount
, y.amount * quote_token.underlying_price AS amount_usd
, quote_token.symbol AS token_symbol
, bucket.bucket_price
FROM (
SELECT
x.lender
, x.bucket_index
, x.pool_address
, SUM(x.amount) AS amount
FROM (
SELECT
aqt.lender AS lender
, aqt.bucket_index
, aqt.pool_address
, aqt.amount
FROM {add_quote_token_table} AS aqt
WHERE aqt.pool_address = %s
UNION
SELECT
rqt.lender AS wallet
, rqt.bucket_index
, rqt.pool_address
, rqt.amount * -1 AS collateral
FROM {remove_quote_token_table} rqt
WHERE rqt.pool_address = %s
) x
GROUP BY 1, 2, 3
) y
JOIN {pool_table} pool
ON pool.address = y.pool_address
JOIN {token_table} AS quote_token
ON pool.quote_token_address = quote_token.underlying_address
JOIN {bucket_table} AS bucket
ON bucket.bucket_index = y.bucket_index
AND bucket.pool_address = y.pool_address
""".format(
add_quote_token_table=self.models.add_quote_token._meta.db_table,
remove_quote_token_table=self.models.remove_quote_token._meta.db_table,
pool_table=self.models.pool._meta.db_table,
token_table=self.models.token._meta.db_table,
bucket_table=self.models.bucket._meta.db_table,
)

with connection.cursor() as cursor:
cursor.execute(sql, sql_vars)
borrowers = fetch_all(cursor)

response = HttpResponse(
content_type="text/csv",
headers={"Content-Disposition": 'attachment; filename="lenders.csv"'},
)
fieldnames = [
"lender",
"bucket_index",
"bucket_price",
"amount",
"amount_usd",
"token_symbol",
]
writer = csv.DictWriter(
response, fieldnames=fieldnames, dialect='unix'
)
writer.writeheader()
writer.writerows(borrowers)
return response

0 comments on commit 5018b74

Please sign in to comment.