collect v3 stats
This commit is contained in:
parent
0b646d8187
commit
c188103ec0
|
@ -1,43 +1,107 @@
|
||||||
import { Connection, PublicKey } from "@solana/web3.js"
|
import { Connection, PublicKey } from "@solana/web3.js"
|
||||||
import { IDS, MangoClient } from "@blockworks-foundation/mango-client"
|
import {
|
||||||
|
Config,
|
||||||
|
getMultipleAccounts,
|
||||||
|
GroupConfig,
|
||||||
|
I80F48,
|
||||||
|
IDS,
|
||||||
|
MangoClient,
|
||||||
|
PerpMarket,
|
||||||
|
PerpMarketLayout,
|
||||||
|
} from "@blockworks-foundation/mango-client"
|
||||||
import PerpMarketStats from "../models/perp_market_stats"
|
import PerpMarketStats from "../models/perp_market_stats"
|
||||||
|
import SpotMarketStats from "../models/spot_market_stats"
|
||||||
|
|
||||||
async function fetchAndPersistStats() {
|
const CLUSTER_URLS = [
|
||||||
// const clusterUrls = IDS.cluster_urls[cluster]
|
{
|
||||||
// if (!clusterUrls) return
|
name: "mainnet-beta",
|
||||||
// const client = new MangoClient()
|
url: "https://mango.rpcpool.com/",
|
||||||
// const connection = new Connection(IDS.cluster_urls[cluster], "singleGossip")
|
websocket: "https://mango.rpcpool.com/",
|
||||||
// const stats: any[][] = await Promise.all(
|
},
|
||||||
// MANGO_GROUPS.map(async (mangoGroupName) => {
|
{
|
||||||
// const assets = IDS[cluster].mango_groups?.[mangoGroupName]?.symbols
|
name: "devnet",
|
||||||
// const mangoGroupId = IDS[cluster].mango_groups?.[mangoGroupName]?.mango_group_pk
|
url: "https://mango.devnet.rpcpool.com",
|
||||||
// const mangoGroupPk = new PublicKey(mangoGroupId)
|
websocket: "https://api.devnet.solana.com",
|
||||||
// const mangoGroup = await client.getMangoGroup(connection, mangoGroupPk)
|
},
|
||||||
// const mangoGroupStats = Object.keys(assets).map((symbol, index) => {
|
]
|
||||||
// const totalDeposits = mangoGroup.getUiTotalDeposit(index)
|
|
||||||
// const totalBorrows = mangoGroup.getUiTotalBorrow(index)
|
export type CLUSTER_TYPE = "devnet" | "mainnet-beta"
|
||||||
// return {
|
|
||||||
// time: new Date(),
|
const loadPerpMarkets = async (connection, groupConfig: GroupConfig) => {
|
||||||
// symbol,
|
const perpMarketPks = groupConfig.perpMarkets.map((p) => p.publicKey)
|
||||||
// totalDeposits,
|
|
||||||
// totalBorrows,
|
const allMarketAccountInfos = await getMultipleAccounts(connection, perpMarketPks)
|
||||||
// depositInterest: mangoGroup.getDepositRate(index),
|
|
||||||
// borrowInterest: mangoGroup.getBorrowRate(index),
|
return groupConfig.perpMarkets.map((config, i) => {
|
||||||
// utilization: totalDeposits > 0.0 ? totalBorrows / totalDeposits : 0.0,
|
const decoded = PerpMarketLayout.decode(allMarketAccountInfos[i].accountInfo.data)
|
||||||
// mangoGroup: mangoGroupName,
|
|
||||||
// }
|
return new PerpMarket(config.publicKey, config.baseDecimals, config.quoteDecimals, decoded)
|
||||||
// })
|
})
|
||||||
// return mangoGroupStats
|
}
|
||||||
// })
|
|
||||||
// )
|
async function fetchAndPersistStats(cluster: CLUSTER_TYPE) {
|
||||||
// const tableName = cluster === "devnet" ? DevnetStats : MainnetStats
|
const clusterUrl = CLUSTER_URLS.find((c) => c.name === cluster)
|
||||||
// try {
|
if (!clusterUrl) return
|
||||||
// console.log("stats", stats.flat())
|
const connection = new Connection(clusterUrl.url, "singleGossip")
|
||||||
// await tableName.bulkCreate(stats.flat())
|
const config = new Config(IDS)
|
||||||
// console.log("stats inserted")
|
|
||||||
// } catch (err) {
|
const groupConfig = config.getGroup(cluster, "mango_test_v3.8")
|
||||||
// console.log("failed to insert stats", err)
|
console.log("1")
|
||||||
// }
|
|
||||||
|
const client = new MangoClient(connection, groupConfig.mangoProgramId)
|
||||||
|
console.log("2")
|
||||||
|
|
||||||
|
const mangoGroup = await client.getMangoGroup(groupConfig.publicKey)
|
||||||
|
console.log("3")
|
||||||
|
|
||||||
|
await mangoGroup.loadRootBanks(connection)
|
||||||
|
console.log("4")
|
||||||
|
|
||||||
|
const spotMarketStats = groupConfig.spotMarkets.map((spotMarket, index) => {
|
||||||
|
const totalDeposits = mangoGroup.getUiTotalDeposit(index)
|
||||||
|
const totalBorrows = mangoGroup.getUiTotalBorrow(index)
|
||||||
|
return {
|
||||||
|
time: new Date(),
|
||||||
|
name: groupConfig.spotMarkets[index].name,
|
||||||
|
publicKey: spotMarket.publicKey.toString(),
|
||||||
|
mangoGroup: groupConfig.name,
|
||||||
|
totalDeposits: totalDeposits.toNumber(),
|
||||||
|
totalBorrows: totalBorrows.toNumber(),
|
||||||
|
depositRate: mangoGroup.getDepositRate(index).toNumber(),
|
||||||
|
borrowRate: mangoGroup.getBorrowRate(index).toNumber(),
|
||||||
|
utilization: totalDeposits.gt(I80F48.fromNumber(0)) ? totalBorrows.div(totalDeposits).toNumber() : 0,
|
||||||
|
baseOraclePrice: 0,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
try {
|
||||||
|
await SpotMarketStats.bulkCreate(spotMarketStats)
|
||||||
|
console.log("spot stats inserted")
|
||||||
|
} catch (err) {
|
||||||
|
console.log("failed to insert spot stats", `${err}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const perpMarkets = await loadPerpMarkets(connection, groupConfig)
|
||||||
|
console.log("6")
|
||||||
|
|
||||||
|
const perpMarketStats = perpMarkets.map((perpMarket, index) => {
|
||||||
|
return {
|
||||||
|
time: new Date(),
|
||||||
|
name: groupConfig.perpMarkets[index].name,
|
||||||
|
publicKey: perpMarket.publicKey.toString(),
|
||||||
|
mangoGroup: groupConfig.name,
|
||||||
|
longFunding: perpMarket.longFunding.toNumber(),
|
||||||
|
shortFunding: perpMarket.shortFunding.toNumber(),
|
||||||
|
openInterest: perpMarket.openInterest.toNumber(),
|
||||||
|
baseOraclePrice: 0,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
try {
|
||||||
|
await PerpMarketStats.bulkCreate(perpMarketStats)
|
||||||
|
console.log("perp stats inserted")
|
||||||
|
} catch (err) {
|
||||||
|
console.log("failed to insert spot stats", `${err}`)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default fetchAndPersistStats
|
export default fetchAndPersistStats
|
||||||
|
|
|
@ -2,9 +2,9 @@ import { Sequelize, DataTypes } from "sequelize"
|
||||||
import db from "./index"
|
import db from "./index"
|
||||||
|
|
||||||
const PerpMarketStats = db.sequelize.define(
|
const PerpMarketStats = db.sequelize.define(
|
||||||
"perp_market_stats",
|
"spot_market_stats",
|
||||||
{
|
{
|
||||||
symbol: { type: DataTypes.STRING, allowNull: false },
|
name: { type: DataTypes.STRING, allowNull: false },
|
||||||
totalDeposits: {
|
totalDeposits: {
|
||||||
type: DataTypes.DECIMAL,
|
type: DataTypes.DECIMAL,
|
||||||
get() {
|
get() {
|
||||||
|
@ -33,6 +33,13 @@ const PerpMarketStats = db.sequelize.define(
|
||||||
return value === null ? null : parseFloat(value)
|
return value === null ? null : parseFloat(value)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
baseOraclePrice: {
|
||||||
|
type: DataTypes.DECIMAL,
|
||||||
|
get() {
|
||||||
|
const value = this.getDataValue("baseOraclePrice")
|
||||||
|
return value === null ? null : parseFloat(value)
|
||||||
|
},
|
||||||
|
},
|
||||||
mangoGroup: DataTypes.STRING,
|
mangoGroup: DataTypes.STRING,
|
||||||
publicKey: DataTypes.STRING,
|
publicKey: DataTypes.STRING,
|
||||||
utilization: DataTypes.DECIMAL,
|
utilization: DataTypes.DECIMAL,
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
"start": "node dist/src/index.js",
|
"start": "node dist/src/index.js",
|
||||||
"lint": "eslint src/**/*.ts",
|
"lint": "eslint src/**/*.ts",
|
||||||
"format": "eslint src/**/*.ts --fix",
|
"format": "eslint src/**/*.ts --fix",
|
||||||
"db-setup": "sequelize db:drop && sequelize db:create tsdb && sequelize db:migrate",
|
"db-setup": "sequelize db:drop && sequelize db:create mango_stats_v3_dev && sequelize db:migrate",
|
||||||
"db-migrate": "sequelize db:migrate"
|
"db-migrate": "sequelize db:migrate"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
"typescript": "^4.1.5"
|
"typescript": "^4.1.5"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@blockworks-foundation/mango-client": "^3.0.1",
|
"@blockworks-foundation/mango-client": "https://github.com/blockworks-foundation/mango-client-v3",
|
||||||
"@solana/web3.js": "^1.18.0",
|
"@solana/web3.js": "^1.18.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
import fetchAndPersistStats from '../lib/fetchStats';
|
import fetchAndPersistStats, { CLUSTER_TYPE } from "../lib/fetchStats"
|
||||||
|
|
||||||
fetchAndPersistStats();
|
const cluster = (process.env.CLUSTER || "devnet") as CLUSTER_TYPE
|
||||||
|
|
||||||
|
fetchAndPersistStats(cluster)
|
||||||
|
|
13
yarn.lock
13
yarn.lock
|
@ -39,12 +39,11 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.13.4"
|
regenerator-runtime "^0.13.4"
|
||||||
|
|
||||||
"@blockworks-foundation/mango-client@^3.0.1":
|
"@blockworks-foundation/mango-client@https://github.com/blockworks-foundation/mango-client-v3":
|
||||||
version "3.0.1"
|
version "3.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-client/-/mango-client-3.0.1.tgz#10e54c6fe2ef196a4092af82e49c7cd8b25cccf6"
|
resolved "https://github.com/blockworks-foundation/mango-client-v3#06d0d92b5d15d319ef7db5320b8427851c7c4a03"
|
||||||
integrity sha512-iiMD6HoR7cOkrHBvorBP1DCNarusG/QO8JWYEkTUqfF4de7Gw/rWg1oyaQ+9gnDoMyGe61W9kTsTp4COEEKOFw==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
"@project-serum/serum" "^0.13.38"
|
"@project-serum/serum" "^0.13.45"
|
||||||
"@project-serum/sol-wallet-adapter" "^0.2.0"
|
"@project-serum/sol-wallet-adapter" "^0.2.0"
|
||||||
"@solana/spl-token" "^0.1.6"
|
"@solana/spl-token" "^0.1.6"
|
||||||
"@solana/web3.js" "^1.18.0"
|
"@solana/web3.js" "^1.18.0"
|
||||||
|
@ -120,7 +119,7 @@
|
||||||
bn.js "^5.1.2"
|
bn.js "^5.1.2"
|
||||||
buffer-layout "^1.2.0"
|
buffer-layout "^1.2.0"
|
||||||
|
|
||||||
"@project-serum/serum@^0.13.38":
|
"@project-serum/serum@^0.13.45":
|
||||||
version "0.13.54"
|
version "0.13.54"
|
||||||
resolved "https://registry.yarnpkg.com/@project-serum/serum/-/serum-0.13.54.tgz#f7a05ade7a044b87f693928c3a0cd01e82fe0484"
|
resolved "https://registry.yarnpkg.com/@project-serum/serum/-/serum-0.13.54.tgz#f7a05ade7a044b87f693928c3a0cd01e82fe0484"
|
||||||
integrity sha512-kYNAFcLbqhYocQ+cl3s+QZSroVOIrPiKo81fvdyrE/r2U2qshmULzMVDNpXqdrd3qdJUIZGroXMi1DHTaG2qjA==
|
integrity sha512-kYNAFcLbqhYocQ+cl3s+QZSroVOIrPiKo81fvdyrE/r2U2qshmULzMVDNpXqdrd3qdJUIZGroXMi1DHTaG2qjA==
|
||||||
|
@ -585,9 +584,9 @@ borsh@^0.4.0:
|
||||||
bs58 "^4.0.0"
|
bs58 "^4.0.0"
|
||||||
text-encoding-utf-8 "^1.0.2"
|
text-encoding-utf-8 "^1.0.2"
|
||||||
|
|
||||||
"borsh@git+https://github.com/defactojob/borsh-js.git#field-mapper":
|
"borsh@https://github.com/defactojob/borsh-js#field-mapper":
|
||||||
version "0.3.1"
|
version "0.3.1"
|
||||||
resolved "git+https://github.com/defactojob/borsh-js.git#33a0d24af281112c0a48efb3fa503f3212443de9"
|
resolved "https://github.com/defactojob/borsh-js#33a0d24af281112c0a48efb3fa503f3212443de9"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/bn.js" "^4.11.5"
|
"@types/bn.js" "^4.11.5"
|
||||||
bn.js "^5.0.0"
|
bn.js "^5.0.0"
|
||||||
|
|
Loading…
Reference in New Issue