Skip to content

Commit

Permalink
# WARNING: head commit changed in the meantime
Browse files Browse the repository at this point in the history
Merge branch 'main' of https://github.rpi.edu/DataINCITE/IDEA-DeFi-CRAFT
into main
  • Loading branch information
Conor Flynn committed Nov 6, 2022
1 parent 8094845 commit 40d1e09
Show file tree
Hide file tree
Showing 10 changed files with 320 additions and 172 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ public class Config {
stream_properties.put("rest.socket.address", "localhost");
stream_properties.put("rest.socket.port", "61100");
stream_properties.put("rest.socket.key", "rest-key-reserved");
stream_properties.put("output.socket.address", "defi-de.idea.rpi.edu");
//stream_properties.put("output.socket.address", "defi-de.idea.rpi.edu");
stream_properties.put("output.socket.address", "localhost");
stream_properties.put("output.socket.port", "61200");
stream_properties.put("local.stream.type", "mongo_db");
stream_properties.put("mongodb.properties.uri", "mongodb://localhost:27017");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import java.lang.reflect.Method;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.HashMap;

import org.core.logger.Logger;
import org.framework.router.ResponseFactory;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.properties.Config;

Expand All @@ -21,6 +21,8 @@ public class AmberDataRequestHandler {
private volatile static OkHttpClient client;
private final static HashMap<String, Method> requests;

private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Config.getProperty("app", "general.data.dateformat"));

static {
client = new OkHttpClient();

Expand All @@ -32,6 +34,7 @@ public class AmberDataRequestHandler {
// add all methods to the handler
requests.put("lending-latest", classobj.getMethod("requestLendingLatest", AmberDataRequestPacket.class));
requests.put("aave-protocol-dated", classobj.getMethod("requestAaveProtocolDated", AmberDataRequestPacket.class));
requests.put("aave-asset-dated", classobj.getMethod("requestAaveAssetDated", AmberDataRequestPacket.class));
} catch (Exception e) {
e.printStackTrace();
ResponseFactory.responseNotHandled("Irregular method call for AmberDataRequestHandler.");
Expand Down Expand Up @@ -79,7 +82,6 @@ public static Object[] requestLendingLatest(AmberDataRequestPacket packet) {
}
}

private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Config.getProperty("app", "general.data.dateformat"));
public static Object[] requestAaveProtocolDated(AmberDataRequestPacket packet) {
LocalDate next = LocalDate.parse(packet.getData("date"), formatter);
next = next.plusDays(1);
Expand Down Expand Up @@ -115,140 +117,7 @@ public static Object[] requestAaveProtocolDated(AmberDataRequestPacket packet) {

JSONArray arr = json.getJSONObject("payload").getJSONArray("data");
for(int i = 0; i < arr.length(); i++) {
JSONObject obj = arr.getJSONObject(i);
String action = obj.getString("action");
switch(action) {

case "UseReserveAsCollateral":
packet.getConnection().processRequest(
packet.getData("request"),
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"reserveAsCollateralEnabled", obj.getBoolean("reserveAsCollateralEnabled"),
"user", obj.getString("user")));
break;

case "Deposit":
packet.getConnection().processRequest(
packet.getData("request"),
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"user", obj.getString("user"),
"onBehalfOf", obj.getString("onBehalfOf")));
break;

case "Withdraw":
packet.getConnection().processRequest(
packet.getData("request"),
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"amount", obj.get("amount").toString(),
"user", obj.getString("user"),
"to", obj.getString("to")));
break;

case "LiquidationCall":
packet.getConnection().processRequest(
packet.getData("request"),
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"collateralAssetId", obj.getString("collateralAssetId"),
"collateralAssetSymbol", obj.getString("collateralAssetSymbol"),
"principalAssetId", obj.getString("principalAssetId"),
"principalAssetSymbol", obj.getString("principalAssetSymbol"),
"principalAmount", obj.get("principalAmount").toString(),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"liquidator", obj.getString("liquidator")));
break;

case "Repay":
packet.getConnection().processRequest(
packet.getData("request"),
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"amount", obj.get("amount").toString(),
"user", obj.getString("user"),
"repayer", obj.getString("repayer")));
break;

case "Borrow":
packet.getConnection().processRequest(
packet.getData("request"),
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"amount", obj.get("amount").toString(),
"borrowRate", obj.get("borrowRate").toString(),
"debt", obj.get("debt"),
"user", obj.getString("user"),
"onBehalfOf", obj.getString("onBehalfOf")));
break;

case "FlashLoan":
packet.getConnection().processRequest(
packet.getData("request"),
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"amount", obj.get("amount").toString(),
"borrowRate", obj.get("totalFee").toString(),
"target", obj.get("target"),
"initiator", obj.getString("initiator")));

default:
Logger.warn("Unrecognized transaction type in <aave-protocol-dated>: " + action);
}
processAaveJsonRequest(packet, arr.getJSONObject(i));
}

return new Object[] {true, ""};
Expand All @@ -259,6 +128,200 @@ public static Object[] requestAaveProtocolDated(AmberDataRequestPacket packet) {
}
}

public static Object[] requestAaveAssetDated(AmberDataRequestPacket packet) {
if(packet.getData("asset") == null)
return new Object[] {false, "Missing parameter <asset>."};

LocalDate next = LocalDate.parse(packet.getData("date"), formatter);
next = next.plusDays(1);
String tmr = next.format(formatter);

String url = String.format("https://web3api.io/api/v2/defi/lending/aavev2/assets/%s?startDate=%s&endDate=%s",
packet.getData("asset"),
packet.getData("date") + "T01:00:00",
tmr + "T01:00:00");

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
.url(url)
.get()
.addHeader("accept", "application/json")
.addHeader("x-api-key", "UAK7ed69235426c360be22bfc2bde1809b6")
.build();

okhttp3.Response response;
try {
response = client.newCall(request).execute();
JSONObject json = new JSONObject(response.body().string());

if(json.toString().equals("") || !json.has("description"))
return new Object[] {false, "JSON Object returned empty or invalid contents."};

if(!response.isSuccessful() || json.getInt("status") != 200
|| !json.getString("description").equals("Successful request"))
return new Object[]{false, json.getString("description")};

if(!json.has("payload") || !json.getJSONObject("payload").has("data"))
return new Object[] {false, "Malformed Aave packet"};

JSONArray arr = json.getJSONObject("payload").getJSONArray("data");
for(int i = 0; i < arr.length(); i++)
processAaveJsonRequest(packet, arr.getJSONObject(i), packet.getData("asset"));

return new Object[] {true, ""};
} catch (IOException e) {
e.printStackTrace();
ResponseFactory.responseNotHandled("Unhandled exception cost.");
return new Object[] {false, null};
}
}

private static void processAaveJsonRequest(AmberDataRequestPacket packet, JSONObject obj) throws JSONException {
processAaveJsonRequest(packet, obj, null);
}

private static void processAaveJsonRequest(AmberDataRequestPacket packet, JSONObject obj, String request_specifier) throws JSONException {
if(request_specifier != null)
request_specifier = "-" + request_specifier;
else
request_specifier = "";

String action = obj.getString("action");
switch(action) {

case "UseReserveAsCollateral":
packet.getConnection().processRequest(
packet.getData("request") + request_specifier,
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"reserveAsCollateralEnabled", obj.getBoolean("reserveAsCollateralEnabled"),
"user", obj.getString("user")));
break;

case "Deposit":
packet.getConnection().processRequest(
packet.getData("request") + request_specifier,
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"user", obj.getString("user"),
"onBehalfOf", obj.getString("onBehalfOf")));
break;

case "Withdraw":
packet.getConnection().processRequest(
packet.getData("request") + request_specifier,
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"amount", obj.get("amount").toString(),
"user", obj.getString("user"),
"to", obj.getString("to")));
break;

case "LiquidationCall":
packet.getConnection().processRequest(
packet.getData("request") + request_specifier,
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"collateralAssetId", obj.getString("collateralAssetId"),
"collateralAssetSymbol", obj.getString("collateralAssetSymbol"),
"principalAssetId", obj.getString("principalAssetId"),
"principalAssetSymbol", obj.getString("principalAssetSymbol"),
"principalAmount", obj.get("principalAmount").toString(),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"liquidator", obj.getString("liquidator")));
break;

case "Repay":
packet.getConnection().processRequest(
packet.getData("request") + request_specifier,
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"amount", obj.get("amount").toString(),
"user", obj.getString("user"),
"repayer", obj.getString("repayer")));
break;

case "Borrow":
packet.getConnection().processRequest(
packet.getData("request") + request_specifier,
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"amount", obj.get("amount").toString(),
"borrowRate", obj.get("borrowRate").toString(),
"debt", obj.get("debt"),
"user", obj.getString("user"),
"onBehalfOf", obj.getString("onBehalfOf")));
break;

case "FlashLoan":
packet.getConnection().processRequest(
packet.getData("request") + request_specifier,
packet.getData("date"),
format("action", obj.getString("action"),
"timestamp", obj.get("timestamp").toString(),
"blockNumber", obj.getLong("blockNumber"),
"transactionHash", obj.getString("transactionHash"),
"logIndex", obj.getInt("logIndex"),
"assetId", obj.getString("assetId"),
"assetSymbol", obj.getString("assetSymbol"),
"marketId", obj.getString("marketId"),
"market", obj.getString("market"),
"amount", obj.get("amount").toString(),
"borrowRate", obj.get("totalFee").toString(),
"target", obj.get("target"),
"initiator", obj.getString("initiator")));

default:
Logger.warn("Unrecognized transaction type in <aave-protocol-dated>: " + action);
}
}

private static String format(Object... data) {
StringBuilder out = new StringBuilder();
for(int i = 0; i < data.length; i++) {
Expand Down
Loading

0 comments on commit 40d1e09

Please sign in to comment.