Skip to content

Commit

Permalink
feat : add calculate blast chain and change logic
Browse files Browse the repository at this point in the history
  • Loading branch information
sundayalpaca committed May 2, 2024
1 parent 32c0a0b commit 68a8875
Show file tree
Hide file tree
Showing 4 changed files with 2,415 additions and 140 deletions.
68 changes: 42 additions & 26 deletions dexs/hmx/index.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { Adapter } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";
import { request, gql, GraphQLClient } from "graphql-request";
import { gql, GraphQLClient } from "graphql-request";
import type { ChainEndpoints } from "../../adapters/types";
import { Chain } from "@defillama/sdk/build/general";
import { HOUR, getTimestampAtStartOfHour } from "../../utils/date";

const endpoints = {
[CHAIN.ARBITRUM]: "https://subgraph.satsuma-prod.com/3a60064481e5/1lxclx3pz4zrusx6414nvj/arbitrum-one-stats/api",
[CHAIN.ARBITRUM]:
"https://subgraph.satsuma-prod.com/3a60064481e5/1lxclx3pz4zrusx6414nvj/arbitrum-one-stats/api",
[CHAIN.BLAST]:
"https://api.studio.thegraph.com/query/45963/blast-mainnet-stats/version/latest",
};

type MarketStat = {
Expand All @@ -17,7 +20,7 @@ type MarketStat = {
const graphs = (graphUrls: ChainEndpoints) => {
return (chain: Chain) => {
return async (timestamp: number) => {
if (chain === CHAIN.ARBITRUM) {
if (chain === CHAIN.ARBITRUM || chain === CHAIN.BLAST) {
// Get total trading volume
const totalTradingVolumeQuery = gql`
{
Expand All @@ -28,7 +31,7 @@ const graphs = (graphUrls: ChainEndpoints) => {
}
`;
const graphQLClient = new GraphQLClient(graphUrls[chain]);
graphQLClient.setHeader('origin', 'https://hmx.org')
graphQLClient.setHeader("origin", "https://hmx.org");
const totalMarketStats = (
await graphQLClient.request(totalTradingVolumeQuery)
).marketStats as Array<MarketStat>;
Expand All @@ -39,23 +42,31 @@ const graphs = (graphUrls: ChainEndpoints) => {
0 as number
) / 1e30;

// Get daily trading volume
const ids: Array<string> = [];
let latestHourIndex = Math.floor(
getTimestampAtStartOfHour(timestamp) / HOUR
);
for (let i = 0; i < 24; i++) {
for (const marketStat of totalMarketStats) {
ids.push(`"${latestHourIndex - i}_${marketStat.id}"`);
}
const chunkSize = 40;
const splitMarket: MarketStat[][] = [];
for (let i = 0; i < totalMarketStats.length; i += chunkSize) {
const chunk = totalMarketStats.slice(i, i + chunkSize);
splitMarket.push(chunk);
}
const filter = ids.join(",");
// first 2400 should covers 100 markets last 24 hours
// which virtually covers all markets
const last24hrVolumeQuery = gql`

let last24hrVolume = 0;
for (const markets of splitMarket) {
// Get daily trading volume
const ids: Array<string> = [];
let latestHourIndex = Math.floor(
getTimestampAtStartOfHour(timestamp) / HOUR
);
for (let i = 0; i < 24; i++) {
for (const marketStat of markets) {
ids.push(`"${latestHourIndex - i}_${marketStat.id}"`);
}
}

const filter = ids.join(",");

const last24hrVolumeQuery = gql`
{
marketHourlyStats(
first: 2400
where: {
id_in: [${filter}]
}
Expand All @@ -64,14 +75,15 @@ const graphs = (graphUrls: ChainEndpoints) => {
}
}
`;
const last24hrMarketStats = (
await graphQLClient.request(last24hrVolumeQuery)
).marketHourlyStats as Array<{ tradingVolume: string }>;
const last24hrVolume =
last24hrMarketStats.reduce(
(accum, t) => accum + parseInt(t.tradingVolume),
0 as number
) / 1e30;
const last24hrMarketStats = (
await graphQLClient.request(last24hrVolumeQuery)
).marketHourlyStats as Array<{ tradingVolume: string }>;
last24hrVolume +=
last24hrMarketStats.reduce(
(accum, t) => accum + parseInt(t.tradingVolume),
0 as number
) / 1e30;
}

return {
timestamp,
Expand All @@ -95,6 +107,10 @@ const adapter: Adapter = {
fetch: graphs(endpoints)(CHAIN.ARBITRUM),
start: 1687806000,
},
[CHAIN.BLAST]: {
fetch: graphs(endpoints)(CHAIN.BLAST),
start: 1707094598,
},
},
};

Expand Down
75 changes: 75 additions & 0 deletions fees/hmx.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { Adapter } from "../adapters/types";
import { CHAIN } from "../helpers/chains";
import { gql, GraphQLClient } from "graphql-request";
import type { ChainEndpoints } from "../adapters/types";
import { Chain } from "@defillama/sdk/build/general";
import { getTimestampAtStartOfDayUTC } from "../utils/date";

const endpoints = {
[CHAIN.ARBITRUM]:
"https://subgraph.satsuma-prod.com/3a60064481e5/1lxclx3pz4zrusx6414nvj/arbitrum-one-stats/api",
[CHAIN.BLAST]:
"https://api.studio.thegraph.com/query/45963/blast-mainnet-stats/version/latest",
};

const graphs = (graphUrls: ChainEndpoints) => {
return (chain: Chain) => {
return async (timestamp: number) => {
if (chain === CHAIN.ARBITRUM || chain === CHAIN.BLAST) {
const floorDayTimestamp = getTimestampAtStartOfDayUTC(timestamp);
const totalFeeQuery = gql`
{
globalFeesStat(id: "global") {
totalFeePaid
}
}
`;
const dailyFeeQuery = gql`
{
dailyFeesStat(id: "${floorDayTimestamp}") {
totalFeePaid
}
}
`;
const graphQLClient = new GraphQLClient(graphUrls[chain]);
graphQLClient.setHeader("origin", "https://hmx.org");
const totalFeeResp = await graphQLClient.request(totalFeeQuery);
const dailyFeeResp = await graphQLClient.request(dailyFeeQuery);

const finalizedDailyFee =
Number(dailyFeeResp.dailyFeesStat.totalFeePaid) / 1e30;
const finalizedTotalFee =
Number(totalFeeResp.globalFeesStat.totalFeePaid) / 1e30;

return {
timestamp,
dailyFees: finalizedDailyFee.toString(),
totalFees: finalizedTotalFee.toString(),
dailyHoldersRevenue: (finalizedDailyFee * 0.25).toString(),
dailySupplySideRevenue: (finalizedDailyFee * 0.75).toString(),
};
}

return {
timestamp,
dailyFees: "0",
totalFees: "0",
};
};
};
};

const adapter: Adapter = {
adapter: {
[CHAIN.ARBITRUM]: {
fetch: graphs(endpoints)(CHAIN.ARBITRUM),
start: 1687392000,
},
[CHAIN.BLAST]: {
fetch: graphs(endpoints)(CHAIN.BLAST),
start: 1707094598,
},
},
};

export default adapter;
114 changes: 0 additions & 114 deletions fees/perp88.ts

This file was deleted.

Loading

0 comments on commit 68a8875

Please sign in to comment.