add express routes for queries
This commit is contained in:
parent
18a84253e8
commit
a5025e9307
|
@ -49,6 +49,8 @@ const loadPerpMarkets = async (connection, groupConfig: GroupConfig) => {
|
||||||
|
|
||||||
async function fetchSpotStats() {
|
async function fetchSpotStats() {
|
||||||
const mangoGroup = await client.getMangoGroup(groupConfig.publicKey)
|
const mangoGroup = await client.getMangoGroup(groupConfig.publicKey)
|
||||||
|
const mangoCache = await mangoGroup.loadCache(connection)
|
||||||
|
// TODO: reduce calls in loadRootBanks
|
||||||
await mangoGroup.loadRootBanks(connection)
|
await mangoGroup.loadRootBanks(connection)
|
||||||
|
|
||||||
const spotMarketStats = groupConfig.spotMarkets.map((spotMarket, index) => {
|
const spotMarketStats = groupConfig.spotMarkets.map((spotMarket, index) => {
|
||||||
|
@ -63,7 +65,7 @@ async function fetchSpotStats() {
|
||||||
depositRate: mangoGroup.getDepositRate(index).toNumber(),
|
depositRate: mangoGroup.getDepositRate(index).toNumber(),
|
||||||
borrowRate: mangoGroup.getBorrowRate(index).toNumber(),
|
borrowRate: mangoGroup.getBorrowRate(index).toNumber(),
|
||||||
utilization: totalDeposits.gt(I80F48.fromNumber(0)) ? totalBorrows.div(totalDeposits).toNumber() : 0,
|
utilization: totalDeposits.gt(I80F48.fromNumber(0)) ? totalBorrows.div(totalDeposits).toNumber() : 0,
|
||||||
baseOraclePrice: 0,
|
baseOraclePrice: mangoCache.priceCache[index].price.toNumber(),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
|
@ -77,6 +79,8 @@ async function fetchSpotStats() {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchPerpStats() {
|
async function fetchPerpStats() {
|
||||||
|
const mangoGroup = await client.getMangoGroup(groupConfig.publicKey)
|
||||||
|
const mangoCache = await mangoGroup.loadCache(connection)
|
||||||
const perpMarkets = await loadPerpMarkets(connection, groupConfig)
|
const perpMarkets = await loadPerpMarkets(connection, groupConfig)
|
||||||
console.log("6")
|
console.log("6")
|
||||||
|
|
||||||
|
@ -88,7 +92,7 @@ async function fetchPerpStats() {
|
||||||
longFunding: perpMarket.longFunding.toNumber(),
|
longFunding: perpMarket.longFunding.toNumber(),
|
||||||
shortFunding: perpMarket.shortFunding.toNumber(),
|
shortFunding: perpMarket.shortFunding.toNumber(),
|
||||||
openInterest: perpMarket.openInterest.toNumber(),
|
openInterest: perpMarket.openInterest.toNumber(),
|
||||||
baseOraclePrice: 0,
|
baseOraclePrice: mangoCache.priceCache[index].price.toNumber(),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
60
src/index.ts
60
src/index.ts
|
@ -10,44 +10,60 @@ const app = express()
|
||||||
|
|
||||||
app.use(express.json(), cors())
|
app.use(express.json(), cors())
|
||||||
|
|
||||||
app.get("/", async (req, res) => {
|
app.get("/spot", async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const mangoGroup = (req.query.mangoGroup as string) || ""
|
const mangoGroup = req.query.mangoGroup as string
|
||||||
let stats
|
if (!mangoGroup) {
|
||||||
if (mangoGroup === "BTC_ETH_USDT" || mangoGroup === "BTC_ETH_SOL_SRM_USDC") {
|
throw new Error("Missing mangoGroup param")
|
||||||
stats = await sequelize.query(
|
}
|
||||||
`SELECT time_bucket('60 minutes', time) AS "hourly",
|
|
||||||
"symbol",
|
const stats = await sequelize.query(
|
||||||
|
`SELECT time_bucket('60 minutes', time) AS "hourly",
|
||||||
|
"name",
|
||||||
avg("totalDeposits")::float AS "totalDeposits",
|
avg("totalDeposits")::float AS "totalDeposits",
|
||||||
avg("totalBorrows")::float AS "totalBorrows",
|
avg("totalBorrows")::float AS "totalBorrows",
|
||||||
avg("utilization")::float AS "utilization",
|
avg("utilization")::float AS "utilization",
|
||||||
avg("depositInterest")::float AS "depositInterest",
|
avg("depositInterest")::float AS "depositInterest",
|
||||||
avg("borrowInterest")::float AS "borrowInterest",
|
avg("borrowInterest")::float AS "borrowInterest",
|
||||||
min("time") AS "time"
|
min("time") AS "time"
|
||||||
FROM mainnet_stats
|
FROM spot_market_stats
|
||||||
WHERE time > current_date - interval '90' day AND "mangoGroup" = :mangoGroup
|
WHERE time > current_date - interval '90' day AND "mangoGroup" = :mangoGroup
|
||||||
GROUP BY "hourly", "symbol"
|
GROUP BY "hourly", "name"
|
||||||
ORDER BY "hourly" ASC;`,
|
ORDER BY "hourly" ASC;`,
|
||||||
{
|
{
|
||||||
replacements: { mangoGroup },
|
replacements: { mangoGroup },
|
||||||
type: QueryTypes.SELECT,
|
type: QueryTypes.SELECT,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
} else {
|
|
||||||
stats = await PerpMarketStats.findAll({
|
|
||||||
order: [["time", "ASC"]],
|
|
||||||
where: { mangoGroup: { [Op.or]: [null, mangoGroup] } },
|
|
||||||
})
|
|
||||||
}
|
|
||||||
res.send(stats)
|
res.send(stats)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("Error inserting data", e)
|
console.log("Error inserting data", e)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.get("/current", async (req, res) => {
|
app.get("/perp/funding_rate", async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const stats = await PerpMarketStats.findAll({ limit: 3, order: [["time", "DESC"]] })
|
const market = req.query.market as string
|
||||||
|
if (!market) {
|
||||||
|
throw new Error("Missing mangoGroup param")
|
||||||
|
}
|
||||||
|
|
||||||
|
const stats = await sequelize.query(
|
||||||
|
`SELECT
|
||||||
|
"longFunding",
|
||||||
|
"shortFunding",
|
||||||
|
"openInterest",
|
||||||
|
"baseOraclePrice",
|
||||||
|
"time"
|
||||||
|
FROM perp_market_stats
|
||||||
|
WHERE time > NOW() - interval '1 hour' AND "name" = :market`,
|
||||||
|
{
|
||||||
|
replacements: { market },
|
||||||
|
type: QueryTypes.SELECT,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
res.send(stats)
|
res.send(stats)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("Error inserting data", e)
|
console.log("Error inserting data", e)
|
||||||
|
|
Loading…
Reference in New Issue