From 07347210755c453f186071de7b3edc1ec174db64 Mon Sep 17 00:00:00 2001 From: Nikola Date: Thu, 25 Jul 2024 16:36:15 +0200 Subject: [PATCH] move all config values to config file --- src/api.ts | 8 +- src/config.ts | 19 ++++ src/lib/constants.ts | 21 +++-- src/lib/db.api.ts | 11 ++- src/lib/db.indexers.ts | 203 +++++++++++++++++++++++------------------ 5 files changed, 156 insertions(+), 106 deletions(-) create mode 100644 src/config.ts diff --git a/src/api.ts b/src/api.ts index 01632a8..454f058 100644 --- a/src/api.ts +++ b/src/api.ts @@ -21,9 +21,9 @@ import axios from "axios"; import { getFnftsForOwner } from "./lib/fnfts"; import { getPoints } from "./points"; import { handleGetReduxStatistics, handleUpdateReduxStatistics } from "./lib/redux"; +import { AUTH_KEY, PORT } from "./config"; const app = express(); -const port = process.env.PORT || 3333; app.use(express.json()); app.use(express.raw({ type: "application/vnd.custom-type" })); @@ -273,7 +273,7 @@ app.get("/points", async (req, res) => { function isAuthorized(request: any): boolean { const auth = request.headers.authorization; - return !!auth && auth === process.env.AUTH_KEY; + return !!auth && auth === AUTH_KEY; } app.post("/redux", async (req, res) => { @@ -291,6 +291,6 @@ app.get("/redux", async (req, res) => { return res.status(200).json(data); }); -app.listen(port, () => { - console.log(`Server is listening at http://localhost:${port}`); +app.listen(PORT, () => { + console.log(`Server is listening at http://localhost:${PORT}`); }); diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..3da0c73 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,19 @@ +import dotenv from "dotenv"; + +dotenv.config(); + +export const PORT = parseInt(process.env.PORT || "3333"); + +export const AUTH_KEY = process.env.AUTH_KEY!; + +export const MYSQLHOST = process.env.MYSQLHOST!; +export const MYSQLUSER = process.env.MYSQLUSER!; +export const MYSQLPASSWORD = process.env.MYSQLPASSWORD!; +export const MYSQLDATABASE = process.env.MYSQLDATABASE!; +export const MYSQLPORT = parseInt(process.env.MYSQLPORT!); + +export const MAINNET_RPC_URL = process.env.MAINNET_RPC_URL!; +export const OPTIMISM_RPC_URL = process.env.OPTIMISM_RPC_URL!; +export const POLYGON_RPC_URL = process.env.POLYGON_RPC_URL!; +export const FANTOM_RPC_URL = process.env.FANTOM_RPC_URL!; +export const ARBITRUM_RPC_URL = process.env.ARBITRUM_RPC_URL!; diff --git a/src/lib/constants.ts b/src/lib/constants.ts index e711b54..6c57a12 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -2,6 +2,7 @@ import axios from "axios"; import { JsonRpcProvider, getAddress } from "ethers"; import { Pool } from "./interfaces"; import { BigNumber } from "ethers-v5"; +import { ARBITRUM_RPC_URL, FANTOM_RPC_URL, MAINNET_RPC_URL, OPTIMISM_RPC_URL, POLYGON_RPC_URL } from "../config"; export const ZERO = BigNumber.from(0); export const ONE = BigNumber.from(1); @@ -20,19 +21,19 @@ export const SUBGRAPH_URLS: { [chainid: number]: string } = { }; export const PROVIDER_STRING: { [chainid: number]: string } = { - 1: process.env.MAINNET_RPC_URL as string, - 10: process.env.OPTIMISM_RPC_URL as string, - 137: process.env.POLYGON_RPC_URL as string, - 250: process.env.FANTOM_RPC_URL as string, - 42161: process.env.ARBITRUM_RPC_URL as string, + 1: MAINNET_RPC_URL, + 10: OPTIMISM_RPC_URL, + 137: POLYGON_RPC_URL, + 250: FANTOM_RPC_URL, + 42161: ARBITRUM_RPC_URL, }; export const PROVIDERS: { [chainId: number]: JsonRpcProvider } = { - 1: new JsonRpcProvider(process.env.MAINNET_RPC_URL), - 10: new JsonRpcProvider(process.env.OPTIMISM_RPC_URL), - 137: new JsonRpcProvider(process.env.POLYGON_RPC_URL), - 250: new JsonRpcProvider(process.env.FANTOM_RPC_URL), - 42161: new JsonRpcProvider(process.env.ARBITRUM_RPC_URL), + 1: new JsonRpcProvider(MAINNET_RPC_URL), + 10: new JsonRpcProvider(OPTIMISM_RPC_URL), + 137: new JsonRpcProvider(POLYGON_RPC_URL), + 250: new JsonRpcProvider(FANTOM_RPC_URL), + 42161: new JsonRpcProvider(ARBITRUM_RPC_URL), 31337: new JsonRpcProvider("http://localhost:8545"), }; diff --git a/src/lib/db.api.ts b/src/lib/db.api.ts index 87dc35a..8c12794 100644 --- a/src/lib/db.api.ts +++ b/src/lib/db.api.ts @@ -1,13 +1,14 @@ import { Client } from "pg"; +import { MYSQLDATABASE, MYSQLHOST, MYSQLPASSWORD, MYSQLPORT, MYSQLUSER } from "../config"; import { Adapter, Oracle, Pool, VaultInfo, XRATE } from "./interfaces"; import { ReduxPerformanceEntry, ReduxStatisticsRequest } from "./redux"; const client = new Client({ - host: process.env.MYSQLHOST, - user: process.env.MYSQLUSER, - password: process.env.MYSQLPASSWORD, - database: process.env.MYSQLDATABASE, - port: parseInt(process.env.MYSQLPORT!), + host: MYSQLHOST, + user: MYSQLUSER, + password: MYSQLPASSWORD, + database: MYSQLDATABASE, + port: MYSQLPORT, }); client.connect(); diff --git a/src/lib/db.indexers.ts b/src/lib/db.indexers.ts index 541647e..3e7cc53 100644 --- a/src/lib/db.indexers.ts +++ b/src/lib/db.indexers.ts @@ -1,51 +1,59 @@ -import { Client } from 'pg'; -import { Adapter, Pool, Oracle, FNFT, VaultInfo, PoolAndTvl } from './interfaces'; +import { Client } from "pg"; +import { MYSQLDATABASE, MYSQLHOST, MYSQLPASSWORD, MYSQLPORT, MYSQLUSER } from "../config"; +import { Adapter, Pool, Oracle, FNFT, VaultInfo, PoolAndTvl } from "./interfaces"; const client = new Client({ - host: process.env.MYSQLHOST, - user: process.env.MYSQLUSER, - password: process.env.MYSQLPASSWORD, - database: process.env.MYSQLDATABASE, - port: parseInt(process.env.MYSQLPORT!) -}) + host: MYSQLHOST, + user: MYSQLUSER, + password: MYSQLPASSWORD, + database: MYSQLDATABASE, + port: MYSQLPORT, +}); export const connect = async () => { - await client.connect() -} + await client.connect(); +}; /*///////////////////////////////////////////// ADD FUNCTIONS /////////////////////////////////////////////*/ - // Add Pool to DB export const addPool = async (pool: Pool) => { // check if id alr exists - console.log("here") + console.log("here"); let res; try { res = await client.query(`SELECT * FROM POOLS WHERE poolid = '${pool.poolid}' AND chainId = ${pool.chainid}`); } catch (e) { - console.error(e) + console.error(e); } - console.log("res", res) + console.log("res", res); if (res && res.rowCount == 0) { - const sql = `CALL AddPool(${pool.chainid}, '${pool.poolid}', '${pool.payoutasset}', '${pool.vault}', '${pool.vaultasset}', '${pool.rate}', '${pool.addinterestrate}', '${pool.lockupperiod}', '${pool.packetsize}', ${pool.packetsizedecimals}, ${pool.isfixedterm}, '${pool.poolname.replace(/'/g, "").replace(/;/g, "")}', '${pool.creator}', ${pool.ts}, '${pool.tx}')` - await client.query(sql) - console.log(`[${pool.chainid}] PoolID = ${pool.poolid} added`) + const sql = `CALL AddPool(${pool.chainid}, '${pool.poolid}', '${pool.payoutasset}', '${pool.vault}', '${ + pool.vaultasset + }', '${pool.rate}', '${pool.addinterestrate}', '${pool.lockupperiod}', '${pool.packetsize}', ${ + pool.packetsizedecimals + }, ${pool.isfixedterm}, '${pool.poolname.replace(/'/g, "").replace(/;/g, "")}', '${pool.creator}', ${ + pool.ts + }, '${pool.tx}')`; + await client.query(sql); + console.log(`[${pool.chainid}] PoolID = ${pool.poolid} added`); } else { - console.log(`[${pool.chainid}] PoolID = ${pool.poolid} alr exists`) + console.log(`[${pool.chainid}] PoolID = ${pool.poolid} alr exists`); } -} +}; // Add Adapter to DB export const addAdapter = async (adapter: Adapter) => { // check if id alr exists - const res = await client.query(`SELECT * FROM ADAPTERS WHERE vault = '${adapter.underlyingVault}' AND chainId = ${adapter.chainid} LIMIT 1`); + const res = await client.query( + `SELECT * FROM ADAPTERS WHERE vault = '${adapter.underlyingVault}' AND chainId = ${adapter.chainid} LIMIT 1`, + ); if (res.rowCount == 0) { - const sql = `CALL addadapter(${adapter.chainid}, '${adapter.underlyingVault}', '${adapter.vaultAdapter}', '${adapter.vaultAsset}', 1, ${adapter.ts})` - await client.query(sql) - console.log(`[${adapter.chainid}] adapter = ${adapter.vaultAdapter} added`) + const sql = `CALL addadapter(${adapter.chainid}, '${adapter.underlyingVault}', '${adapter.vaultAdapter}', '${adapter.vaultAsset}', 1, ${adapter.ts})`; + await client.query(sql); + console.log(`[${adapter.chainid}] adapter = ${adapter.vaultAdapter} added`); } else if (res.rowCount == 1) { if (adapter.vaultAdapter != res.rows[0].vaultAdapter) { if (adapter.ts > res.rows[0].ts) { @@ -55,23 +63,27 @@ export const addAdapter = async (adapter: Adapter) => { ts = ${adapter.ts}, asset = '${adapter.vaultAsset}' WHERE vault = '${adapter.underlyingVault}' and chainid = ${adapter.chainid} - ` - await client.query(sql) - console.log(`[${adapter.chainid}] vault = ${adapter.underlyingVault} updated to adapter = ${adapter.vaultAdapter}`) + `; + await client.query(sql); + console.log( + `[${adapter.chainid}] vault = ${adapter.underlyingVault} updated to adapter = ${adapter.vaultAdapter}`, + ); } else { - console.log(`[${adapter.chainid}] vault = ${adapter.underlyingVault} has already been replaced`) + console.log(`[${adapter.chainid}] vault = ${adapter.underlyingVault} has already been replaced`); } } } -} +}; // Add Oracle to DB export const addOracle = async (oracle: Oracle) => { // check if id alr exists - const res = await client.query(`SELECT * FROM ORACLES WHERE asset = '${oracle.asset}' AND chainId = ${oracle.chainid} LIMIT 1`); + const res = await client.query( + `SELECT * FROM ORACLES WHERE asset = '${oracle.asset}' AND chainId = ${oracle.chainid} LIMIT 1`, + ); if (res.rowCount == 0) { - const sql = `CALL addoracle(${oracle.chainid}, '${oracle.asset}', '${oracle.oracle}', ${oracle.ts})` - await client.query(sql) - console.log(`[${oracle.chainid}] oracle = ${oracle.asset} added`) + const sql = `CALL addoracle(${oracle.chainid}, '${oracle.asset}', '${oracle.oracle}', ${oracle.ts})`; + await client.query(sql); + console.log(`[${oracle.chainid}] oracle = ${oracle.asset} added`); } else if (res.rowCount == 1) { if (oracle.oracle != res.rows[0].oracle) { if (oracle.ts > res.rows[0].ts) { @@ -80,26 +92,37 @@ export const addOracle = async (oracle: Oracle) => { oracle = '${oracle.oracle}', ts = ${oracle.ts} WHERE asset = '${oracle.asset}' and chainid = ${oracle.chainid} - ` - await client.query(sql) - console.log(`[${oracle.chainid}] asset = ${oracle.asset} updated to oracle = ${oracle.oracle}`) + `; + await client.query(sql); + console.log(`[${oracle.chainid}] asset = ${oracle.asset} updated to oracle = ${oracle.oracle}`); } else { - console.log(`[${oracle.chainid}] asset = ${oracle.asset} oracle has already been replaced`) + console.log(`[${oracle.chainid}] asset = ${oracle.asset} oracle has already been replaced`); } } } -} +}; // add FNFT to DB -export const addFNFT = async (poolId: string, fnftId: number, quantity: number, face: number, usd: number, chainId: number) => { +export const addFNFT = async ( + poolId: string, + fnftId: number, + quantity: number, + face: number, + usd: number, + chainId: number, +) => { // check if id alr exists - let res = await client.query(`SELECT * FROM FNFTS WHERE fnftId = ${fnftId} AND poolId = '${poolId}' AND chainId = ${chainId}`); + let res = await client.query( + `SELECT * FROM FNFTS WHERE fnftId = ${fnftId} AND poolId = '${poolId}' AND chainId = ${chainId}`, + ); if (res.rowCount == 0) { - res = await client.query(`INSERT INTO FNFTS (chainid, poolId, fnftId, face, quantity, usd) VALUES (${chainId}, '${poolId}', ${fnftId}, ${face}, ${quantity}, ${usd})`) - console.log(`[${chainId}] ID = ${fnftId} added`) + res = await client.query( + `INSERT INTO FNFTS (chainid, poolId, fnftId, face, quantity, usd) VALUES (${chainId}, '${poolId}', ${fnftId}, ${face}, ${quantity}, ${usd})`, + ); + console.log(`[${chainId}] ID = ${fnftId} added`); } else { - console.log(`[${chainId}] ID = ${fnftId} alr exists`) + console.log(`[${chainId}] ID = ${fnftId} alr exists`); } -} +}; /*///////////////////////////////////////////// READ ALL FUNCTIONS @@ -107,109 +130,115 @@ export const addFNFT = async (poolId: string, fnftId: number, quantity: number, // Read all pool ids from chainid export const readPoolIds = async (chainId: number) => { - const res = await client.query<{poolid: string}>(`SELECT poolid FROM POOLS WHERE chainId = ${chainId}`); + const res = await client.query<{ poolid: string }>(`SELECT poolid FROM POOLS WHERE chainId = ${chainId}`); return res.rows.map(row => row.poolid); -} -// Read all pools from chainid +}; +// Read all pools from chainid export const readPools = async (chainId: number) => { const res = await client.query(`SELECT * FROM POOLS WHERE chainId = ${chainId}`); return res.rows; -} +}; // Read all adapters from chainid export const readAdapters = async (chainId: number) => { - const res = await client.query<{vault: string}>(`SELECT adapter FROM adapters WHERE chainId = ${chainId}`); + const res = await client.query<{ vault: string }>(`SELECT adapter FROM adapters WHERE chainId = ${chainId}`); return res.rows.map(row => row.vault); -} +}; // Read all oracles from chainid export const readOracles = async (chainId: number) => { - const res = await client.query<{asset: string}>(`SELECT asset FROM oracles WHERE chainId = ${chainId}`); + const res = await client.query<{ asset: string }>(`SELECT asset FROM oracles WHERE chainId = ${chainId}`); return res.rows.map(row => row.asset); -} -export const readAllFNFTS = async (chainId: number) : Promise => { +}; +export const readAllFNFTS = async (chainId: number): Promise => { // check if id alr exists - const q = `SELECT * FROM FNFTS where chainid = ${chainId}` + const q = `SELECT * FROM FNFTS where chainid = ${chainId}`; const res = await client.query(q); return res.rows; -} +}; // add id -export const readVaultsFromProvider = async (provider: string) : Promise => { +export const readVaultsFromProvider = async (provider: string): Promise => { // check if id alr exists const res = await client.query(`SELECT * FROM vaults where provider = '${provider}'`); - return res.rows -} + return res.rows; +}; /*///////////////////////////////////////////// UPDATE FUNCTIONS /////////////////////////////////////////////*/ export const updatePoolVolume = async (pool: Pool, volume: string) => { - const prev_volume_res = await client.query<{usdvolume: string}>(`SELECT usdvolume from pools WHERE poolid = '${pool.poolid}' AND chainid = ${pool.chainid}`) + const prev_volume_res = await client.query<{ usdvolume: string }>( + `SELECT usdvolume from pools WHERE poolid = '${pool.poolid}' AND chainid = ${pool.chainid}`, + ); if (prev_volume_res.rowCount > 0) { - const prev_volume = prev_volume_res.rows[0].usdvolume.slice(1).replace(/,/g, "") - console.log(`[${pool.chainid}] pool = ${pool.poolid} prev_volume = ${prev_volume} volume = ${volume}`) + const prev_volume = prev_volume_res.rows[0].usdvolume.slice(1).replace(/,/g, ""); + console.log(`[${pool.chainid}] pool = ${pool.poolid} prev_volume = ${prev_volume} volume = ${volume}`); if (volume != prev_volume && volume != "0") { - await client.query(`UPDATE pools SET usdvolume = '${volume}' WHERE poolid = '${pool.poolid}' AND chainid = ${pool.chainid}`) - console.log(`[${pool.chainid}] pool = ${pool.poolid} updated volumeUSD = ${volume}`) + await client.query( + `UPDATE pools SET usdvolume = '${volume}' WHERE poolid = '${pool.poolid}' AND chainid = ${pool.chainid}`, + ); + console.log(`[${pool.chainid}] pool = ${pool.poolid} updated volumeUSD = ${volume}`); } } -} +}; export const batchUpdatePoolTVLs = async (pools: PoolAndTvl[]) => { - let sql = ''; + let sql = ""; for (const pool of pools) { if (pool.tvl == 0) { - console.log("skipping", pool.poolid, pool.poolname); + console.log("skipping", pool.poolid, pool.poolname); continue; } - sql += `UPDATE POOLS SET TVL = ${pool.tvl} WHERE POOLID = '${pool.poolid}' AND CHAINID = ${pool.chainid}; ` + sql += `UPDATE POOLS SET TVL = ${pool.tvl} WHERE POOLID = '${pool.poolid}' AND CHAINID = ${pool.chainid}; `; } return await client.query(sql); -} +}; export const batchUpdateFNFTs = async (fnfts: FNFT[]) => { - let sql = ''; + let sql = ""; for (const fnft of fnfts) { if (fnft.usd == 0 || fnft.face == 0) { - console.log("skipping", fnft.fnftid, fnft.usd, fnft.face); + console.log("skipping", fnft.fnftid, fnft.usd, fnft.face); continue; } - sql += `UPDATE FNFTS SET USD = ${fnft.usd}, FACE = ${fnft.face} WHERE FNFTID = ${fnft.fnftid} AND CHAINID = ${fnft.chainid}; ` + sql += `UPDATE FNFTS SET USD = ${fnft.usd}, FACE = ${fnft.face} WHERE FNFTID = ${fnft.fnftid} AND CHAINID = ${fnft.chainid}; `; } return await client.query(sql); -} +}; export const updateVault = async (vault: VaultInfo) => { - // update vault + // update vault // check if vault alr exists - const sql1 = `SELECT * FROM vaults WHERE chainid = '${vault.chainid}' and address = '${vault.address}'` + const sql1 = `SELECT * FROM vaults WHERE chainid = '${vault.chainid}' and address = '${vault.address}'`; let res = await client.query(sql1); if (res.rowCount > 0) { - const old_apy = res.rows[0].apy.toFixed(5) - const new_apy = vault.apy.toFixed(5) - const old_tvl = res.rows[0].tvl.slice(1).replace(/,/g, "") - const new_tvl = vault.tvl + const old_apy = res.rows[0].apy.toFixed(5); + const new_apy = vault.apy.toFixed(5); + const old_tvl = res.rows[0].tvl.slice(1).replace(/,/g, ""); + const new_tvl = vault.tvl; if (old_apy == new_apy && old_tvl == new_tvl) { console.log(`[${vault.chainid}] [${vault.symbol}] skip\t`, old_apy, new_apy, old_tvl, new_tvl); } else { console.log(`[${vault.chainid}] [${vault.symbol}] UPDATE\t`, old_apy, new_apy, old_tvl, new_tvl); - const sql2 = `UPDATE vaults SET apy = ${vault.apy}, tvl = ${vault.tvl} WHERE address = '${vault.address}'` - res = await client.query(sql2) + const sql2 = `UPDATE vaults SET apy = ${vault.apy}, tvl = ${vault.tvl} WHERE address = '${vault.address}'`; + res = await client.query(sql2); } } -} +}; /*///////////////////////////////////////////// REMOVE FUNCTIONS /////////////////////////////////////////////*/ - - // remove id export const removeId = async (poolId: string, fnftId: number, chainId: number) => { // check if id alr exists - let res = await client.query(`SELECT * FROM FNFTS WHERE fnftId = ${fnftId} AND poolId = '${poolId}' AND chainId = ${chainId}`); + let res = await client.query( + `SELECT * FROM FNFTS WHERE fnftId = ${fnftId} AND poolId = '${poolId}' AND chainId = ${chainId}`, + ); if (res.rowCount > 0) { - res = await client.query(`DELETE FROM FNFTS WHERE poolId = '${poolId}' and fnftId = ${fnftId} and chainId = ${chainId}`) - console.log(`[${chainId}] ID = ${fnftId} removed`) + res = await client.query( + `DELETE FROM FNFTS WHERE poolId = '${poolId}' and fnftId = ${fnftId} and chainId = ${chainId}`, + ); + console.log(`[${chainId}] ID = ${fnftId} removed`); } else { - console.log(`[${chainId}] ID = ${fnftId} doesn't exist`) + console.log(`[${chainId}] ID = ${fnftId} doesn't exist`); } -} +};